专栏首页大数据入坑指南redis实战第八篇 集群扩容 手动迁移槽

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

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

1.准备新节点 安装redis,参考redis安装(传送门) 节点配置,参考(传送门

2.将节点加入集群 1)通过cluster meet 加入集群

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} 加入集群

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方式将新节点加入到集群。

[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上执行

127.0.0.1:6380> cluster setslot 866 importing 92fd7c2a7b7b8933d1019e72a852f621f6b4faff
OK

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

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节点上执行

127.0.0.1:6380> cluster setslot 866 migrating bd80c17e01f414b76b01188c76659f7527d07eca
OK

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

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槽只有一个键

127.0.0.1:6380> cluster getkeysinslot 866 100
1) "hello"

4)使用migrate迁移键 在31上执行

127.0.0.1:6380> migrate 192.168.0.207 6380 "" 0 2000 keys hello
OK

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

127.0.0.1:6380> get hello
(error) ASK 866 192.168.0.207:6380

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

127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

32上执行

127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

33上执行

127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

207上执行

127.0.0.1:6380> cluster setslot 866 node bd80c17e01f414b76b01188c76659f7527d07eca
OK

确认迁移是否完成

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自动迁移槽(传送门

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • redis实战第十二篇 redis cluster请求重定向

    在集群模式下,redis在接收到键任何命令时会先计算该键所在的槽,如果改键所在的槽位于当前节点,则直接执行命令,如果改键位于其它节点,则不执行该命令,返回重定向...

    我是李超人
  • redis实战第十篇 集群收缩

    集群收缩的过程和集群扩容的过程正好是反过来的 将207和207的从节点208从集群下线 1.迁移207上的4096个槽 使用redis-cli迁移槽,先将...

    我是李超人
  • redis实战第九篇 集群扩容自动迁移槽(redis-cli)

    上文讲解过自动迁移槽实现集群扩容(传送门) 1.准备新节点 安装redis,参考传送门 节点配置,参考传送门

    我是李超人
  • 一起学Rust-实战leetcode(七)

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    江湖安得便相忘
  • 深度学习在花椒直播的应用——Tensorflow 原理篇

    TensorFlow是Google在2015年开源的深度学习框架,是目前最主流的深度学习计算框架。代码库本身有高达100万+的代码量,分为前端代码和后端代码。如...

    石晓文
  • CVPR 2018摘要:第三部分

    CVPR 2018(计算机视觉和模式识别)会议已经结束,但我们不能停止回顾其精彩的论文; 今天,我们学习第三部分。在第一部分中,我们简要回顾了2018年CVPR...

    AI研习社
  • mahout学习之聚类(1)——向量的引入与距离测度

    用户1665735
  • Python学习笔记整理(一)pytho

    Python对象类型 说明:python程序可以分解成模块,语句,表达式以及对象。 1)、程序由模块构成 2)、模块包含语句 3)、语句包含表达式 4...

    py3study
  • 物联网应用和事件驱动计算重塑云服务

    如今,一些全球主要的公共云提供商已经为物联网和事件驱动计算推出了新的服务。了解这些服务对企业的IT团队和未来的云计算将有一些重要的意义。 工具总是以其用途塑造...

    静一
  • SAS-RTF的合并【完善篇】

    这一篇推文是针对上一篇推文,进行SAS程序与功能上的完善!点击此处将可跳转至上一篇推文:SAS-如何简单快捷的实现RTF合并。在上一篇推文推送后,有不少人都对R...

    Setup

扫码关注云+社区

领取腾讯云代金券