Redis Cluster (Redis集群)
Redis Cluster是Redis的分布式实现。 当我们传输数据到 Redis Cluster,数据会自动分片,存储到各个Redis节点上。
Redis Cluster相对于单点Redis,可以在一些节点出现故障或无法通信时继续运行。但是,如果服务器出现较大故障(例如,超过一半以上的服务器不可用),群集将停止运行。
Redis Cluster TCP端口
每个Redis群集节点都需要打开两个TCP连接。 一是用于服务客户端的常规TCP端口,默认为6379。 第二个端口用于群集总线,默认设置16379,二进制协议的节点到节点通信通道。节点利用群集总线用于故障检测,配置更新,故障转移授权等。
- 客户端永远不要尝试与群集总线端口进行通信,而应始终与普通的Redis命令端口进行通信,但是请确保同时打开防火墙中的两个端口,否则Redis群集节点将无法进行通信。命令端口和集群总线端口的偏移量是固定的,并且始终为10000。
- 如果没有同时打开两个TCP端口,则群集将无法正常工作。
- 集群总线使用不同的二进制协议进行节点到节点的数据交换,它更适合于用很少的带宽和处理时间在节点之间交换信息。
Redis Cluster数据分片
Redis Cluster不使用一致性哈希,而是使用一种叫哈希槽hash_slot的东西。
Redis群集中有16384个哈希槽,当我们在Redis中存储一对Key-Value时,要计算给定Key的哈希槽。方法是先计算Key的CRC16,然后对计算出的结果取模16384:
hash_slot = CRC16(key) mod 16384
Redis集群中的每个Redis节点都负责哈希槽的子集,因此,如果有一个包含3个节点的群集,其中:
- 节点A包含从0到5500的哈希槽。
- 节点B包含从5501到11000的哈希槽。
- 节点C包含从11001到16383的哈希槽。
这样可以轻松添加和删除集群中的节点。例如,如果我想添加一个新节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从群集中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。
因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加或删除或者更改节点持有的哈希槽的占比不需要任何停机时间。

被折叠的 条评论
为什么被折叠?



