我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis异构集群数据实时迁移

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis异构集群数据实时迁移

背景

由于历史原因,公司的缓存方案使用的是Codis,并且一个大部门公用一个集群,我们计划废弃Codis,用Redis原生的集群架构,为什么要废弃Codis呢,主要有两个原因:1、Codis官方已经很久没有更新维护了,Redis官方版本已经迭代到5.x.x了,codis-server还是3.x.x,Redis的一些新特性无法支持;2、基于风险均摊、鸡蛋不放一个篮子的原则,目前我们这样的用法违背了这一原则,如果一个集群出问题,那么整个部门的全部服务都受影响。在前期和业务部门调研的过程中发现,大家用Codis不仅仅是做缓存,有些业务场景还当储存用,比如计数器等;所以我们需要一个数据实时迁移方案,这样业务才能无感知的从Codis迁移到Redis。

方案选型

需求

1、支持从Codis到Redis Cluster做数据迁移
2、支持从Codis到哨兵集群做数据迁移
3、支持只迁移部分key
4、支持查看迁移进度

调研

1、redis-migrate-tool
redis-migrate-tool是唯品会开源的一款Redis异构集群之间的数据实时迁移工具,不过已经有两年没有更新了,我个人觉得这是一款比较完善的工具,特别是数据校验,详细功能介绍见GitHub:
https://github.com/vipshop/redis-migrate-tool
2、RedisShake
RedisShake是阿里云基于豌豆荚开源的redis-port进行二次开发的一个支持Redis异构集群实时同步的工具,它和redis-migrate-tool相比较,我觉得它的优点在于支持前缀key的同步,支持多DB同步,而redis-migrate-tool 只能全量同步,并且如果源做了分库,同步到目标Redis的时候都同步到了db0一个库里面了,这对于做了分库场景的业务是不可行的,关于RedisShake的详细功能介绍见GitHub:
https://github.com/alibaba/RedisShake

3、redis-port
redis-port是豌豆荚当年为了让大家方便从redis迁移到Codis开源的一个Redis数据迁移工具,现在也已经很久没更新了,关于它的功能也用法见GitHub:
https://github.com/CodisLabs/redis-port

实践

环境

codis---》哨兵

分片master 密码 codis版本 哨兵地址 master地址 master密码 哨兵redis版本
192.168.46.150:10379 xxx 3.2.4 192.168.9.87:6385 192.168.9.87:6384 123456 5.0.2
192.168.47.150:10379 xxx 3.2.4 192.168.9.88:6385 192.168.9.87:6384 123456 5.0.2
xxx 3.2.4 192.168.9.89:6385 192.168.9.87:6384 123456 5.0.2

codis---》Redis Cluster

分片master 密码 codis版本 master node master密码 redis cluster版本
192.168.46.150:10379 xxx 3.2.4 192.168.9.87:6383 123456 5.0.2
192.168.47.150:10379 xxx 3.2.4 192.168.9.89:6382 123456 5.0.2
xxx 3.2.4 192.168.9.88:6381 123456 5.0.2

使用redis-migrate-tool进行数据迁移

迁移工具安装

按官方文档进行编译安装即可

编写配置文件

迁移哨兵的配置文件

vim /chj/app/redis-migrate-tool/rmt_sentinel.conf
[source]
type: single
servers :
- 192.168.46.150:10379
- 192.168.47.150:10379
redis_auth: xxx

[target]
type: single
servers:
- 192.168.9.87:6384
redis_auth: 123456

[common]
listen: 0.0.0.0:8888

迁移redis cluster的配置文件

vim /chj/app/redis-migrate-tool/rmt_cluster.conf

[source]
type: single
servers :
- 192.168.46.150:10379
- 192.168.47.150:10379
redis_auth: xxx

[target]
type: redis cluster
servers:
- 192.168.9.87:6383
- 192.168.9.89:6382
- 192.168.9.88:6381
redis_auth: 123456

[common]
listen: 0.0.0.0:8889

启动同步程序

cd /chj/app/redis-migrate-tool
#condis迁移数据到哨兵集群
./class="lazy" data-src/redis-migrate-tool -c rmt_sentinel.conf -o rmt.log -d 
#condis迁移数据到redis cluster
./class="lazy" data-src/redis-migrate-tool -c rmt_cluster.conf -o rmt_cluster.log -d

数据校验

cd /chj/app/redis-migrate-tool
[root@devops-template-test redis-migrate-tool]# ./class="lazy" data-src/redis-migrate-tool -c rmt_sentinel.conf -C "redis_check 60000"
Check job is running...
[2019-06-25 11:12:09.414] rmt_check.c:848 ERROR: key checked failed: check key's value error, value is inconsistent. key(len:17, type:hash): BigData-IpParse:4

Checked keys: 60000
Inconsistent value keys: 1
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 59999

Check job finished, used 16.622s
PS
1、"-C "redis_check 60000" 指定要执行数据校验,60000指的是校验数据的样本数,默认是1000
2、如果有异常,需要确认执行异常key的情况

同步状态确认

total_msgs_outqueue可以判断是否有oplog在队列中等待处理,如果total_msgs_outqueue>0,请继续等待,直到total_msgs_outqueue=0才能切换

[root@devops-template-test redis-migrate-tool]# redis-cli -h 127.0.0.1 -p 8889 info
 Server
version:0.1.0
os:Linux 3.10.0-693.5.2.el7.x86_64 x86_64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:10137
tcp_port:8889
uptime_in_seconds:1201
uptime_in_days:0
config_file:/chj/app/redis-migrate-tool/rmt_cluster.conf

 Clients
connected_clients:1
max_clients_limit:100
total_connections_received:1

 Memory
mem_allocator:jemalloc-0.0.0

 Group
source_nodes_count:2
target_nodes_count:4

Stats
all_rdb_received:1
all_rdb_parsed:1
all_aof_loaded:0
rdb_received_count:2
rdb_parsed_count:2
aof_loaded_count:0
total_msgs_recv:357666
total_msgs_sent:357666
total_net_input_bytes:78804395
total_net_output_bytes:1688068278
total_net_input_bytes_human:75.15M
total_net_output_bytes_human:1.57G
total_mbufs_inqueue:0
total_msgs_outqueue:0

使用RedisShake进行数据迁移

工具安装

mkdir /chj/app/redis-shake
cd  /chj/app/redis-shake
wget https://github.com/alibaba/RedisShake/releases/download/release-v1.6.9-20190624/redis-shake.tar.gz
tar -zxvf redis-shake.tar.gz

编写配置文件

在原来的配置文件上修改,只修改下面有注释的项,其他保持不变

id = redis-shake
log.file = ./redis-shake.log
log.level = info
pid_path =
system_profile = 9310
http_profile = 9320
ncpu = 0
parallel = 32
source.type = cluster  #源类型选择cluster
source.address = 192.168.46.150:10379;192.168.47.150:10379  #codis 分片master的地址
source.password_raw = xxx #codis的密码
source.auth_type = auth
source.tls_enable = false
target.type = sentinel  #目标的类型是哨兵
#target.type = cluster #目标是redis cluster
target.address = sentinel-zhj2-redis-sentinel-dev-6384@192.168.9.87:6385;192.168.9.88:6385;192.168.9.89:6385 #目标哨兵集群的地址
#target.address = 192.168.9.87:6383;192.168.9.89:6382;192.168.9.88:6381 #目标redis cluster的地址
target.password_raw = 123456 #目标redis的密码
target.auth_type = auth
target.db = -1
target.tls_enable = false
rdb.input = local
rdb.output = local_dump
rdb.parallel = 0
rdb.special_cloud =
fake_time =
rewrite = true
filter.db = 0 #只同步db0
filter.key =mms;vcc #只同步mms和vcc开头的key
filter.slot =
filter.lua = false
big_key_threshold = 524288000
psync = false
metric = true
metric.print_log = false
heartbeat.url =
heartbeat.interval = 3
heartbeat.external = test external
heartbeat.network_interface =
sender.size = 104857600
sender.count = 5000
sender.delay_channel_size = 65535
keep_alive = 0
scan.key_number = 50
scan.special_cloud =
scan.key_file =
qps = 200000
replace_hash_tag = false
extra = false

启动同步程序

/chj/app/redis-shake/start.sh /chj/app/redis-shake/redis-shake.conf sync

查看同步状态

通过比较PullCommandTotal - BypassCommandTotal == PushCommandTotal 确定同步是否完成

