Redis迁移及redis-shake介绍

Redis迁移及redis-shake介绍

1. Redis迁移介绍

工作中有时会遇到需要把原Redis集群下线,迁移到另一个新的Redis集群的需求(如机房迁移,Redis上云等原因)。此时原Redis中的数据需要如何操作才可顺利迁移到一个新的Redis集群呢? 本节简单介绍相关方法及一些工具。

redis有主从架构及redis-cluster架构,架构不同,两者的迁移方法也是不相同的。

1.1 Redis主从迁移

若原来的redis集群为主从结构,则迁移工作是相当简单方便的。可使用slaveof迁移或aof/rdb迁移数据。

  • slaveof : 利用slaveof制作新的从库,从而达到数据迁移的目的。
  • aof迁移: 暂停写服务,把aof文件导出到新的redis机群中完成数据迁移。

1.1.1 slaveof同步数据

如下示例:将把原来redis_master 192.124.64.212:6379迁移到新redis_master 192.124.64.214:6380

#旧 redis_master 192.124.64.212:6379 --> 新redis_master 192.124.64.214:6380
1.数据同步
$redis-cli -h redis_master_new 6380 slaveof redis_master_old 6379
$redis-cli -h 192.124.64.214 6380 slaveof 192.124.64.212 6379

2.修改新read-only配置为no.

修改新redis的read-only配置为no,新的redis可以写数据。否则会出错.
$redis-cli -h 192.124.64.214 -p 6380 -a pwd123 set foo bar
(error) READONLY You can't write against a read only slave

查看当前slave-read-only配置
$redis-cli -h 192.124.64.214 -p 6380 -a pwd123 config  get slave-read-only
1) "slave-read-only"
2) "yes"

$redis-cli -h 192.124.64.214 6380 config set slave-read-only no
$redis-cli -h 192.124.64.214 6380 config get slave-read-only

3. 业务停止对原redis停写.

4. 业务变更redis配置,重启web服务
   业务修改redis配置为新的redis地址,并重启web服务。

5. 检查新/旧redis链接情况
旧redis:
redis-cli -h 192.124.64.212 -p 6379 -a pwd123 info clients
connected_clients:1
redis-cli -h 192.124.64.212 -p 6379 -a pwd123  client list
redis-cli -h 192.124.64.212 -p 6379 -a pwd123  client list  |awk -F'addr=' '{print $2}' | awk '{print $1}'|awk -F':' '{print $1}'|sort |uniq -c|sort -nr 
      1 192.124.64.214
新redis: 
redis-cli -h 192.124.64.214 -p 6380 -a pwd123 info clients
redis-cli -h 192.124.64.214 -p 6380 -a pwd123 dbsize

6.断开同步
redis-cli -h 192.124.64.214 -p 6380 info |grep role
redis-cli -h 192.124.64.214 -p 6380 slaveof NO ONE
OK
redis-cli -h 192.124.64.214 -p 6380 info |grep role
role:master

7. 测试业务情况(略)

1.1.2 aof同步数据

若是原来的redis可以暂停写操作,则咱们用aof来同步数据也很方便。

#旧redis导出aof文件
$redis-cli -h old_instance_ip -p old_instance_port config set appendonly yes
$redis-cli -h old_instance_ip -p old_instance_port configconfig get appendonly
1) "appendonly"
2) "yes"
#aof文件导入到新的redis
$redis-cli -h new_redis_instance_ip -p 6379 -a password --pipe < appendonly.aof
#导入完成后,关闭原redis AOF
$redis-cli -h old_instance_ip -p old_instance_port config set appendonly no

slaveof及aof迁移对比:

  • slaveof 会把目标redis库上当前的key全部清除,这点要注意。
  • 当redis数据量较大时使用slaveof xxx,会给master带来较大的压力。最好业务低峰时间处理。
  • aof迁移数据可以保留新redis上已存在的数据,这点不同于slaveof。
  • aof不能实时同步,所以迁移期间的redis增量数据不能同步,故常需要把原来的redis停写操作。

1.2 Redis集群迁移

Redis-cluster介绍:

Redis-cluster是 redis 的一个分布式实现,cluster将数据存储到多个不同Redis实例中,解决了单机Redis容量有限的问题。并且Redis-cluster某个节点故障时,若此节点有可用的从库,则redis-cluster将可以继续处理请求,从而实现了redis的高可用。

redis-cluster

Redis-cluster迁移:

Redis迁移

Redis-Cluster是由多个redis实例组成的集群,无法直接使用slave of 命令把redis-cluster-B变成redis-cluster-A的从库。

redis-cluster迁移方法:

  • 若是业务可以中断,可停止Cluster-A 写操作,把Redis rdb/aof文件传输到新的Cluster-B机群再重启服务。
  • 使用某些redis数据迁移工具来迁移redis-cluster数据。

