集群伸缩
伸缩原理
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
网友评论