curl  http://192.168.47.253:9320/metric| python -m json.tool
[
    {
        "AvgDelay": "0.43 ms",
        "BypassCmdCount": 0,
        "BypassCmdCountTotal": 0,
        "Delay": "null ms",
        "Details": null,
        "FailCmdCount": 0,
        "FailCmdCountTotal": 0,
        "FullSyncProgress": 100,
        "NetworkFlowTotal": 42006,
        "NetworkSpeed": 0,
        "ProcessingCmdCount": 0,
        "PullCmdCount": 0,
        "PullCmdCountTotal": 897,
        "PushCmdCount": 0,
        "PushCmdCountTotal": 839,
        "SenderBufCount": 0,
        "SourceAddress": "192.168.46.150:10379",
        "SourceDBOffset": 0,
        "StartTime": "2019-06-25T17:45:23Z",
        "Status": "incr",
        "SuccessCmdCount": 0,
        "SuccessCmdCountTotal": 839,
        "TargetAddress": [
            "192.168.9.87:6384"
        ],
        "TargetDBOffset": 0
    },
    {
        "AvgDelay": "0.60 ms",
        "BypassCmdCount": 1,
        "BypassCmdCountTotal": 4067,
        "Delay": "null ms",
        "Details": null,
        "FailCmdCount": 0,
        "FailCmdCountTotal": 0,
        "FullSyncProgress": 100,
        "NetworkFlowTotal": 37629,
        "NetworkSpeed": 0,
        "ProcessingCmdCount": 0,
        "PullCmdCount": 1,
        "PullCmdCountTotal": 5106,
        "PushCmdCount": 0,
        "PushCmdCountTotal": 333,
        "SenderBufCount": 0,
        "SourceAddress": "192.168.47.150:10379",
        "SourceDBOffset": 0,
        "StartTime": "2019-06-25T17:45:23Z",
        "Status": "incr",
        "SuccessCmdCount": 0,
        "SuccessCmdCountTotal": 333,
        "TargetAddress": [
            "192.168.9.87:6384"
        ],
        "TargetDBOffset": 0
    }
]

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis异构集群数据实时迁移

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Galera集群下MySQL的数据迁移策略

在Galera集群下进行MySQL数据迁移时,需要考虑多个方面,包括迁移前的准备、迁移过程中的数据一致性保证以及迁移后的验证等。以下是一些关键步骤和策略:迁移前的准备验证应用程序兼容性:确保应用程序与Galera集群的Group Repl
Galera集群下MySQL的数据迁移策略
2024-09-04

如何把Oracle 数据库从 RAC 集群迁移到单机环境

这篇文章主要介绍了把 Oracle 数据库从 RAC 集群迁移到单机环境,内容包括系统环境搭建,源数据库的操作及目标数据库的操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

MongoDB怎么处理架构变化时的数据迁移

在MongoDB中处理架构变化时的数据迁移通常有以下几种方法:导出和导入数据:将原有的数据导出为JSON或CSV格式,然后根据新的架构重新导入数据。这种方法适用于数据量较小且变化较少的情况。使用ETL工具:ETL(Extract, Tran
MongoDB怎么处理架构变化时的数据迁移
2024-04-19

怎么使用PHP实现Redis数据库集群

本篇内容主要讲解“怎么使用PHP实现Redis数据库集群”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用PHP实现Redis数据库集群”吧!一、Redis集群架构Redis集群采用分布式架
2023-07-06

Redis的集群模式怎么实现数据分片

在Redis集群模式中,数据分片是通过将数据分散存储在多个节点上来实现的。具体实现数据分片的步骤如下:哈希槽分配:Redis集群将所有数据分成16384个哈希槽,每个槽对应一个整数值。当一个键需要存储到集群中时,Redis会根据键的哈希值来
Redis的集群模式怎么实现数据分片
2024-05-07

实现在线 + 离线模式进行迁移 Redis 数据实战指南

这篇文章主要介绍了实现在线 + 离线模式进行迁移 Redis 数据实战指南的相关资料,需要的朋友可以参考下
2023-01-28

实现在线 + 离线模式进行迁移 Redis 数据实战指南

目录Redis-full-check的使用背景redis-full-check的基本介绍编译源码数据对比核心流程参数信息介绍对比结果差异分析不一致类型key不一致参考资料redis-full-check的使用背景在经历了之前的文章内容章节
2023-01-28

异构数据库迁移埋下的 9 个大坑,你怎么还不会躲开?

在开源技术使用日益广泛的今天,笔者也可能突然被要求用一个新工具同步数据到一个新数据库,时间还可能更紧迫。到时怎么办呢?再愤怒一次吗?不了不了,还是脚踏实地总结一下,记下这些坑,日后类似项目,哪怕被拿着枪指着头也好,下述问题都要在前期阶段予以考虑。 作者介
异构数据库迁移埋下的 9 个大坑,你怎么还不会躲开?
2016-08-22

如何将本地数据库备份到阿里云实现数据迁移和异地灾备

在现代信息技术时代,数据安全和备份是企业的重要需求之一。本文将介绍如何将本地数据库备份到阿里云,以实现数据迁移和异地灾备。我们将探讨备份过程中的步骤和技术,并提供一些实际案例来帮助读者更好地理解和应用。详细说明:1.准备工作在将本地数据库备份到阿里云之前,我们需要进行一些准备工作。首先,确保你已经在阿里云上创建了
如何将本地数据库备份到阿里云实现数据迁移和异地灾备
2024-01-18

编程热搜

目录