redis的集群模式

介绍

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
2
3
Redis 集群的一个重要的配置选项
cluster-node-timeout
cluster-slave-validity-factor

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设计与实现(第二版)》

------本文结束感谢阅读------
显示评论
0%