相关阅读
简介
Redis集群是一个由多个主从节点群组成的分布式服务器群,具有复制、高可用和分片特性;这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点);集群中至少有三个主从节点群,因为从节点上升为主节点需要满足超过半数的其它主节点投票选择的条件;
命令
集群操作相关命令如下:
# 创建集群
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:8000 127.0.0.1:8001 ...
# 通过127.0.0.1:8000节点连接集群,-c 表示集群
redis-cli -c -h 127.0.0.1 -p 8000
# 查看集群信息
cluster info
# 查看节点列表
cluster nodes
# 新增节点
redis-cli --cluster add-node 127.0.0.1:8002 127.0.0.1:8000
# 为新节点分配槽位
# redis-cli --cluster reshard 127.0.0.1:8000
# 配置节点为某节点的从节点
# 先登陆该节点
# cluster replicate nodeId
# 删除节点
redis-cli --cluster del-node 127.0.0.1:8000 nodeId
# 关闭集群需要逐个关闭节点,-c 表示集群
redis-cli -c -h 127.0.0.1 -p 8000 shutdown
原理
Redis Cluster将所有数据划分为16384个slots(槽位),每个节点负责其中一部分槽位;槽位的信息存储于每个节点中;当Redis Cluster的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地,这样当客户端要查找某个Key时,可以直接定位到目标节点;同时因为槽位的真实信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的调整。
槽位定位算法
Cluster默认会对Key值使用crc16
算法得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位号,算法为:HASH_SLOT = CRC16(key) mod 16384
;
跳转重定位
当客户端向集群中某个节点发出了指令,但该节点发现指定Key所在的槽位并不归其管理,这时它会向客户端发送一个特殊的跳转指令携带正确的节点地址,告诉客户端去这个节点上执行操作;客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新本地的槽位映射表缓存,后续所有Key将使用新的槽位映射表。
网络抖动
真实世界的机房网络往往并不是风平浪静的,它们经常会发生各种各样的小问题,比如网络抖动就是非常常见的一种现象,突然之间部分连接变得不可访问,然后很快又恢复正常;
为解决这种问题,Redis Cluster提供了配置项cluster-node-timeout
,表示当某个节点持续失联时间超过该值时,才可以认定该节点出现故障,需要进行主从切换;如果没有这个选项,网络抖动会导致主从频繁切换(数据的重新复制)。
选举
当从节点发现主节点状态变为FAIL
时,便尝试进行Failover
,以成为新的主节点;由于挂掉的主节点可能会有多个从节点,从而存在多个从节点竞争成为主节点的情况,其过程如下:
- 从节点发现主节点状态变为
FAIL
; - 从节点将记录的集群
currentEpoch
加1,并广播FAILOVER_AUTH_REQUEST
消息; - 集群中其它节点收到该信息,但只有主节点响应,判断请求者的合法性,并发送
FAILOVER_AUTH_ACK
,对每一轮epoch
只发送一次;一般是收到的第一个; - 尝试
Failover
的从节点收集主节点响应的FAILOVER_AUTH_ACK
,若超过半数后则变成新主节点; - 广播
Pong
通知集群中其它节点;
从节点并不是在主节点一进入FAIL
状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保主节点的FAIL
状态在集群中传播;从节点如果立即尝试选举,其它主节点或许尚未意识到该主节点的FAIL
状态,那么会拒绝投票;
延迟计算公式如下:
DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
SLAVE_RANK
表示此从节点已经从主节点复制数据的总量的rank
,rank
越小代表已复制的数据越新;这种方式下,持有最新数据的从节点将会首先发起选举(理论上)。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/4766.html