简介
Redis Cluster 是 Redis 集群化方案。
为什么使用 Redis Cluster:
- 主从复制架构中是读写分离,可以通过增加从节点扩展读并发,但是写能力与存储是不能横向扩展的,就只能是 master 节点的承载上线。
- 需要大量缓存数据时需要引入 Redis Cluster
Redis Cluster 是什么:
- 简单来讲是 多个主从架构组合在一起对外服务、
- Redis Cluster 至少需要 3 个 master 才能组成一个集群,每个 master 至少一个 slave。
虽然每个 master 都有 slave 节点,但是读写请求都是在 master 上完成的,slave 节点只用做备份,当 master 宕机时,slave 成为 master。
槽位定位
Redis Cluster 将所有数据划分为 16384 个槽位,每个节点负责一部分槽位,槽位信息存储于每个节点中。
- 客户端连接集群时,会得到一份集群的槽位配置信息并缓存,这样定位某个 key 时,可以直接定位到目标点。
- Redis Cluster 每个节点会将集群的配置信息持久化到配置文件中,所以必须确保配置文件可写,尽量不人工修改配置文件。
Redis Cluster 默认对 key 使用类一致性哈希算法 crc16 实现节点选择,
hash 得到的整数值对 16384 进行取模得到具体槽位。
-MOVED指令纠正客户端槽位信息
由于节点的变动,可能会存在客户端与服务器存储槽位信息不一致的情况,
此时接收到错误请求的节点 发现 key 所在的槽位与自己的槽位不一致,就会响应 -MOVED 指令,
客户端接收到 -MOVED 指令后会纠正本地的槽位映射表。
容错
Redis Cluster 可以为每个主节点设置若干从节点,主节点故障,自动提升某个从节点为主节点,
如果某个主节点没有从节点,当它故障时,整个集群处于不可用状态,
可以通过参数 cluster-require-full-coverage 允许部分节点故障,其他节点还可以继续提供服务。
网络抖动
网络抖动就是突然部分连接不可访问,然后很快恢复正常,不能因此就认为服务故障,这样会导致主从频繁切换,
可以通过 cluster-node-timeout 设置持续失联 timeout 时间后才认为节点故障。
cluster-slave-validity-factor 作为倍乘系数放大这个超时时间,来宽松容错的紧急程度。
可能下线(PFail)与确定下线(Fail)
Redis Cluster 是去中心化的,节点 A认为节点B失联了(PFail),
A 会将这条信息向整个集群广播,其他节点就收到了B 的失联信息,
如果某个节点收到 B 失联的信息数量超过了集群节点的一半,就标记 B 为确定下线(Fail)
然后向整个集群广播 B 确定下线,并立即对 B 进行主从切换。