Redis集群扩容

在使用Redis搭建集群环境时,通常会根据业务的需求,要对集群进行扩容,以满足业务的需要。并且这也是分布式存储比较常见的需求,在Redis中对集群进行扩容主要分为3步:

1.准备新节点

2.加入集群

3.迁移槽和数据

下面我们详细介绍一下这3个步骤:

  • 准备新节点

我们还是向准备其它节点一样,先修改节点配置。

# 节点端口
port 6385
# 开启集群模式
cluster-enabled yes
# 节点超时时间,单位为毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6385.conf"

启动该节点:

./src/redis-server redis-6385.conf
./src/redis-server redis-6386.conf

但此时新增的节点还没有和其它节点进行通信,所以该节点现在还没有添加到集群环境中。


  • 加入集群

将新节点加入集群我们可以通过cluster meet命令。

cluster meet 127.0.0.1 6385
cluster meet 127.0.0.1 6386

我们看上图所示,新节点虽然添加到了集群环境中,但新节点的类型是master的,也就是都是主节点。同样我们也可以使用redis-trib.rb工具添加新节点,并且该命令可以直接支持添加从节点。

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

在生产环境中我们推荐使用redis-trib.rb命令添加新节点,因为该命令在添加新节点时会执行检查,如果新节点已经加入集群或者包含数据,则该命令会放弃集群加入。


  • 迁移槽和数据

加入集群后需要为新节点迁移槽和相关的数据,槽在迁移的过程中集群可以正常的提供读写服务。下面我们详细介绍一下这方面的内容。

1.槽迁移计划

槽是Redis集群管理数据的基本单位,首先需要为新节点指定槽的迁移计划,也就是将哪些节点的哪些槽迁移到新节点中。并且迁移计划要确保每个节点负责相似数量的槽,从而保证各节点的数据均匀。槽迁移计划确定后开始逐个把槽内数据从源节点迁移到目标节点中。


2.迁移数据

数据迁移过程是逐个槽进行的,每个槽迁移的流程如下.

流程说明:

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)机制批量迁移到目标节点。 5)重复步骤3、4部直到槽下所有的键值数据迁移到目标节点。 6)向集群内所有主节点发送cluster setslot {slot} node {targetNodeId}命令,通知槽分配给目标节点。


下面我们手动使用上述命令把节点6379负责的槽4096迁移到目标节点6385中,具体操作如下:

1.目标节点准备导入槽4096数据。

cluster setslot 4096 importing 目标节点ID

2.源节点注备导出槽4096数据。

cluster setslot 4096 migrating 源节点ID

3.批量获取槽4096对应的键。

cluster getkeysinslot 4096 100

我们先查询一下在6379节点是否包括上述的key。

下面我们迁移这3个键。

下面我们继续在6379节点中查询上述的3个键。

下面我们通知所有主节点槽4096指派给目标节点6385。

我们可以在6379节点中查看一下确定4096槽不在由6379负责。

上述内容就是手动执行槽迁移的过程。在实际的操作中因为会涉及到大量槽及键的迁移,所以会很不方便,因此redis-trib工具提供了槽分片功能,命令如下:

redis-trib.rb reshard host:port --form <arg> --to <arg> --slots <arg> --yes --timeout <arg> ---pepeline <arg>

下面我们介绍一下上述命令参数说明:

  • host:port:比传参数,集群内任意节点地址,用来获取整个集群信息。
  • --form:制定源节点的id,如果有多个源节点,则使用逗号分割。
  • --to:需要迁移的目标节点id,并且目标节点只能指定一个。
  • --slots:需要迁移槽的总数量。
  • --yes:当打印出reshard执行计划时,是否需要用户输入yes确认后再执行reshard。
  • --timeout:控制每次migrate操作的超时时间,默认为60000毫秒。
  • --pipeline:控制每次批量迁移键的数量,默认为10。

下面我们使用reshard命令迁移剩余槽的数据。

上述命令执行完后reshard命令会提示我们输入迁移槽的数量,我们暂时输入4096。

当我们输入完迁移槽的数量后,会提示我们输入目标节点ID,我们输入6385节点ID。

同样,我们输入完目标节点后,会提示我们输入输入源节点ID,也就是主节点ID,所以我们输入6379、6380、6381三个主节点ID,并且已done命令结束。

当输入完上述命令后,会打印出所有槽从源节点到目标节点的计划,并让我们输入yes命令后才会继续执行迁移工作。

输入yes命令后在通过cluster nodes命令查看节点状态。

下面我们还有最后一个步骤,就是当初我们虽然把6385和6386节点添加到了集群,并且已经将部分槽和数据迁移到了6385节点上,但该节点并没有相应的从节点,所以下面的步骤就是将6386节点设置为6385节点的从节点。


上述内容就是Reids集群扩容的全部内容,如有不正确的地方,欢迎指出,谢谢。

本文分享自微信公众号 - 吉林乌拉(jilinwulacom)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-06

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据实践

Flink实时计算指标对数方案

对于一个实时数据产品人员、或者开发人员来说,产品上展示的实时数据,pv、uv、gmv等等,怎么知道这些数据是不是正确的呢?当其他的小组开发的产品的数据(或者其他...

16200
来自专栏爱编码

什么是一致性Hash算法?

什么是Hash一致性算法?面试的时候被问到了,因为不了解,所以就没有回答上。在此为大家整理一下什么是Hash一致性算法,希望对大家有帮助!今天的分享先从历史的角...

7950
来自专栏实战docker

立即可用的实战源码(springboot+redis+mybatis+restTemplate)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

15320
来自专栏业余草

Redis从入门到精通

原文链接:https://url.cn/5vUhnKI

7720
来自专栏架构说

头条后台开发面经

算法:给出[[1, 2], [3, 5], [8, 8], [15, 16], [32, 38]],求间隔

9820
来自专栏业余草

如何将 Redis 用于微服务通信的事件存储

原文链接:https://www.xttblog.com

7130
来自专栏zhisheng

实时数据指标统计对数方案

相信大家做过实时指标统计的,肯定会遇到一个问题,算的指标是不是对的呢?pv、uv、dau、gmv、订单等等统计数据,但是怎么知道自己算的gmv是不是正确的呢?

20220
来自专栏业余草

大厂面试题:如何保障生产端100%消息投递成功?

原文链接:https://url.cn/57Tclci

9220
来自专栏zhisheng

Redis从入门到精通,至少要看看这篇!

常用的 SQL 数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的 IO 压力。

17040
来自专栏业余草

数据库缓存最终一致性的四种方案

原文链接:https://juejin.im/post/5d5c99b66fb9a06ae072060d

7820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励