第九章 集群

第九章 集群

  Redis集群通过分片(sharding)来进行数据共享,并提供复制故障转移功能

  1. 节点

  节点通过三次握手将其他节点添加到自己所处的集群当中。

  每个节点clusterNode都保存着一个clusterState结构,这个结构记录了在当前节点的视角下,集群目前所处的状态。

  

  2. 槽指派

  Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽,数据库中的每个键都属于这16384个槽的其中一个。

  clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽。

  slots属性是一个二进制位数组,slots数组在索引i上的二进制位的值为1,则节点负责处理槽i。

  clusterState结构中的slots数组记录了集群中所有16384个槽的指派信息:  

  

  slots数组包含16384个项,每个数组项指向一个clusterNode结构的指针

  3. 在集群中执行命令

  

  3.1 计算键属于哪个槽

  slot_number(key): CRC16(key) & 16383 计算键的CRC-16校验和,然后与16383取与。

  3.2 判断槽是否由当前节点负责

  当节点计算出键所属的槽i之后,节点就会检查自己在clusterState.slots数组数组中的项i,判断键所在的槽是否有自己负责,如果不是,向客户端返回MOVED错误,指引客户端转向至正在处理槽i的节点。

  3.3 节点数据库的实现

  集群节点保存键值对以及键值对过期时间的方式与单机Redis服务器保存方式完全相同。

  另外,除了将键值对保存在数据库里面之外,节点还会用clusterState结构中的slot_to_keys跳跃表来保存槽和键之间的关系

  

  slot_to_keys跳跃表每个节点的分值(跳跃表中允许存在相同分值)都是一个槽号,而每个节点的成员都是一个数据库键。

  4. 重新分片

  Redis集群的重新分片操作可以将任意数量已经指派给某个节点的槽改为指派给另一个节点,并且相关槽所属的键值对也会从源节点被移动到目标节点。

  

  5. ASK错误

  在执行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点里面。

  

  接到ASK错误的客户端会根据错误提供的IP地址和端口号,转向正在导入槽的目标节点,然后先向目标节点发送一个ASKING命令,之后再重新发送原本想要执行的命令。

  一般情况下,如果客户端发送一个关于槽i的命令,而槽i又没有指派给这个节点的话,那么节点将向客户端返回一个MOVED错误;但是,如果,节点的clusterState.importing_slots_from[i]显示节点正在导入槽i,并且发送命令的客户端带有REDIS_ASKING标识,那么节点将执行关于槽i的命令一次。

  

  6. 复制与故障转移

  集群中的从节点用于复制主节点,并在主节点下线时,代替主节点继续处理命令请求。

  集群中的每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接收PING消息的节点没有在规定的时间内,向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接收PING消息的节点标记为疑似下线(possible fail,PFAIL)。如果在一个集群里面,半数以上负责处理槽的主节点都将某个主节点标记为疑似下线,那么这个主节点将被标记为已下线(FAIL)。

  故障转移的步骤如下:

  1) 复制下线主节点的所有从节点里面,会有一个从节点被选中

  2) 被选中的从节点会执行SLAVEOF no one命令,成为新的主节点

  3) 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部派给自己

  4) 新的主节点向集群广播一条PONG消息,这条PONG消息可以让集群中的其他节点立即知道这个节点已经由从节点变成了主节点,并且这个主节点已经接管了原本由已下线节点负责处理的槽

  5) 新的主节点开始接收和自己负责处理的槽有关的命令请求

  集群中的节点通过发送和接收消息来进行通信,常见的消息包括MEET、PING、PONG、PUBLISH、FAIL五种。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部