1.3 Redis迁移工具

常见redis迁移工具网址:

  • redis-dump: redis-dump 是一个将redis数据导入/导出为json格式数据的小工具。
  • redis-port : 最初是 codis 项目相关工具,支持实时同步 redis 数据到 codis/redis等中。
  • redis-migrate-tool: 是唯品会开源的redis数据迁移工具,可用于异构redis集群间的数据在线迁移。
  • redis-shake : 是阿里云的redis数据同步的工具。支持redis主从->redis-cluster,cluster-cluster等多种redis架构的数据同步。

redis-dump:

redis-dump可以方便的把一个redis实例的数据导出来(不是redis-cluster的数据)。redis-dump命令需要用到keys命令,若是rename此命令,则redis-dump将会出错。

#把192.124.64.212:6379 数据导到192.124.64.214:6380。 
$redis-dump -u :pwd123@192.124.64.212:6379 |  redis-load -u :pwd123@192.124.64.214:6380 
#
$redis-dump -u :pwd123@192.124.64.212:6379
{"db":0,"key":"foo","ttl":-1,"type":"string","value":"bar","size":3}
#keys不可用将出错
$redis-dump -u :pwd123@192.124.64.212:6379>redis_6379.json
ERR unknown command 'keys'

redis-port/redis-migrate-tool/ redis-shake :
这几个工具功能相近,可支持redis的实时数据同步。本文以redis-shake来重点介绍。

2. Redis-shake 介绍

2.1 Redis-shake简介

redis-shake是阿里云自研的开源工具,支持对Redis数据进行解析(decode)、恢复(restore)、备份(dump)、同步(sync/rump)。在sync模式下,redis-shake使用SYNC或PSYNC命令将数据从源端Redis同步到目的端Redis,支持全量数据同步和增量数据同步,增量同步在全量同步完成后自动开始。

功能介绍:

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

2.2 基本原理

redis-shake的基本原理就是模拟一个从节点加入源redis集群,首先进行全量拉取并回放,然后进行增量的拉取(通过psync命令)。如下图所示:


redis-shark原理

如果源端是集群模式,只需要启动一个redis-shake进行拉取,同时不能开启源端的move slot操作。如果目的端是集群模式,可以写入到一个结点,然后再进行slot的迁移,当然也可以多对多写入。

2.3 软件安装

软件下载地址: https://github.com/alibaba/RedisShake/releases 。软件解压缩后就可使用。

安装:

#安装redis-shake
$wget 'https://github.com/alibaba/RedisShake/releases/download/release-v1.6.24-20191220/redis-shake-1.6.24.tar.gz' .
$tar -zxvf redis-shake-1.6.24.tar.gz
$mv redis-shake-1.6.24 /usr/local/redis-shake
#环境变量
$echo 'export PATH=$>/etc/profile'>PATH:/usr/local/redis-shake'>>/etc/profile
$source /etc/profile

#查看版本
$redis-shake  --version
#启动程序, xxx为sync, restore, dump, decode, rump之一
$redis-shake.linux -conf=redis-shake.conf -type=xxx 

#目录中文件信息
$tree /usr/local/redis-shake
.
├── ChangeLog
├── redis-shake.conf
├── redis-shake.darwin
├── redis-shake.linux
├── redis-shake.windows
├── start.sh
└── stop.sh

启动:
redis-shake --conf={配置文件地址} --type={模式:sync/dump等} 模式需要与配置文件中的source target对应。模式为sync, restore, dump, decode, rump其中之一,全量+增量同步请选择sync。 mac下请使用redis-shake.darwin,windows请用redis-shake.windows

2.4 配置参数

2.4 模式说明

2.4.1 dump模式

配置参数:

参数 说明 示例
source.address 源Redis的连接地址与服务端口。 xxxxxxxxxxxx.redis.rds.aliyuncs.com:6379
source.password_raw 源Redis的连接密码。 account:password
rdb.output 输出的RDB文件名称。 local_dump

测试:

导出redis 192.124.64.212:6001的数据。

$vim redis-shake-dump.conf 
# source相关配置[cluster|standalone]
source.type = standalone
source.address = 192.124.64.212:6001
source.password_raw = pwd123
source.auth_type = auth

# 如果是decode或者dump,这个参数表示输出的rdb前缀,比如输入有3个db,那么dump分别是:
# ${output_rdb}.0, ${output_rdb}.1, ${output_rdb}.2
target.rdb.output = local_dump

#执行
$redis-shake -type=dump -conf=redis-shake-dump.conf 
#检查日志
tail -f /var/log/redis-shake.log 
2020/01/12 23:49:13 [INFO] routine[3] total = 15.212KB -     15.212KB [100%]
2020/01/12 23:49:13 [INFO] routine[3] dump: rdb done
2020/01/12 23:49:13 [INFO] execute runner[*run.CmdDump] finished!

