《Redis设计与实现》夯实之路十三 第十七章 集群

《Redis设计与实现》学习笔记(十三) 第十七章 集群




一. 节点

  • 组建集群:向一个节点发送CLUSTER MEET <ip> <port>,可以让这个节点与指定节点进行握手
  • 启动节点

    Cluster-enabled?1->成为集群节点,0->成为单机节点

  • 集群数据结构
    1. ClusterNode结构保存了一个节点的当前状态
    2. 其中的clusterLink保存了连接该节点的所需信息
  • CLUSTER MEET命令的实现:将新加入的节点信息存储在自己的clusterState.Nodes字典里,再通过广播传送给集群的所有节点

二. 槽指派

  • 集群的整个数据库被分为16384个槽slot,当所有槽都被分配时,集群处于上线状态,不然处于下线状态
  • clusterState中的slots数组记录了所有槽的委派信息,而clusterNode中的slot数组只记录当前节点的槽委派信息

三. 在集群中执行命令

  • 当客户端发送与数据库键有关的命令时,接收命令的节点需要
    1. 检查键所在的槽是否属于自己,如果属于就执行命令
    2. 如果不属于则返回MOVED错误,指引客户端跳转至正确的节点
    3. MOVED错误格式:MOVED
  • 节点数据库的实现

    使用slots_to_keys跳跃表来保存槽与键的关系

四. 重新分片Resharding

  • 将槽重新指派给另一个节点,包括其中的键值对
  • 可以不需要下线,在线完成

五. ASK错误

  • 重新分片时期,槽里的一部分键值对保存在源节点另一部分保存在目标节点
  • 当客户端发出命令查找的键值对就在这个槽时,如果在源节点里,源节点直接返回
  • 如果在目标节点,则返回一个ASK错误,指引客户端转到目标节点查找key
  • ASK错误和MOVED错误的区别:
    • MOVED错误代表槽的负责权已经转移到另一个节点了,以后每次都会去那个节点
    • ASK错误只是临时的补救,槽的负责权并没有完全转移,今后客户端访问同一个槽还是会来这个节点

六. 复制与故障转移

  • 主节点用来处理槽,从节点用来准备复制主节点
  • 故障检测:集群中的节点会定期PING其他节点,如果没有收到PONG则会标记为疑似下线
  • 故障转移
    1. 选择一个从节点执行slaveof no one, 这个新主节点会撤销下线节点的槽指派,并占为己有
    2. 给集群里的其他节点发送一条PONG,其他节点就会知道这是新的主节点
  • 主节点选举
    1. 集群的配置纪元遇到故障转移会+1
    2. 每个处理槽的主节点有投票权,根据先到先得,第一个要票的从节点会得到主节点的票
    3. 得票大于半数的从节点可以成为新的主节点
    4. 如果没选举出来,进入新的配置纪元

七. 消息

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值