Redis集群
数据分布
Redis采用哈希分区规则,常见的哈希分区规则如下:
1)节点取余分区:hash(key)%N = key虽在的节点
2)一致性哈希分区:
为系统的每个节点分配一个token,这些token组成一个hash环。数据读写执行节点查询操作是先 hash(key) 然后顺时针找到第一个大于改哈希值的token节点。
好处:加减节点只影响相邻节点
坏处:加减节点部分无法命中尤其在数据量小时影响比较大,需要增加一倍或减少一半节点才能保证数据和负载的均衡。
3)虚拟槽分区。
虚拟槽分区
Redis集群就是使用的这种虚拟槽分区,Redis集群的槽范围是0-16383(2的14次方=16384 )
- 解耦数据和节点的关系,简化扩容和收缩维度
- 节点自身维护槽的迎合关系
- 支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等场景
集群功能限制
- key批量操作支持有限
- key事物支持有限
- 不能将大的键值对象如hash、list等映射到不同的节点
- 不支持多数据库,只支持 db0
- 复制结构只支持一层,不支持树形复制结构
节点通信
Redis采用P2P的Gossip(留言)协议
Gossip协议原理:
节点间不断通信交换信息,一段时间后所有节点都会知道集群完整的信息。
集群伸缩
集群伸缩 = 槽和数据在节点之间的移动
请求路由
在集群模式下,Redis接收任何键相关命令首先计算键对应的槽,在根据槽找到对应的节点,如果节点是自身则执行命令,否则返回MOVED重定向错误,通知客户端请求正确的节点。
故障转移
Redis Cluster 可以为每个主节点设置若干个从节点,单主节点故障时,集群会自动将其中某个从节点提升为主节点。如果某个主节点没有从节点,那么当它发生故障时,集群将完全处于不可用状态。不过 Redis 也提供了一个参数cluster-require-full-coverage可以允许部分节点故障,其它节点还可以继续提供对外访问。…