《Redis设计与实现》学习笔记(十三) 第十七章 集群
一. 节点
- 组建集群:向一个节点发送
CLUSTER MEET <ip> <port>
,可以让这个节点与指定节点进行握手
- 启动节点
Cluster-enabled?1->成为集群节点,0->成为单机节点
- 集群数据结构
ClusterNode
结构保存了一个节点的当前状态- 其中的
clusterLink
保存了连接该节点的所需信息
- CLUSTER MEET命令的实现:将新加入的节点信息存储在自己的
clusterState.Nodes字典
里,再通过广播传送给集群的所有节点
二. 槽指派
- 集群的整个数据库被分为16384个槽slot,当所有槽都被分配时,集群处于上线状态,不然处于下线状态
clusterState
中的slots数组记录了所有槽的委派信息,而clusterNode
中的slot数组只记录当前节点的槽委派信息
三. 在集群中执行命令
- 当客户端发送与数据库键有关的命令时,接收命令的节点需要
- 检查键所在的槽是否属于自己,如果属于就执行命令
- 如果不属于则返回
MOVED
错误,指引客户端跳转
至正确的节点 - MOVED错误格式:MOVED
- 节点数据库的实现
使用
slots_to_keys跳跃表
来保存槽与键的关系
四. 重新分片Resharding
- 将槽重新指派给另一个节点,包括其中的键值对
- 可以
不需要下线
,在线完成
五. ASK错误
- 重新分片时期,槽里的
一部分
键值对保存在源节点
,另一部分
保存在目标节点
- 当客户端发出命令查找的键值对就在这个槽时,如果在源节点里,源节点直接返回
- 如果在目标节点,则返回一个
ASK错误
,指引客户端转到目标节点查找key - ASK错误和MOVED错误的区别:
- MOVED错误代表
槽的负责权
已经转移到另一个节点了,以后每次都会去那个节点 - ASK错误只是
临时的补救
,槽的负责权并没有完全转移,今后客户端访问同一个槽还是会来这个节点
- MOVED错误代表
六. 复制与故障转移
- 主节点用来处理槽,从节点用来准备复制主节点
故障检测
:集群中的节点会定期PING其他节点,如果没有收到PONG则会标记为疑似下线故障转移
:- 选择一个从节点执行slaveof no one, 这个新主节点会
撤销下线节点的槽指派
,并占为己有。 - 给集群里的其他节点发送一条PONG,其他节点就会知道这是新的主节点
- 选择一个从节点执行slaveof no one, 这个新主节点会
主节点选举
:- 集群的配置纪元遇到故障转移会+1
- 每个处理槽的主节点有投票权,根据先到先得,第一个要票的从节点会得到主节点的票
- 得票大于半数的从节点可以成为新的主节点
- 如果没选举出来,进入新的配置纪元