Redis Cluster
Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好的负载均衡的目的。
Redis Cluster 集群节点最小配置 6 个节点以上(3 主 3 从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
Redis Cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 0~16383 个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。
优缺点
优点
- 无中心架构;
- 数据按照
slot
存储分布在多个节点,节点间数据共享,可动态调整数据分布; - 可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除;
- 高可用性:部分节点不可用时,集群仍可用。通过增加
Slave
做standby
数据副本,能够实现故障自动failover
,节点之间通过gossip
协议交换状态信息,用投票机制完成Slave
到Master
的角色提升; - 降低运维成本,提高系统的扩展性和可用性。
缺点
Client
实现复杂,驱动要求实现Smart Client
,缓存slots mapping
信息并及时更新,提高了开发难度,客户端的不成熟影响业务的稳定性。目前仅JedisCluster
相对成熟,异常处理部分还不完善,比如常见的“max redirect exception”
。- 节点会因为某些原因发生阻塞(阻塞时间大于
clutser-node-timeout
),被判断下线,这种failover
是没有必要的。 - 数据通过异步复制,不保证数据的强一致性。
- 多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况。
Slave
在集群中充当“冷备”,不能缓解读压力,当然可以通过SDK
的合理设计来提高Slave
资源的利用率。Key
批量操作限制,如使用mset
、mget
目前只支持具有相同slot
值的Key
执行批量操作。对于映射为不同slot
值的Key
由于Keys
不支持跨slot
查询,所以执行mset
、mget
、sunion
等操作支持不友好。Key
事务操作支持有限,只支持多key
在同一节点上的事务操作,当多个Key
分布于不同的节点上时无法使用事务功能。Key
作为数据分区的最小粒度,不能将一个很大的键值对象如hash
、list
等映射到不同的节点。- 不支持多数据库空间,单机下的
redis
可以支持到 16 个数据库,集群模式下只能使用 1 个数据库空间,即 db 0。 - 复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构。
- 避免产生
hot-key
,导致主库节点成为系统的短板。 - 避免产生
big-key
,导致网卡撑爆、慢查询等。 - 重试时间应该大于
cluster-node-time
时间。 Redis Cluster
不建议使用pipeline
和multi-keys
操作,减少max redirect
产生的场景
参考资料
https://www.jianshu.com/p/5de2ab291696
https://blog.51cto.com/u_13294304/3360074