说明:

  • 日志中出现execute runner[*run.CmdDump] finished!表示RDB文件备份完成。
  • RDB文件名称默认为local_dump.0,可使用cat local_dump.0命令确认Redis数据是否备份成功。

2.4.2 decode模式

官网说decode实现对RDB文件进行读取,并以json格式解析存储。(本文作者没有搞明白如何用decode redis rdb文件为json文件 ,故我使用了类似的工具redis-rdb-tools. )

测试:

$vim redis-shake-decode.conf 
id = redis-shake
# used in `decode` and `restore`.
# if the input is list split by semicolon(;), redis-shake will restore the list one by one.
source.rdb.input = ./local_dump.0

#执行:
$redis-shake -type=decode -conf=redis-shake-decode.conf   

redis-rdb-tools:

解析redis的dump.rdb文件,分析内存,以JSON格式导出数据。

#安装
$pip install rdbtools python-lzf
#wget https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip
#帮助
$rdb -h 
#使用
#解析dump文件并以JSON格式标准输出
$rdb --command json data/redis-6379.rdb 
$rdb --db 0 --command  json --key "foo*" data/redis-6379.rdb  
#生成内存报告
$rdb -c memory data/redis-6379.rdb > redis_mem_report.csv

2.4.3 restore模式

restore模式可将RDB文件恢复到目的redis数据库。主要需要配置source.input.rdb表示输入的rdb文件列表(分号";"分割),同时配置target.type, target.address和target.password_raw表示恢复的地址。

配置参数:

参数 说明 示例
rdb.input 备份文件(RDB文件)的路径,可使用相对路径或绝对路径。 ./demo.rdb
target.address 目的Redis的连接地址与端口号。 ip:6379
target.password_raw 目的Redis的连接密码。 TargetPass233
target.db 设置待迁移的数据在目的Redis中的的逻辑数据库名,默认值为-1。当该值设置为-1时,逻辑数据库名在源Redis和目的Redis中的名称相同,即源DB0将被迁移至目的Redis中的DB0,DB1将被迁移至DB1。 -1
rewrite 如果目的Redis有与RDB文件中相同的key,是否覆盖,可选值:true(覆盖);false(不覆盖)。 说明 默认为true,如设置为false且存在数据冲突则会出现异常提示。
parallel RDB文件同步中使用的并发线程数,用于提高同步性能。 最小值为1,推荐值为64

测试:

$vim redis-shake-restore.conf      
id = redis-shake
# used in `decode` and `restore`.
# if the input is list split by semicolon(;), redis-shake will restore the list one by one.
# 如果是decode或者restore,这个参数表示读取的rdb文件。支持输入列表,例如:rdb.0;rdb.1;rdb.2
source.rdb.input = ./local_dump.0

target.type= standalone
target.address = 10.124.64.212:6001
target.password_raw = pwd123
target.auth_type = auth
target.db = -1
# 在rdb全量同步阶段,如果目标redis已经存在对应的key时是否覆盖,如果为false就抛异常
rewrite = true

#执行
$redis-shake -type=restore -conf=redis-shake-restore.conf 

#日志
tail -f  /var/log/redis-shake.log 
2020/01/13 17:06:43 [INFO] db_size:3 expire_size:0
2020/01/13 17:06:43 [INFO] routine[0] total = 218B -         218B [100%]  entry=3           
2020/01/13 17:06:43 [INFO] routine[0] restore: rdb done
2020/01/13 17:06:43 [INFO] restore from '[./local_dump.0]' to '[10.124.64.212:6001]' done
2020/01/13 17:06:43 [INFO] Enabled http stats, set status (incr), and wait forever.

2.4.4 sync模式

redis-shake sync模式参数说明:

参数 说明 示例
source.address 源Redis的连接地址与服务端口。 xxx.xxx.1.10:6379
source.password_raw 源Redis的连接密码。 SourcePass233
target.address 目的Redis的连接地址与服务端口。 xx.redis.rds.aliyuncs.com:6379
target.password_raw 目的Redis的连接密码。 TargetPass233
rewrite 如果目的Redis有相同的key,是否覆盖,可选值:true(覆盖);false(不覆盖)。 默认为true,为false且存在数据冲突则会出现异常提示。
target.db 待迁移的数据在目的Redis中的逻辑数据库名。当该值设置为-1时,源Redis和目的Redis中的名称相同 -1
parallel RDB文件同步中使用的并发线程数,用于提高同步性能。 最小值为1,推荐值为64
$vim redis-shake-cluster.conf  

2.4.5 rump模式

rump模式支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移。

2.5 监控

$curl 127.0.0.1:9320/metric | python -m json.tool

3. 环境准备

3.1 环境规划

3.2 redis-cluster安装

4. Redis-Cluster迁移

参考:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容