Redis迁移工具

news/2024/11/19 5:33:16/

目录

1. Redis-shake

1.1 简介

1.2 使用教程

2. Redis-migrate-tool

2.1 简介

2.2 使用教程

3. Redis-full-check

3.1 简介

3.2 使用教程


1. Redis-shake

1.1 简介

    redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。redis-shake是我们基于redis-port基础上进行改进的一款产品。它支持解析恢复备份同步四个功能。

  • 恢复restore:将RDB文件恢复到目的redis数据库。
  • 备份dump:将源redis的全量数据通过RDB文件备份起来。
  • 解析decode:对RDB文件进行读取,并以json格式解析存储。
  • 同步sync:支持源redis和目的redis的数据同步,支持全量和增量数据的迁移,支持从云下到阿里云云上的同步,也支持云下到云下不同环境的同步,支持单节点、主从版、集群版之间的互相同步。需要注意的是,如果源端是集群版,可以启动一个RedisShake,从不同的db结点进行拉取,同时源端不能开启move slot功能;对于目的端,如果是集群版,写入可以是1个或者多个db结点。
  • 同步rump:支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移。

1.2 使用教程

(1)下载发行包:下载地址

(2)修改配置文件 : redis-shake.conf

  • source.type: 源redis的类型,支持一下4种类型:
  • standalone: 单db节点/主从版模式。如果源端是从多个db节点拉取就选择这个模式,即便是codis等开源的proxy-db架构。
  • sentinel: sentinel模式。
  • cluster: 集群模式。开源的cluster。对于阿里云来说,用户目前无法拉取db的地址,所以此处只能是proxy。
  • proxy: proxy模式。如果是阿里云redis的集群版,从proxy拉取/写入请选择proxy,从db拉取请选择cluster。正常cluster到cluster同步源端请选择cluster模式,proxy模式目前只用于rump。。
  • source.address: 源redis的地址,从1.6版本开始我们支持集群版,不同的类型对应不同的地址:
  • standalone模式下,需要填写单个db节点的地址,主从版需要输入master或者slave的地址。
  • sentinel模式下,需要填写sentinel_master_name:master_or_slave@sentinel_cluster_address。sentinel_master_name表示sentinel配置下master的名字,master_or_slave表示从sentinel中选择的db是master还是slave,sentinel_cluster_address表示sentinel的单节点或者集群地址,其中集群地址以分号(;)分割。例如:mymaster:master@127.0.0.1:26379;127.0.0.1:26380。注意,如果是sentinel模式,目前只能拉取一个master或者slave信息,如果需要拉取多个节点,需要启动多个shake。
  • cluster模式下,需要填写集群地址,以分号(;)分割。例如:10.1.1.1:20331;10.1.1.2:20441。同样也支持上面sentinel介绍的自动发现机制,包含@即可,参考3.2。
  • proxy模式下,需要填写单个proxy的地址,此模式目前仅用于rump。
  • source.password_raw:源redis的密码。
  • target.type: 目的redis的类型,与source.type一致。注意,目的端如果是阿里云的集群版,类型请填写proxy,填写cluster只会同步db0。
  • target.address:目的redis的地址。从1.6版本开始我们支持集群版,不同的类型对应不同的地址。 standalone模式,参见source.address。
  • sentinel模式,需要填写sentinel_master_name@sentinel_cluster_address。sentinel_master_name表示sentinel配置下master的名字,sentinel_cluster_address表示sentinel的单节点或者集群地址,其中集群地址以分号(;)分割。例如:mymaster@127.0.0.1:26379;127.0.0.1:26380
  • cluster模式,参见source.address。
  • proxy模式下,填写proxy的地址,如果是多个proxy,则round-robin循环负载均衡连接,保证一个源端db连接只会对应一个proxy。如果是阿里云的集群版请选择这种模式。
  • target.password_raw:目的redis的密码。

(3)启动运行

./redis-shake.linux -conf=redis-shake.conf -type=xxx

  其中xxx为sync, restore, dump, decode, rump其中之一,全量+增量同步请选择sync。 mac下请使用redis-shake.darwin,windows请用redis-shake.windows. 

2. Redis-migrate-tool

