【学习笔记】Redis学习笔记——第17章 集群
第17章 集群
17.1 节点
使用cluster meet命令将其他节点添加到当前节点集群中
17.1.1 启动节点
通过cluster-enabled设置来决定是否启用集群
17.1.2 集群数据结构
每个节点都保存了自己及其他节点的IP端口号等信息
17.1.3 cluster meet命令的实现
是收到命令的节点和新节点握手建立连接,并传播这个节点给其他集群节点握手认识
17.2 槽指派
整个数据库为16384个槽(即常说的桶),每个节点处理0-16384个槽,当有槽未被指派时,整个集群处于下线状态
17.2.1 记录节点的槽指派信息
一个二进制的数组,如果相对位置上值为1,则代表需要处理该槽
17.2.2 传播节点的槽指派信息
节点会将自己处理的槽信息发给其他节点
17.2.3 记录集群所有槽的指派信息
每一个节点都记录了每个槽是由哪个节点来处理
17.2.4 Cluster addslot命令的实现
1>检查指派的槽是否是未指派状态
2>分配并记录在clusterNode中
17.3 在集群中执行命令
17.3.1 计算键属于哪个槽
通过Key计算出一个0-16383的值来决定键属于哪个槽
17.3.2 判断槽是否由当前节点负责处理
查看键的槽计算值是否有自己处理,否则的话引导向负责该槽处理的节点
17.3.3 Moved错误
如果访问的节点不负责处理这个槽,会返回Moved错误引导客户端访问正确的节点,在集群模式下的客户端会屏蔽掉这个错误
17.3.4 节点数据库的实现
与单机相比差别不大,键与槽的关系使用跳表保存
17.4 重新分片
1>通知源节点与目标节点
2>将源节点数据分批复制到目标节点
17.5 ASK错误
在重新分片期间,被重分配的槽同时由源节点与目标节点操作,取决于键的被转移情况。(PS:所以此时会出现两个节点同时处理一个槽的状况)
17.5.1 Cluster Setslot importing 命令的实现
使用一个数组来记录正在被导入的槽
17.5.2 Cluster Setslot mingrating命令的实现
使用一个数组来记录正在被迁移的槽
17.5.3 ASK错误
如果键属于当前节点负责处理的槽,但没有找到,会到正在被迁移的槽中寻找,并返回给客户端ASK错误并返回该键被迁移到的节点(与Moved错误相似)
17.5.4 ASKING命令
使用该命令可以让节点破例操作正在被导入的槽中的键
17.5.5 ASK与Moved错误的区别
主要可以理解为中间态与稳定态的区别
17.6 复制与故障转移
从节点接替主节点负责的槽继续进行工作
17.7 消息
redis通过发送与接收消息来进行通信,消息有其自己的格式