标签:移除 复杂 fill width 要求 迁移 crc sentinal 热点
redis单机在大数据量情况的会出现瓶颈问题,通过redis 主从架构和 哨兵集群结合可以实现99.99% 高可用 、水平扩容支持更高QPS的解决方案。
在大数据量面前,主从架构结合哨兵集群的解决方案在复杂的配置下就显得有些捉襟见肘了;数据量越大,就愈明显。所以本章从海量数据出发,redis cluster 集群架构以更少的配置做更多的事。
支持水平扩容 N个redis master node,并且每个master node同样可以挂载 N 个 slave node
读写分离的架构(这个概念其实在redis cluster就没有了,但是可以做,因为redis cluster 更强调的是水平扩容)
高并发
高可用(无需sentinel 哨兵监控,如果master 挂了,redis cluster 内部自动 将slave 切换 master)
配置减少(相对 replication + sentinal 而已,就不需要手动搭建replication复制+主从架构+读写分离+哨兵集群+高可用了)
海量数据,redis cluster 集群(N master N slave , 海量数据 + 高并发+ 高可用)
redis cluster 会对数据进行自动分片,将数据分配到每个Master 上(自动的负载均衡)
redis cluster 所有节点直接都是相互连接的,它要求开放两个端口,一个端口负责对外数据交换(port:6379),另外一个端口用来内部通信(port : 6379 + 10000 = 16379),也就是集群总线的通信(cluster bus)
一致性hash 算法 一定程度上解决了node宕机后的大部分数据失效问题,但是也会导致node 的热点问题,降低性能,这个又该怎么解决呢? 可以通过增加虚拟节点的方式 让 hash 点散落更均匀 ,不光能解决热点问题,还可以达到自动的负载均衡效果。
redis cluster 拥有固定的16384个slot (槽) ;这个槽是虚拟的,并不是真正存在。slot 被 分布到 各个master 中,当 某个key 映射到 某个master 负责的槽时,就由对应的master 为key 提供服务
在redis cluster 中,只有master 才拥有对slot的所有权,slave 只负责使用 slot,并没有所有权。
每个Master节点都维护着一个位序列,为16384 / 8 字节;Master 节点 通过 bit 来标识哪些槽自己是否拥有。比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。
集群同时维护着槽与集群节点的映射关系,由16384个长度的数组记录,槽编号为数组的下标,数组内容为集群节点,这样就可以很快地通过槽编号找到负责这个槽的节点。
键空间分布基本算法
下面看下redis cluster 是通过什么样的方式进行 分片存储的
key 与 slot 的映射算法公式如下:
HASH_SLOT=CRC16(key) mod 16384
redis cluster 通过对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot,对于一批量数,如果想让批量数据都在同一个slot,可以通过hash tag来实现
redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot
hash slot 让 node 的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去
移动 hash slot 的成本是非常低的
标签:移除 复杂 fill width 要求 迁移 crc sentinal 热点
原文地址:https://www.cnblogs.com/qinyujie/p/9029153.html