2.1 简介

    Redis-Migrate-Tool(都简称RMT),是唯品会开源的redis数据迁移工具,主要用于异构redis集群间的数据在线迁移,即数据迁移过程中源集群仍可以正常接受业务读写请求,无业务中断服务时间。RMT的特点如下:

  • 快速。
  • 多线程。
  • 基于redis复制。
  • 实时迁移。
  • 迁移过程中,源集群不影响对外提供服务。
  • 异构迁移。
  • 支持Twemproxy集群,redis cluster集群,rdb文件 和 aof文件。
  • 过滤功能。
  • 当目标集群是Twemproxy,数据会跳过Twemproxy直接导入到后端的redis。
  • 迁移状态显示。
  • 完善的数据抽样校验。

2.2 使用教程

(1)下载源码:下载地址

(2)编译

$ cd redis-migrate-tool
$ autoreconf -fvi
$ ./configure
$ make
$ src/redis-migrate-tool -h

(3)修改配置文件

  • 配置文件示例:从redis cluster集群迁移数据到twemproxy集群:
[source]
type: redis cluster
servers:
- 127.0.0.1:6379[target]
type: twemproxy
hash: fnv1a_64
hash_tag: "{}"
distribution: ketama
servers:
- 127.0.0.1:6380:1 server1
- 127.0.0.1:6381:1 server2
- 127.0.0.1:6382:1 server3
- 127.0.0.1:6383:1 server4[common]
listen: 0.0.0.0:34345
threads: 8
step: 1
mbuf_size: 512
source_safe: true
  • 配置文件示例:从redis cluster集群迁移数据到另外一个cluster集群
[source]
type: redis cluster
servers:
- 127.0.0.1:8379[target]
type: redis cluster
servers:
- 127.0.0.1:7379[common]
listen: 0.0.0.0:8888

 (4)启动运行

src/redis-migrate-tool -c rmt.conf -o log -d

(5)数据校验 

$src/redis-migrate-tool -c rmt.conf -o log -C redis_check
Check job is running...Checked keys: 1000
Inconsistent value keys: 0
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 1000All keys checked OK!
Check job finished, used 1.041s

3. Redis-full-check

3.1 简介

    redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,通常用于redis数据迁移后正确性的校验。支持:单节点、主从版、集群版、带proxy的云上集群版(阿里云)之间的同构或者异构对比,版本支持2.x-5.x。

    redis-full-check通过全量对比源端和目的端的redis中的数据的方式来进行数据校验,其比较方式通过多轮次比较:每次都会抓取源和目的端的数据进行差异化比较,记录不一致的数据进入下轮对比(记录在sqlite3 db中)。然后通过多伦比较不断收敛,减少因数据增量同步导致的源库和目的库的数据不一致。最后sqlite中存在的数据就是最终的差异结果。

    redis-full-check对比的方向是单向:抓取源库A的数据,然后检测是否位于B中,反向不会检测,也就是说,它检测的是源库是否是目的库的子集。如果希望对比双向,则需要对比2次,第一次以A为源库,B为目的库,第二次以B为源库,A为目的库。

3.2 使用教程

(1)首先下载二进制包:下载地址

(2)然后运行redis-full-check,使用语法如下:

./redis-full-check [option] [option value]

  常用的参数设置如下: 

  -s, --source=SOURCE               源redis库地址(ip:port),如果是集群版,那么需要以分号(;)分割不同的db,只需要配置主或者从的其中之一。例如:10.1.1.1:1000;10.2.2.2:2000;10.3.3.3:3000。-p, --sourcepassword=Password     源redis库密码--sourceauthtype=AUTH-TYPE    源库管理权限,开源reids下此参数无用。--sourcedbtype=               源库的类别,0:db(standalone单节点、主从),1: cluster(集群版),2: 阿里云--sourcedbfilterlist=         源库需要抓取的逻辑db白名单,以分号(;)分割,例如:0;5;15表示db0,db5和db15都会被抓取-t, --target=TARGET               目的redis库地址(ip:port)-a, --targetpassword=Password     目的redis库密码--targetauthtype=AUTH-TYPE    目的库管理权限,开源reids下此参数无用。--targetdbtype=               参考sourcedbtype--targetdbfilterlist=         参考sourcedbfilterlist-d, --db=Sqlite3-DB-FILE          对于差异的key存储的sqlite3 db的位置,默认result.db--comparetimes=COUNT          比较轮数-m, --comparemode=                比较模式,1表示全量比较,2表示只对比value的长度,3只对比key是否存在,4全量比较的情况下,忽略大key的比较--id=                         用于打metric--jobid=                      用于打metric--taskid=                     用于打metric-q, --qps=                        qps限速阈值--interval=Second             每轮之间的时间间隔--batchcount=COUNT            批量聚合的数量--parallel=COUNT              比较的并发协程数,默认5--log=FILE                    log文件--result=FILE                 不一致结果记录到result文件中,格式:'db    diff-type    key    field'--metric=FILE                 metric文件--bigkeythreshold=COUNT       大key拆分的阈值,用于comparemode=4-f, --filterlist=FILTER           需要比较的key列表,以竖线(|)分割。例如:"abc*|efg|m*"表示对比'abc', 'abc1', 'efg', 'm', 'mxyz',不对比'efgh', 'p'。-v, --version

