前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis实战第八篇 集群扩容 手动迁移槽

redis实战第八篇 集群扩容 手动迁移槽

作者头像
我是李超人
发布2020-08-20 15:44:03
1.5K0
发布2020-08-20 15:44:03
举报

随着业务需求的增加,需要对集群扩容,将207,208两个节点加入到集群中

1.准备新节点

安装redis,参考redis安装(传送门

节点配置,参考(传送门

2.将节点加入集群

1)通过cluster meet 加入集群

代码语言:javascript
复制
127.0.0.1:6380> cluster meet 192.168.0.207 6380
OK
127.0.0.1:6380> cluster meet 192.168.0.208 6380
OK

2)redis-cli --cluster add-node {new host}:{new port} {exist host}:{exist port} 加入集群

代码语言:javascript
复制
redis-cli --cluster add-node 192.168.0.207:6380 192.168.0.31:6380
redis-cli --cluster add-node 192.168.0.208:6380 192.168.0.31:6380

推荐使用redis-cli add-node 将节点加入集群,该命令会对新节点的状态做检查,如果新节点已加入到其它集群或者包含数据,则会放弃加入集群,并报出如下异常。而 cluster meet不会做检查操作,如果通过cluster meet加入的节点已经加入到其它集群,会出现被加入节点的集群合并到现有集群的现象,造成数据错乱,所以线上推荐使用redis-cli --cluster add-node方式将新节点加入到集群。

代码语言:javascript
复制
[ERR] Node 192.168.0.207:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
备注:redis-cli --cluster del-node 192.168.0.208:6380 0fb70304b81646d5a2c3cef7fcb81db59ac35af1通过这种方式将节点从集群中移除,如果后续要将该节点再次加入集群,直接加入也会报上面这个异常,因为此时节点的nodes_cluster.conf配置文件中存在之前集群节点信息,需要将该文件上出再启动节点加入集群。

3.迁移槽数据

新节点接入集群后,需要把槽均匀分布到所有节点上,原本是有三个节点,每个节点的槽数量是5460个或者5461个,现在集群扩容到了四个主节点,则每个主节点的槽数量是4096个。

槽迁移过程如下

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

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

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

4.在源节点上执行migrate {targetIp} {targetPort} “” 0 {timeout} keys {keys…}命令,把获取的键通过流水线(pipeline)机制批量迁移到目标节点,批量迁移版本的migrate命令在Redis3.0.6以上版本提供,之前的migrate命令只能单个键迁移。对于大量key的场景,批量键迁移将极大降低节点之间网络IO次数。

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

6.向集群内所有主节点发送cluster setslot {slot} node {targetNodeId}命令,通知槽分配给目标节点。为了保证槽节点映射变更及时传播,需要遍历发送给所有主节点更新被迁移的槽指向新节点。

目前我的集群中只有866槽有数据,为了演示方便,我将866槽迁移到新节点207上。

1).目标节点准备导入866槽

在207上执行

代码语言:javascript
复制
127.0.0.1:6380> cluster setslot 866 importing 92fd7c2a7b7b8933d1019e72a852f621f6b4faff
OK

查看状态,新节点等待866槽导入

代码语言:javascript
复制
127.0.0.1:6380> cluster nodes
bd80c17e01f414b76b01188c76659f7527d07eca 192.168.0.207:6380@16380 myself,master - 0 1550222172000 0 connected [866-<-92fd7c2a7b7b8933d1019e72a852f621f6b4faff]

2).源节点准备导出槽866

866槽是在31节点上,在31节点上执行

代码语言:javascript
复制
127.0.0.1:6380> cluster setslot 866 migrating bd80c17e01f414b76b01188c76659f7527d07eca
OK

查看状态,源节点准备导出866槽

代码语言:javascript
复制
127.0.0.1:6380> cluster nodes
92fd7c2a7b7b8933d1019e72a852f621f6b4faff 192.168.0.31:6380@16380 myself,master - 0 1550223537000 1 connected 0-5460 [866->-bd80c17e01f414b76b01188c76659f7527d07eca]

3)获取槽所对应的键,目前866槽只有一个键

代码语言:javascript
复制
127.0.0.1:6380> cluster getkeysinslot 866 100
1) "hello"

4)使用migrate迁移键

在31上执行

代码语言:javascript
复制
127.0.0.1:6380> migrate 192.168.0.207 6380 "" 0 2000 keys hello
OK

hello这个key已经迁移到了207上了,再在31上获取该key,会出现重定向的现象。

代码语言:javascript
复制
127.0.0.1:6380> get hello
(error) ASK 866 192.168.0.207:6380

5)通知所有主节点槽已经迁移完成

由于866槽上只有一个键,所以执行完4步骤后,槽内所有键都迁移完了,实际生产中键的数量肯定不只这些,一个槽需要多次迁移键。槽内键迁移完成后需要通知所有主节点槽866交给了207节点。

31上执行

代码语言:javascript
复制
127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

32上执行

代码语言:javascript
复制
127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

33上执行

代码语言:javascript
复制
127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

207上执行

代码语言:javascript
复制
127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

确认迁移是否完成

代码语言:javascript
复制
127.0.0.1:6380> cluster nodes
bd80c17e01f414b76b01188c76659f7527d07eca 192.168.0.207:6380@16380 master - 0 1550224103000 9 connected 866
....
92fd7c2a7b7b8933d1019e72a852f621f6b4faff 192.168.0.31:6380@16380 myself,master - 0 1550224101000 1 connected 0-865 867-5460

4.重复以上操作,直到所有的槽迁移完成

很明显,通过手动的方式迁移槽,效率低下,过程繁琐。还好,redis专门提供了一个自动迁移槽的工具,下面讲解如何通过redis-cli自动迁移槽(传送门

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档