美文网首页
Redis Cluster 集群伸缩

Redis Cluster 集群伸缩

作者: 薛之谦chj | 来源:发表于2020-04-29 16:23 被阅读0次

    集群伸缩

    伸缩原理

    Redis集群提供了灵活的节点扩和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。其原理可抽象为槽和对应数据在不同节点之间灵活移动。

    将6385作为一个master节点加入进来。其实就是启动6385节点,然后meet,此时还没有被分配槽slot,尚无法工作,需要进行slot迁移(现有可用节点的slot迁移到新节点6385),这会伴随着一些key-value的迁移,即槽和数据在节点间移动。

    扩展集群

    集群伸缩——作用:

    为他迁移槽和数据实现扩容

    作为从节点负责故障转移

    准备新节点

    配置文件是集群模式

    配置和其它节点统一

    启动后是孤儿节点

    redis-server conf/redis-6385.conf

    redis-server conf/redis-6386.conf

    孤儿节点

    加入集群

    redis-trib.rb add-node new_host:new_port existing _host:existing_port --slave -- master-id <arg>

    redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379

    建议使用redis-trib.rb 能够避免新节点已经加入了其他集群,造成故障。

    加入集群后

    迁移槽和数据

    槽迁移计划

    需要平均槽数量

    迁移数据

    1.对目标节点发送:cluster setslot {slot} importing {sourceNodeId}命令,让目标节点准备导入槽的数据

    2.对源节点发送:cluster setslot {slot} migrating {targetnodeId}命令,让源节点准备迁出槽的数据

    3.源节点循环执行cluster getkeysinslot{slot} {count}命令,每次获取count个属于槽的键

    4.在源节点上执行migrate {targetIp} {targetPort} key 0 {timeout} 命令把指定key迁移

    5.重复执行步骤3~4直到槽下所有的键数据迁移到目标节点

    6.向集群内所有主节点发送cluster setslot{slot} node {targetNodeId}命令,通知槽分配给目标节点

    迁移数据流程图


    迁移数据伪代码


    批量迁移数据


    3.2.8之后这个bug修复了


    集群缩容 ——收缩集群

    收缩集群步骤:

    下线迁移槽

    忘记节点

    关闭节点

    流程图:

    收缩集群

    下线迁移槽:均匀的迁移槽数据

    迁移槽

    忘记节点

    redis-cli>cluster forget {downNodeId}

    redis-trib.rb 里有个命令可以帮助我们忘记节点 del-node

    redis-trib.rb del-node 127.0.0.1:7000 {sourcerunid}

    所有节点都需执行forget操作,否则60秒后重新扩散


    客户端路由

    moved重定向

    ask重定向

    smart客户端

    具体参考https://www.jianshu.com/p/43190e47eabc



    Cluster故障转移

    故障发现

    节点间通过ping / pong 消息实现故障发现:不需要sentinel。ping / pong 不仅传播节点槽的信息(参见前面章节),亦可以传播主从状态,节点故障,

    具体参考:https://www.jianshu.com/p/8e4bdeb4ee83


    Cluster开发运维常见问题

    慕课网学习总结:

    具体参考https://www.jianshu.com/p/28cfba7a57df

    伸缩原理

    Redis集群提供了灵活的节点扩和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。其原理可抽象为槽和对应数据在不同节点之间灵活移动。

    将6385作为一个master节点加入进来。其实就是启动6385节点,然后meet,此时还没有被分配槽slot,尚无法工作,需要进行slot迁移(现有可用节点的slot迁移到新节点6385),这会伴随着一些key-value的迁移,即槽和数据在节点间移动。

    扩展集群

    集群伸缩——作用:

    为他迁移槽和数据实现扩容

    作为从节点负责故障转移

    准备新节点

    配置文件是集群模式

    配置和其它节点统一

    启动后是孤儿节点

    redis-server conf/redis-6385.conf

    redis-server conf/redis-6386.conf

    孤儿节点

    加入集群

    redis-trib.rb add-node new_host:new_port existing _host:existing_port --slave -- master-id <arg>

    redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379

    建议使用redis-trib.rb 能够避免新节点已经加入了其他集群,造成故障。

    加入集群后

    迁移槽和数据

    槽迁移计划

    需要平均槽数量

    迁移数据

    1.对目标节点发送:cluster setslot {slot} importing {sourceNodeId}命令,让目标节点准备导入槽的数据

    2.对源节点发送:cluster setslot {slot} migrating {targetnodeId}命令,让源节点准备迁出槽的数据

    3.源节点循环执行cluster getkeysinslot{slot} {count}命令,每次获取count个属于槽的键

    4.在源节点上执行migrate {targetIp} {targetPort} key 0 {timeout} 命令把指定key迁移

    5.重复执行步骤3~4直到槽下所有的键数据迁移到目标节点

    6.向集群内所有主节点发送cluster setslot{slot} node {targetNodeId}命令,通知槽分配给目标节点

    迁移数据流程图


    迁移数据伪代码


    批量迁移数据


    3.2.8之后这个bug修复了


    集群缩容 ——收缩集群

    收缩集群步骤:

    下线迁移槽

    忘记节点

    关闭节点

    流程图:

    收缩集群

    下线迁移槽:均匀的迁移槽数据

    迁移槽

    忘记节点

    redis-cli>cluster forget {downNodeId}

    redis-trib.rb 里有个命令可以帮助我们忘记节点 del-node

    redis-trib.rb del-node 127.0.0.1:7000 {sourcerunid}

    所有节点都需执行forget操作,否则60秒后重新扩散


    客户端路由

    moved重定向

    ask重定向

    smart客户端

    具体参考https://www.jianshu.com/p/43190e47eabc



    Cluster故障转移

    故障发现

    节点间通过ping / pong 消息实现故障发现:不需要sentinel。ping / pong 不仅传播节点槽的信息(参见前面章节),亦可以传播主从状态,节点故障,

    具体参考:https://www.jianshu.com/p/8e4bdeb4ee83


    Cluster开发运维常见问题

    慕课网学习总结:

    具体参考https://www.jianshu.com/p/28cfba7a57df



    缓存的使用、设计、优化

    参考https://www.jianshu.com/p/564d5bfe66c0

    CacheCloud

    参考:https://www.jianshu.com/p/1c58c975ef19

    相关文章

      网友评论

          本文标题:Redis Cluster 集群伸缩

          本文链接:https://www.haomeiwen.com/subject/eeaywhtx.html