redis(五)Redis-Cluster主要部件
概述
文章将会总体介绍Redis Cluster的集群模式,介绍之前我们先来看一下 Redis-Sentinel 和 master-slave 和 Redis Cluster 的关系。Redis Cluster 可以是Redis集群的一种方式,可以认为是分片集群,而 master-slave 则是主从集群。 上面说到redis-cluster 是分片集群,简易图可以将下图。
使用redis-cluster可以得到以下的收益 :
- 对数据自动分片到多个节点
- 继续运行当一部分节点出错的时候,或是当不能与剩下的 cluster 通信的时候。
重要组件
Redis Cluster 数据分片
没有使用一致性hash来分片数据,而是使用一个叫 “hash slot”的东西,那样不同的键值对将会分配到不同的node中去,首先用key得到 hash_slot ,然后根据hash_slot 得到数据存放的节点,例如 :
- Node A 包括 0 到 5500 的 slot 范围
- Node B 包括 5501 到 11000 的 slot 范围 有个 key p, p的 hash_slot 为 400,那么就应该去 Node A 查找,假如我希望两个键值对分配到同一个node 中去可以使用 hash_tags来标识,分配到同一个node 可以进行事务处理,一些原子性操作。
hash_slot 的计算公式为 :
HASH_SLOT = CRC16(key) mod 16384
Redis Cluster TCP 端口
Redis Cluster 节点需要开放两个端口,高位端口号 = 低位端口号 + 10000 ;例如,Node A 的第端口号为 6379 ,高的就为 16379
- 低位端口号: command port , 处理来自客户端的命令请求
- 高位端口号: 用于 cluster bus ,用于 node 节点之间的协议,cluster bus 用来异常发现,配置更新,异常重启和认证等。
Redis Cluster master-slave model
可以看到开头的那种图,p1包含2个 slave,它们都拥有和 master 一样的数据,而 master -slave 之间的数据复制使用的是异步复制,于是也就造成了Redis Cluster is not able to guarantee strong consistency (Redis Cluster 并不能保证前一致性)
Redis Cluster 一致性保证
假如A1,B1,C1是A,B,C的分片从节点,而Z1是客户端,节点脑裂发生,A,A1,B1,C1,C 在一边,而 B 和 Z1 在另外一边,此时,假如是短时间内恢复了没有影响,长时间,使得 B1 成为了新的 master ,那么Z1 对 B 的写入将丢失。 Z1中的 maximum window 是保存 Z1将要发送给 B 的数量,当 B1 成为 master 时,在另外一边的 B 相关的节点停止接受写入,这也是redis cluster 不能保证强一致性的地方,它有可能会导致写丢失。
总结
文章总结了 redis cluster 的几个重要组件,让我们清晰地有个认识,在后面的文章我们会详细地介绍实现的细节。
参考资料
官网文档
- https://redis.io/topics/partitioning
- https://redis.io/topics/cluster-spec
- https://redis.io/topics/cluster-tutorial (本文参考这一篇) 搭建参考
- https://www.cnblogs.com/renpingsheng/p/9833740.html(redis-cluster集群搭建参考)
- https://www.cnblogs.com/renpingsheng/p/9862485.html (redis-cluster知识要点)