Redis Cluster集群
一 集群模式概述
- Cluster模式是Redis3.0开始推出
- 采用无中心结构,每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接
- 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用
- 各个节点会互相通信,采用gossip协议交换节点元数据信息
- 数据分散存储到各个节点上
之前我们讲过哨兵模式,跟cluster有什么区别呢?
采用redis主从复制,每个节点持有全量数据,且数据保持一致,为系统Redis高可用。
每个节点主数据不同,是数据的子集,利用多台服务器构建集群提高超大规模数据处理能力,同时提供高可用支持。
二 cluster集群如何分散数据
Redis Cluster 集群采用Hash Slot(哈希槽)分配
Redis集群预分好16384个槽,初始化集群时平均规划给每一台Redis Master
存储过程:
- 数据来到redis,进行crc16计算出一个数字
- 根据数字对16384进行取模,分配到对应的区域
读取过程:
- 读取的key来到redis,同样进行crc16计算一个数字
- 根据数字对16384进行取模,到对应区域取值
注意:为什么是16384?
在Redis 集群中槽分配的元数据会不间断的在Redis集群中分发,以保证所有节点都知晓槽的分配情况
16384=16k,在发送心跳包时使用char进行bitmap压缩后是2k(2 * 8 (8 bit) * 1024(1k) = 16K)
通常我们不会部署超过10000个Redis主节点,因此16384就够用了
三 集群构建
- 创建redis-cluster.conf配置文件:
上述只是跟集群相关的配置,写好之后将该配置应用到每一个redis实例里边,然后在任意节点执行以下命令:
最后一行的配置意思是一主带一从,所以会默认将前三个节点当主节点,后三个当从节点。
执行结果如下:
可以看到102被分配到了0-5460等。
我们来看一下存储的过程:
a存入的时候: 计算其值是15495,属于104,所以存储到104节点的服务器。
- 我们模拟故障转移
如果我们设置的timeout是20s,如果20s到了都没有通信成功:
- 确定102节点已经挂了,设置fail
- 将111变为新的主
- 通过gossvip协议告知其他节点,111已经是新的主了
- 102在恢复后,将会以从的身份执行任务(永久降级)
提问:如果某个主从一起挂掉?
当某个节点的主从一起挂掉了,那么集群将进入fail状态,拒绝任何请求,所以生产中我们建议资源足够的情况,一个主最好挂载两个从。