介绍
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集
Redis 集群方案: Codis、Cluster(去中心化)
cluster 集群
- 自动分割数据到不同的节点上
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
- 不支持处理多个keys的命令,因为这需要在不同的节点间移动数据
- 在执行故障转移期间, 集群可能会丢失写命令。
如图所示,该集群有三个 Redis 节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据多少可能不一样。这三个节点相互连接组成一个对等的集群,它们之间通过一种特殊的二进制协议相互交互集群信息。
槽位定位算法
Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
Cluster 还允许用户强制某个 key 挂在特定槽位上
这种设计对增删节点友好,不会停止服务。
增加节点时:将部分节点数据移动到新加的节点;
删除节点时:将需要删除的节点数据移动到其他节点上。
容错
Redis Cluster 可以为每个主节点设置若干个从节点,单主节点故障时,集群会自动将其中某个从节点提升为主节点。如果某个主节点没有从节点,那么当它发生故障时,集群将完全处于不可用状态。不过 Redis 也提供了一个参数cluster-require-full-coverage可以允许部分节点故障,其它节点还可以继续提供对外访问。
Redis 一致性保证
Redis 并不能保证数据的强一致性:
1.集群使用了异步复制
2.集群出现了网络抖动
1 | Redis 集群的一个重要的配置选项 |
cluster-node-timeout,表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频繁切换 (数据的重新复制)。
cluster-slave-validity-factor作为倍乘系数来放大这个超时时间来宽松容错的紧急程度。如果这个系数为零,那么主从切换是不会抗拒网络抖动的。如果这个系数大于 1,它就成了主从切换的松弛系数
可能下线与确定下线
因为 Redis Cluster 是去中心化的,一个节点认为某个节点失联了并不代表所有的节点都认为它失联了。所以集群还得经过一次协商的过程,只有当大多数节点都认定了某个节点失联了,集群才认为该节点需要进行主从切换来容错。
Redis 集群节点采用 Gossip协议来广播自己的状态以及自己对整个集群认知的改变
参考:https://redis.cn/topics/sentinel.html
https://redis.cn/topics/cluster-spec.html
《redis设计与实现(第二版)》