RedisShake在工作中的应用-实现redis集群间数据迁移

1. 背景

公司最近在做机房搬迁工作,老机房将进行拆除,故需将老机房的redis哨兵集群数据,迁移到新机房的redis哨兵集群。

2. Redis数据迁移实现

2.1 sit环境伪造生产500万的数据量

利用Jmeter压测登录接口,控制200的线程并发数,持续不断的压几个小时。待sit环境redis(10.172.17.151:6379,10.172.17.152:6379,10.172.17.153:6379)
数据量接近500万后,修改线程的并发数为10,模拟生产数据的增量。

2.2 使用redis-shake进行数据迁移

2.2.1 redis-shake.conf配置文件修改

登录10.172.10.150机器,修改redis-shake.conf配置文件:

在这里插入图片描述

主要修改以下几个配置项:(其他参数默认)
###############################################################################
#日志文件名,留空则会打印到 stdout,否则打印到指定文件
log.file = /u02/redis-shake/log/redis-shake.log
#源端 Redis 的类型,可选:standalone,sentinel, cluster,proxy
#注意:proxy 只用于 rump 模式。
source.type = sentinel
#源端 redis 的地址
source.address = phoenix:slave@10.172.17.151:26379;10.172.17.152:26379;10.172.17.153:26379

#源端密码,留空表示无密码。
source.password_raw = uhuy65d./
#目的redis的类型,支持standalone,sentinel,cluster和proxy四种模式。
target.type = sentinel
#目的redis的地址
target.address = phoenix:master@10.172.33.37:26379;10.172.33.38:26379;10.172.33.39:26379
#目的端密码,留空表示无密码。
target.password_raw = uh6yjkd./
#当源和目的端有重复 key 时是否进行覆写
key_exists = rewrite

注意
1.源redis的地址,需要填写sentinel_master_name:master_or_slave@sentinel_cluster_address。其中master_or_slave表示从sentinel中选择的db是master还是slave,如果配置为master,redis集群架构为一主多从(星形)结构,为了降低主节点网络带宽消耗,以及对主节点的负载,保证服务的稳定性,我们需要将其配置为slave,从而将集群架构变为树状主从结构,详细原理说明见2.2.2。

2:key_exists配置有几种选项如下所示
rewrite: 源端覆盖目的端
none: 一旦发生进程直接退出
ignore: 保留目的端key,忽略源端的同步 key. 该值在 rump 模式下不会生效
需要将其配置为rewrite,以此保证新机房的数据始终都是最新的。

2.2.2 一主多从结构与树状主从结构(延伸)

一主多从结构(又称为星形拓扑结构)使得应用端可以利用多个从节点 实现读写分离。对于读占比较大的场景,可以把读命令发送到 从节点来分担主节点压力。同时在日常开发中如果需要执行一些比较耗时的 读命令,如:keys、sort等,可以在其中一台从节点上执行,防止慢查询对 主节点造成阻塞从而影响线上服务的稳定性。对于写并发量较高的场景,多 个从节点会导致主节点写命令的多次发送从而过度消耗网络带宽,同时也加 重了主节点的负载影响服务稳定性。

在这里插入图片描述
树状主从结构(又称为树状拓扑结构)使得从节点不但可以复制主节点 数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入复制中 间层,可以有效降低主节点负载和需要传送给从节点的数据量。如图所示,数据写入节点A后会同步到B和C节点,B节点再把数据同步到D和E节 点,数据实现了一层一层的向下复制。当主节点需要挂载多个从节点时为了 避免对主节点的性能干扰,可以采用树状主从结构降低主节点压力。

在这里插入图片描述

2.2.3 启动redis-shake

启动命令:
./redis-shake.linux -conf=redis-shake.conf -type=sync &

在这里插入图片描述

2.3 观察日志

日志路径:/u02/redis-shake/log/redis-shake.log
1.程序启动日志
在这里插入图片描述
2.全量同步阶段:显示百分比

在这里插入图片描述
3.增量同步阶段:

在这里插入图片描述
其中forwardCommands表示发送的命令个数,filterCommands表示过滤的命令个数,比如opinfo或者指定了filter都会被过滤,writeBytes表示发送的字节数。在23:40:00 左右, 使用dbsize命令查看两套redis集群数据量已很接近。所以生产500万的数据迁移,预估在5分钟左右完成。使用Ctrl+C组合键停止运行Redis-shake。

3. 数据验证

3.1 手动验证

3.1.1 数据量验证

源库:
在这里插入图片描述
目的库:

在这里插入图片描述
两者相差:4961016-4960803 = 213,由此证明两者数据量已经很接近。

3.1.2 数据正确性验证

随机抽取部分key,观察其值,是否正确:
源库:

在这里插入图片描述
在这里插入图片描述
目的库:

在这里插入图片描述
在这里插入图片描述
由此证明目的库数据,也是正确的。

3.1.3 源redis主节点是否异常验证

迁移过程中,同时按照生产并发量压测登录接口
在这里插入图片描述
在这里插入图片描述
从jemeter的压测结果来看,异常数为0,返回结果均正常,且压测的是登录接口,会不断往主节点写入数据,说明redis主节点是正常响应的。

3.1.4 源redis数据同步节点(10.172.17.152)监控

在这里插入图片描述

可以看到网卡出口流量有明显突起,和迁移的时间段是吻合的,这也符合我们的预期。

3.2 工具验证

redis-full-check是用来检验两个Redis数据是否一致的工具。它的原理主要是通过全量对比源端和目的端Redis中的数据方式来进行数据校验。读者可自行下载此工具进行验证,在此不再介绍。

the end~

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值