集群(proxy型)
特点:多种hash算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins。支持失败节点自动删除。后端Sharding分片逻辑对业务透明,业务方的读写方式和操作单个Redis一致。
缺点:增加了新的proxy,需要维护其高可用。failover逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预。
集群(直连型)
特点:
1、无中心架构(不存在哪个节点影响性能瓶颈),少了proxy层。
2、数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布。
3、可扩展性,可线性扩展到1000个节点,节点可动态添加或删除。
4、高可用性,部分节点不可用时,集群仍可用。通过增加Slave做备份数据副本
5、实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升。
缺点:
1、资源隔离性较差,容易出现相互影响的情况。
2、数据通过异步复制,不保证数据的强一致性。
集群的选择
redis cluster:
1、不好做读写分离,读写请求全部落到主实例上的,如果要扩展写QPS,或者是扩展读QPS,都是需要扩展主实例的数量,从实例就是一个用做热备+高可用。
2、不好跟nginx+lua直接整合,lua->redis的client api,但是不太支持redis cluster,中间就要走一个中转的java服务。
3、不好做树状集群结构,比如redis主集群一主三从双机房架构,redis cluster不太好做成那种树状结构。
4、方便,相当于是上下线节点,集群扩容,运维工作,高可用自动切换,比较方便。
twemproxy+redis:
1、上线下线节点,有一些手工维护集群的成本。
2、支持redis集群+读写分离,就是最基本的多个redis主实例,twemproxy这个中间件来决定的,java/nginx+lua客户端,是连接twemproxy中间件的。每个redis主实例就挂载了多个redis从实例,高可用->哨兵,redis cluster读写都要落到主实例的限制,你自己可以决定写主,读从,等等。
3、支持redis cli协议,可以直接跟nginx+lua整合。
4、可以搭建树状集群结构。