举例:

  • 对比2个主从版/单节点:
./redis-full-check -t 10.101.72.137:30661 -s 10.101.72.137:30551
  • 对比主从和集群:
./redis-full-check -s "100.81.164.177:21331;100.81.164.177:21332;100.81.164.177:21333" -t 10.101.72.137:30551 
--comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbfilterlist=0

    由于集群版只有db0,所以如果一端是集群版,另一端是非集群版(多个逻辑db),则需要添加sourcedbfilterlist或者targetdbfilterlist(非集群版本的一端)。


http://www.ppmy.cn/news/75817.html

相关文章

让你的文档生动起来:Markdown规范大全

Markdown 规范 什么是 Markdown Markdown 是一种轻量级的标记语言,由 John Gruber 和 Aaron Swartz 创建。它允许人们使用易读易写的纯文本格式编写文档,然后转换成 HTML、PDF 等格式。正因为其简洁、易学易用的特点,Markdown 在技术文章、博客、学术论文等领域广泛应用。…

计算机网络:物理层

物理层 1. 通信基础1.1 基本概念1.1.1 通信模型1.1.2 通信方式1.1.3 数据传输方式1.1.4 数据同步的传输/通信方式1.1.5 码元1.1.6 速率1.1.7 带宽 1.2 奈氏准则|香农定理1.2.1 奈氏准则1.2.2 香农定理 1.3 编码、调制1.3.1 数字数据编码为数字信号1.3.2 数字数据调制为模拟信号…

Qt Quick 定时技巧全攻略:从底层原理到高级应用

Qt Quick 定时技巧全攻略:从底层原理到高级应用 一、Qt Quick 定时基础知识(Basic Knowledge of Qt Quick Timers)1.1 Qt Quick 定时器概览(Overview of Qt Quick Timers)1.2 定时器类型与比较(Timers Type…

3年工作经验裸辞,有点后悔了

2019年毕业,现在有3年的软件测试工作经验,刚毕业前半年在一家知名上市公司,后面则进入一家传统行业公司待到现在2年半。 由于看不到技术成长以及其他原因,上上周辞职了,目前交接中,下个月中旬就得离开了&a…

部门来了个测试开发,听说是00后,上来一顿操作给我看呆了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

Doxygen 源码分析: QCString类

2023-05-20 23:41:56 ChrisZZ imzhuofoxmailcom Hompage https://github.com/zchrissirhcz 文章目录 1. Doxygen 版本2. QCString 类概览3. QCString 特殊成员函数3.1 default 方式的构造函数3.2 单个参数和两个参数的构造函数 4. inline方式实现的成员函数4.1 operator 函数4.…

Java Springboot下redis用pipelining管道模式写入性能调优实例讲解

Springboot下redis写入pipelining管道模式性能调优实例 一、真实场景 生产真实项目过程中,需要将数据库的数据同步写入redis,此过程中遇到写入redis的瓶颈。每次启动项目都要将数据库数据重载到redis,这个过程耗费了大量的时间。 二、解决…

内网渗透(八十一)之搭建Exchange服务器

搭建Exchange服务器 环境安装准备 1、Windows Server 2012 R2以管理员身份运行Windows Powershell,安装必需的 Windows组件: Install-WindowsFeature NET-Framework-45-Features, Server-Media-Foundation, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInt…