Redis Cluster 集群扩容、数据迁移

官方文档:Redis cluster tutorial – Redis

1、集群扩容

操作流程如下:基于ansible-playbook来操作

1、禁用掉ip.txt中init_cluster组,将server组的ip替换成要扩容节点的物理机ip地址

2、根据原来集群的配置,修改vars/vars.yal的配置文件;执行ansible-playbook -i ip.txt main.yml -b 。部署redis实例

3、登陆到任意一台老的集群的redis节点,执行CLUSTER MEET <ip> <port>,将新扩容节点加入到redis cluster集群,初次加入到集群的节点,通过clueter nodes可以看到新节点的状为是master,

redis-cli -c -p 6379 cluster meet 10.138.12.110  6379

redis-cli -c -p 6379 cluster meet 10.138.12.110  6380

5、添加从节点,将节点加入到集群后,每个节点都认为自己是master节点,这时需要我们指定一下,谁是某个master的从节点命令如下

备注:命令为主节点添加从节点,集群模式下不支持slaveof命令。

redis-cli  -h  10.138.12.109  -p 6380 cluster replicate 011e5d891911cf13c926d32b58a6a661d0cca430

说明:登陆10.138.12.109 端口号为6380  指定011e5d891911cf13c926d32b58a6a661d0cca430 的从

6、重新分片集群

1)重新分片基本上意味着将哈希槽从一组节点移动到另一组节点,就像集群创建一样,它是使用 redis-cli 实用程序完成的。

要开始重新分片,只需键入:

注意:平均分配所有的槽位,使用以下命令会自动降16384个槽位自动分配给集群的每一个master,不用手动指定槽为分配。可以省去下面的交互步骤

redis-cli --cluster  rebalance --cluster-threshold  1 --cluster-use-empty-masters  ${redis_masterip:prot}

您只需要指定一个节点,redis-cli 会自动查找其他节点。

目前 redis-cli 只能在管理员支持下重新分片,所以它从问题开始。首先是你想要做多少大的重新分片?

              How many slots do you want to move (from 1 to 16384)?

我们可以根据具体的节点数计算出需要均分多少个槽位给新节点。"16384/num(master)"

接下来我们需要指定接收这些槽位的node id

                              What is the receiving node ID? (指定新加入的masterr节点的id)

然后我们需要指定从哪些这些槽的来源的node id(从哪些node节点拿取槽位)

Please enter all the source node IDs.

  Type 'all' to use all the nodes as source nodes for the hash slots.       (all从所有master节点获取)

  Type 'done' once you entered all the source nodes IDs.                      (指定从哪些master节点或者,完成后输入done)

Source node #1: 07ac45f613b76f898f54e3f9637863f3a6a578ea

Source node #2: 6e37f4f9007716c3c90cb93322397a48cfb601be

Source node #3: done

然后会再次需要让你确认。

Do you want to proceed with the proposed reshard plan (yes/no)?   (输入yes)

至此已经重新分片集群,等待结束即可。

2、添加新节点作为副本

要求:将127.0.0.1:7006 作为master(3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e)的slave节点添加到集群

操作流程:

1)将slave添加到特定的主节点的方法是将新节点添加为空主节点,然后使用CLUSTER REPLICATE命令将其转换为副本,如果节点是作为slave添加的,但您想将其作为不同主节点的slave移动,这也适用

例如,为了添加节点 127.0.0.1:7005 的副本,该节点当前为 11423-16383 范围内的哈希槽提供服务,其节点 ID 为 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我需要做的就是连接新节点添加为空主)并发送命令:

redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

就是这样。现在我们有了这组哈希槽的新副本,集群中的所有其他节点都已经知道了(需要几秒钟来更新它们的配置)

3、删除节点

要删除副本节点,只需使用del-node redis-cli 命令:

redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`

第一个参数只是集群中的一个随机节点,第二个参数是要删除的节点的 ID。

您也可以以相同的方式删除主节点,但是为了删除主节点,它必须为空。如果主节点不为空,您需要在此之前将数据从它重新分片到所有其他主节点。

删除主节点的另一种方法是对其一个副本执行手动故障转移,并在节点变成新主节点的副本后删除该节点。显然,当您想减少集群中的实际主节点数量时,这无济于事,在这种情况下,需要重新分片。

4、副本迁移

在 Redis 集群中,只需使用以下命令,就可以随时重新配置副本以使用不同的主服务器进行复制:

CLUSTER REPLICATE <master-node-id>

但是,在一种特殊情况下,您希望副本从一个主服务器自动移动到另一个主服务器,而无需系统管理员的帮助。副本的自动重新配置称为副本迁移,可以提高 Redis 集群的可靠性。

您可能希望在特定条件下让集群副本从一个主节点移动到另一个主节点的原因是,通常 Redis 集群与附加到给定主节点的副本数量一样能抵抗故障。

知识点:

    • 集群将尝试从在给定时刻拥有最多副本的主节点迁移副本。
    • 要从副本迁移中受益,您只需向集群中的单个主服务器添加更多副本,无论哪个主服务器都无关紧要。
    • 有一个配置参数控制副本迁移功能,称为cluster-migration-barrier:您可以在redis.conf Redis Cluster 提供的示例文件中阅读有关它的更多信息。https://raw.githubusercontent.com/redis/redis/6.2.5/redis.conf

5、redis集群节点版本升级

升级slave节点很容易,因为您只需要停止节点并使用更新版本的 Redis 重新启动它。如果有客户端使用slave节点扩展读取,如果给定的副本不可用,它们应该能够重新连接到不同的slave节点。

升级masters有点复杂,建议的程序是:

    1. 使用CLUSTER FAILOVER触发主服务器到其副本之一的手动故障转移。(请参阅本文档中的手动故障转移部分。)
    2. 等待master变成副本。
    3. 最后像复制副本一样升级节点。
    4. 如果您希望主节点成为您刚刚升级的节点,请触发新的手动故障转移,以便将升级后的节点恢复为主节点。

按照此过程,您应该一个接一个地升级一个节点,直到所有节点都升级完毕。

6、迁移到redis集群

愿意迁移到 Redis 集群的用户可能只有一个主节点,或者可能已经使用了预先存在的分片设置,其中使用一些内部算法或由其客户端库或 Redis 代理实现的分片算法在 N 个节点之间拆分密钥。

在这两种情况下,都可以轻松迁移到 Redis Cluster,但最重要的细节是应用程序是否使用多键操作,以及如何使用。存在三种不同的情况:

    1. 不使用多键操作,或事务,或涉及多键的 Lua 脚本。键是独立访问的(即使通过事务或 Lua 脚本将多个命令分组,大约相同的键,一起访问)。
    2. 使用多键操作、事务或涉及多个键的 Lua 脚本,但仅使用具有相同哈希标签的键,这意味着一起使用的键都有一个{...}恰好相同的子字符串。例如,在同一个哈希标签的上下文中定义了以下多键操作:SUNION {user:1000}.foo {user:1000}.bar.
    3. 多键操作、事务或涉及多个键的 Lua 脚本与没有显式或相同散列标签的键名一起使用。

第三种情况是Redis Cluster不处理的:应用需要修改才能不使用多键操作或者只在同一个hash标签的上下文中使用。

案例 1 和案例 2 已涵盖,因此我们将重点介绍以相同方式处理的这两个案例,因此文档中将不做区分。

迁移到redis集群,一共有两种方案:

方案一:假设您将预先存在的数据集拆分为 N 个主节点,其中 N=1 如果您没有预先存在的分片,则需要执行以下步骤才能将数据集迁移到 Redis 集群:

    1. 停止你的客户。目前无法自动实时迁移到 Redis 集群。您可以在您的应用程序/环境的上下文中编排实时迁移。
    2. 使用 BGREWRITEAOF 命令为所有 N 个母版生成一个 append only 文件,并等待 AOF 文件完全生成。
    3. 将 AOF 文件从 aof-1 保存到 aof-N 某处。此时,您可以根据需要停止旧实例(这很有用,因为在非虚拟化部署中您经常需要重复使用相同的计算机)。
    4. 创建一个由 N 个 master 和 0 个副本组成的 Redis Cluster。稍后您将添加副本。确保您的所有节点都使用仅附加文件进行持久化。
    5. 停止所有集群节点,将它们的仅附加文件替换为您预先存在的仅附加文件,第一个节点为 aof-1,第二个节点为 aof-2,最多为 aof-N。
    6. 使用新的 AOF 文件重新启动 Redis 集群节点。他们会抱怨说,根据他们的配置,有些密钥不应该存在。
    7. 使用redis-cli --cluster fix命令来修复集群,以便根据每个节点是否具有权威性的哈希槽来迁移密钥。
    8. 最后使用redis-cli --cluster check以确保您的集群正常。
    9. 重新启动修改为使用 Redis 集群感知客户端库的客户端。

方案二:

可以将数据从外部实例导入到 Redis 集群,即使用redis-cli --cluster import命令

redis-cli --cluster import 127.0.0.1:6379 --cluster-from 127.0.0.1:7000 --cluster-replace

说明:外部Redis实例(7000)导入到集群中的任意一节点,倒入之后,原来集群的key变为空,导入到新集群的key会自动分片到各个mater节点的slot

--cluster-replace 如果集群(127.0.0.1:6379)中存在外部redis实例(7000)的key,则会覆盖掉(127.0.0.1:6379)的value

该命令将正在运行的实例的所有键(从源实例中删除键)移动到指定的预先存在的 Redis 集群。但是请注意,如果您使用 Redis 2.8 实例作为源实例,操作可能会很慢,因为 2.8 没有实现迁移连接缓存,因此您可能希望在执行此类操作之前使用 Redis 3.x 版本重新启动源实例(在进行这个操作之前,将redis的版本升级到Redis 3.x版本)。

7、手动故障转移

有时,在master节点出现即将出现问题的情况下进行手动故障转移很有用。例如,为了升级其中一个主节点的 Redis 进程,最好对其进行故障转移,以便将其转换为对可用性影响最小的副本。

Redis Cluster 使用CLUSTER FAILOVER 命令支持手动故障转移,该命令必须在要进行故障转移master的任意slave节点上执行。

手动故障转移是特殊的,与由实际主故障引起的故障转移相比更安全,因为它们的发生方式避免了过程中的数据丢失,只有当系统确定新的主服务器时,才将客户端从原始主服务器切换到新主服务器master 处理了旧的所有复制流。

这是您在执行手动故障转移时在副本日志中看到的内容:

# Manual failover user request accepted.

# Received replication offset for paused master manual failover: 347540

# All master replication stream processed, manual failover can start.

# Start of election delayed for 0 milliseconds (rank #0, offset 347540).

# Starting a failover election for epoch 7545.

# Failover election won: I'm the new master.

基本上连接到我们正在故障转移的master节点的客户端被停止。同时,master 将其复制偏移量发送到副本,副本等待到达其一侧的偏移量。当达到复制偏移量时,故障转移开始,并通知旧主服务器配置切换。当客户端在旧主服务器上解除阻塞时,它们将被重定向到新主服务器。

笔记:

    • 要将副本提升为 master,它必须首先被集群中的大多数 master 称为副本。否则,它无法赢得故障转移选举。如果副本刚刚添加到集群中(请参阅下面的添加新节点作为副本),您可能需要等待一段时间才能发送CLUSTER FAILOVER命令,以确保集群中的主节点知道新副本。

8、集群缩容

要求:删除master节点A及此slave节点A1

操作步骤:

1)先删除slave A1节点(此操作理论上,应该删除掉A节点所有的slave节点);参考3、删除节点

2)将A上的slot重新分片到其他的master节点;参考1、集群扩容中的第四步骤(重新分片集群)

操作完成以后会有如下报错,没有关系:

                                   Node 127.0.0.1:6381 replied with error:

ERR Please use SETSLOT only with masters.

3)此时查看A节点,A已经变为了接受分片槽节点的slave节点

4)删除A节点 ;参考3、删除节点

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloud孙文波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值