背景

在生产环境中,我们使用k8s搭建redis集群,nfs存储也在我们的k8s 的work节点上面(无形挖坑),最开始没有什么问题,但是现在遇到一个问题就是我们迫不得已需要把k8s每台机器都重启升级内核,为了解决k8s为linux上的一个Bug。但是生产的数据不能随随便便停机,最好最数据迁移。虽然我们下面的方式能实现迁移,但是会有一些数据的丢失。而这些数据的丢失在公司容忍范围之内。

方案探讨

方案一,使用搜狐的cachecloud,网址如下:
https://github.com/sohutv/cachecloud
但是在研究的过程,发现他好多文档已经打不开了。最直接就是想去看迁移工具这个章节,但是网址已经打不开了

方案二,在研究cachecloud的过程中,发现cachecloud使用的迁移工具是基于唯品会的redis-migrate-tool 网址如下:https://github.com/vipshop/redis-migrate-tool
在研究的过程中,发现这个工具已经很久没有维护。从中发现一个最为致命的一点就是cachecloud 在19年才支持redis版本4的迁移,而我们生产中redis的版本已经是5了。后面也不想再研究下去了。猜测90%的概率是不支持redis版本5的迁移。

方案三,这是我们最终采用的方案,使用阿里开源的RedisShake,网址如下:
https://github.com/alibaba/RedisShake
具体详情开源查看网址下的描述。
因为我们的需求是将k8s集群中的数据迁移出来到新的redis集群上,允许有一小段时间的丢失,实际上,我们肯定会选择尽量不影响生产的时间段进行处理。

具体我们的做法是,把k8s集群中redis的dump.rdb文件拷贝出来,通过RedisShake工具把数据同步到新的redis集群中。
具体操作详情看如下文档:https://github.com/alibaba/RedisShake/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE%EF%BC%9F#32-%E9%9B%86%E7%BE%A4%E7%89%88cluster%E5%88%B0%E9%9B%86%E7%BE%A4%E7%89%88cluster%E9%85%8D%E7%BD%AE%E4%B8%BE%E4%BE%8B

具体步骤如下
前提是部署RedisShake的机器必须要和新的redis集群网络是通的
1.下载(你也可以自己下载源码,自己编译,我比较懒,直接使用他们已经编译好的)

wget  https://github.com/alibaba/RedisShake/releases/tag/release-v2.0.3-20200724

2.解压

tar -zxvf  redis-shake-v2.0.3.tar.gz

3.redis-shake.conf配置如下(我把里面一些注释去掉,不然太多,只留下我配置的内容,但是实际上需要配置的地方如,source.type ; source.rdb.input ;target.address;)


conf.version = 1
id = redis-shake
log.file =
log.level = info
pid_path =
system_profile = 9310
http_profile = 9320
parallel = 32
#修改为cluster类型  具体可以看下
source.type = cluster
#这里需要注释掉
#source.address = 192.168.226.128:6379
source.auth_type = auth
source.tls_enable = false

#这里的dump.rdb文件 是我从生产上拷贝到这台机器上的
source.rdb.input = /data/redis-5.0.5/db/dump1.rdb;/data/redis-5.0.5/db/dump2.rdb;/data/redis-5.0.5/db/dump3.rdb;/data/redis-5.0.5/db/dump4.rdb;/data/redis-5.0.5/db/dump5.rdb;/data/redis-5.0.5/db/dump6.rdb

source.rdb.parallel = 0

source.rdb.special_cloud =

target.type = cluster
#这里需要填写目标的都是master或者slave的ip port
target.address = 192.168.226.129:7000;192.168.226.129:7001;192.168.226.129:7002

target.auth_type = auth

target.db = -1

target.tls_enable = false

target.rdb.output = local_dump

target.version =


fake_time =


key_exists = none


filter.db.whitelist =

filter.db.blacklist =

filter.key.whitelist =

filter.key.blacklist =

4.执行

./redis-shake.linux -conf=redis-shake.conf -type=restore
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