前言

最近线上一台自建redis服务的服务器频繁报警,内存使用率有点高,这是一台配置比较简陋(2C8G)的机子了,近期也打算准备抛弃它了。抛弃之前需对原先的数据进行迁移,全量数据,增量数据都需要考虑,确保数据不丢失,在网上查了下发现了阿里自研的RedisShake工具,据说很妙,那就先试试吧。

实战

正式操作前先在测试环境实践一把看看效果如何,先说明下环境

源库:192.168.28.142

目标库:192.168.147.128

步骤一:

使用wget命令下载至本地

wget https://github.com/alibaba/RedisShake/releases/download/release-v2.0.2-20200506/redis-shake-v2.0.2.tar.gz

步骤二:

解压,进入相应目录看看有哪些东东

[root@dev ~]# cd /opt/redis-shake/
[root@dev redis-shake]# ls
redis-shake-v2.0.2.tar.gz
[root@dev redis-shake]# tar -zxvf redis-shake-v2.0.2.tar.gz
redis-shake-v2.0.2/
redis-shake-v2.0.2/redis-shake.darwin
redis-shake-v2.0.2/redis-shake.windows
redis-shake-v2.0.2/redis-shake.conf
redis-shake-v2.0.2/ChangeLog
redis-shake-v2.0.2/stop.sh
redis-shake-v2.0.2/start.sh
redis-shake-v2.0.2/hypervisor
redis-shake-v2.0.2/redis-shake.linux
[root@dev redis-shake]# ls
redis-shake-v2.0.2 redis-shake-v2.0.2.tar.gz
[root@dev redis-shake]# cd redis-shake-v2.0.2
[root@dev redis-shake-v2.0.2]# ls
ChangeLog hypervisor redis-shake.conf redis-shake.darwin redis-shake.linux redis-shake.windows start.sh stop.sh

步骤三:

更改配置文件redis-shake.conf

日志输出

# log file,日志文件,不配置将打印到stdout (e.g. /var/log/redis-shake.log )
log.file =/opt/redis-shake/redis-shake.log

源端连接配置

# ip:port
# the source address can be the following:
# 1. single db address. for "standalone" type.
# 2. ${sentinel_master_name}:${master or slave}@sentinel single/cluster address, e.g., mymaster:master@127.0.0.1:26379;127.0.0.1:26380, or @127.0.0.1:26379;127.0.0.1:26380. for "sentinel" type.
# 3. cluster that has several db nodes split by semicolon(;). for "cluster" type. e.g., 10.1.1.1:20331;10.1.1.2:20441.
# 4. proxy address(used in "rump" mode only). for "proxy" type.
# 源redis地址。对于sentinel或者开源cluster模式,输入格式为"master名字:拉取角色为master或者slave@sentinel的地址",别的cluster
# 架构,比如codis, twemproxy, aliyun proxy等需要配置所有master或者slave的db地址。
source.address = 192.168.28.142:6379
# password of db/proxy. even if type is sentinel.
source.password_raw = xxxxxxx

目标端设置

# ip:port
# the target address can be the following:
# 1. single db address. for "standalone" type.
# 2. ${sentinel_master_name}:${master or slave}@sentinel single/cluster address, e.g., mymaster:master@127.0.0.1:26379;127.0.0.1:26380, or @127.0.0.1:26379;127.0.0.1:26380. for "sentinel" type.
# 3. cluster that has several db nodes split by semicolon(;). for "cluster" type.
# 4. proxy address. for "proxy" type.
target.address = 192.168.147.128:6379
# password of db/proxy. even if type is sentinel.
target.password_raw = xxxxxx
# auth type, don't modify it
target.auth_type = auth
# all the data will be written into this db. < 0 means disable.
target.db = -1

步骤四

./start.sh redis-shake.conf sync

查看日志文件

2020/05/15 09:00:29 [INFO] DbSyncer[0] starts syncing data from 192.168.28.142:6379 to [192.168.147.128:6379] with http[9321], enableResumeFromBreakPoint[false], slot boundary[-1, -1]
2020/05/15 09:00:29 [INFO] DbSyncer[0] psync connect '192.168.28.142:6379' with auth type[auth] OK!
2020/05/15 09:00:29 [INFO] DbSyncer[0] psync send listening port[9320] OK!
2020/05/15 09:00:29 [INFO] DbSyncer[0] try to send 'psync' command: run-id[?], offset[-1]
2020/05/15 09:00:29 [INFO] Event:FullSyncStart Id:redis-shake
2020/05/15 09:00:29 [INFO] DbSyncer[0] psync runid = 0a08aa75b91f8724014e056cd2c3068eebf81ec4, offset = 126, fullsync
2020/05/15 09:00:30 [INFO] DbSyncer[0] +
2020/05/15 09:00:30 [INFO] DbSyncer[0] rdb file size = 45173748
2020/05/15 09:00:30 [INFO] Aux information key:redis-ver value:4.0.10
2020/05/15 09:00:30 [INFO] Aux information key:redis-bits value:64
2020/05/15 09:00:30 [INFO] Aux information key:ctime value:1589521609
2020/05/15 09:00:30 [INFO] Aux information key:used-mem value:66304824
2020/05/15 09:00:30 [INFO] Aux information key:repl-stream-db value:0
2020/05/15 09:00:30 [INFO] Aux information key:repl-id value:0a08aa75b91f8724014e056cd2c3068eebf81ec4
2020/05/15 09:00:30 [INFO] Aux information key:repl-offset value:126
2020/05/15 09:00:30 [INFO] Aux information key:aof-preamble value:0
2020/05/15 09:00:30 [INFO] db_size:8 expire_size:0
2020/05/15 09:00:31 [INFO] DbSyncer[0] total = 43.08MB - 10.87MB [ 25%] entry=0 filter=4
2020/05/15 09:00:32 [INFO] DbSyncer[0] total = 43.08MB - 21.78MB [ 50%] entry=0 filter=5
2020/05/15 09:00:33 [INFO] DbSyncer[0] total = 43.08MB - 32.64MB [ 75%] entry=0 filter=5
2020/05/15 09:00:34 [INFO] DbSyncer[0] total = 43.08MB - 42.92MB [ 99%] entry=0 filter=6
2020/05/15 09:00:34 [INFO] db_size:1 expire_size:0
2020/05/15 09:00:34 [INFO] db_size:48 expire_size:12
2020/05/15 09:00:34 [INFO] db_size:533 expire_size:468
2020/05/15 09:00:34 [INFO] DbSyncer[0] total

查看下数据同步情况,如下图,发现所有的库都同步过来了,非常nice。



但如果只想同步某个库又该怎么操作呢?

马上查阅了配置文件及官方文档,稍作调整就可以,具体如下

配置项 说明
target.db 设置待迁移的数据在目的Redis中的逻辑数据库名。例如,要将所有数据迁移到目的Redis中的DB10,则需将此参数的值设置为10。当该值设置为-1时,逻辑数据库名在源Redis和目的Redis中的名称相同,即源Redis中的DB0将被迁移至目的Redis中的DB0,DB1将被迁移至DB1,以此类推。
filter.db.whitelist 指定的db被通过,比如0;5;10将会使db0, db5, db10通过, 其他的被过滤

那比如我这边只想把源端的10库同步至目标端的10库只需对配置文件进行如下改动

target.db = 10
filter.db.whitelist =10

重新执行步骤四命令,执行后效果如下,大功告成。

另外还有一个配置项特意说明下

配置项 说明
key_exists 当源目的有重复key,是否进行覆写。rewrite表示源端覆盖目的端。none表示一旦发生进程直接退出。ignore表示保留目的端key,忽略源端的同步key。该值在rump模式下没有用。

当前仅仅是单个节点到单个节点的同步,如涉及到集群等其他一些场景下,请参考官方文档说明,自行测试。

参考文档

Redis数据迁移同步工具(redis-shake)的更多相关文章

  1. Redis数据迁移方案

    场景 Redis实例A ---> Redis实例B,整库全量迁移 方案一: mac环境 brew install npm npm install redis-dump -g 针对RedisA: ...

  2. Python进行Redis数据迁移

    Python进行Redis数据迁移 由于开发时的误操作,导致redis数据损坏,所以需要进行redis的数据迁移,网上大佬的教程基本都是需要下载附加工具,亦或是需要一些复杂的操作,个人觉得麻烦还不如写 ...

  3. Redis 数据迁移 & 数据审计

    Redis 数据迁移 安装迁移工具 # 安装依赖 [root@dbtest03 ~]# yum install -y automake libtool autoconf bzip2 git # 拉取工 ...

  4. canal整合springboot实现mysql数据实时同步到redis

    业务场景: 项目里需要频繁的查询mysql导致mysql的压力太大,此时考虑从内存型数据库redis里查询,但是管理平台里会较为频繁的修改增加mysql里的数据 问题来了: 如何才能保证mysql的数 ...

  5. Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程

    原文:Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程 Red Gate系列之四 SQL Data Compare ...

  6. redis数据迁移

    redis的备份和还原,借助了第三方的工具---redis-dump,  redis中使用redis-dump导出.导入.还原数据实例 1.安装redis-dump # yum install rub ...

  7. 使用rdb文件进行redis数据迁移--python脚本

    查找了一些redis迁移的方法,一般做法就是 1. 从源数据库把rdb文件保存,然后传到新的主机上,启动新的redis即可 2. 把新的redis当做源数据库的slave,同步数据 今天开发提了一个测 ...

  8. Redis数据迁移的三个方法

    为什么80%的码农都做不了架构师?>>>   1. rdb数据备份恢复方法 redis 127.0.0.1:6379> SAVE OK 或者 redis-cli -h 127. ...

  9. redis数据迁移操作

    redis客户端连接命令,分别连接旧环境中的主从redis Src目录下./redis-cli -h IP -p PORT 使用info replication 命令找出主redis使用客户端命令连接 ...

随机推荐

  1. 洛谷P3018 [USACO11MAR]树装饰Tree Decoration

    洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...

  2. R 语言命令行参数处理

    在unix.windows外部需要调用R脚本执行,然后又需要输入不同的参数,类似shell脚本的命令行参数输入,可以使用Rcript命令实现. 命令格式:Rscript [options] [-e e ...

  3. shell之路 shell核心语法【第一篇】shell初识

    shell简介 1.Shell是Unix的脚本语言,是与 Unix/Linux 交互的工具,shell使用的熟练程度反映了用户对Unix/Linux使用的熟练程度 2.Shell是系统命令+程序逻辑的 ...

  4. xenomai内核解析之xenomai的组成结构

    @ 目录 一.xenomai 3 二.xenomai3 结构 这是第二篇笔记. 一.xenomai 3 从xenomai3开始支持两种方式构建linux实时系统,分别是cobalt 和 mercury ...

  5. 使用Redis构建电商网站

    涉及到的key: 1. login,hash结构,存储用户token与用户ID之间的映射. 2. recent_tokens,存储最近登陆用户token,zset结构 member: token,sc ...

  6. 最长公共子串(Longest common substring)

    问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...

  7. learn from collection framework design

    最难忍受的痛苦,也许是想干一件事情而又不去干.--罗曼·罗兰 前言 本篇文章算是拾人牙慧吧,偶尔谷歌到一个能很好把collection framework design讲好的文档,一是为了总结提升,也 ...

  8. [LA7139 Rotation(2014 shanghai onsite)]二维树状数组

    题意:有一个n*m的矩形,一辆车从左上角出发,沿一条路径走,路径是由矩形上每个单元格的边构成的,最后回到左上角,求车子在每个格子转过圈数的平方和. 思路:假设需要记录每个格子转的顺时针的圈数(为负表示 ...

  9. [hdu4888]最大流,判断最大流唯一性

    题意:给一个n*m的矩形,往每个格子填0-k的数字,使得对第i行和为row[i],第i列和为col[i],问是否存在方案,方案是否唯一,如果方案唯一则输出具体方案. 思路:首先根据问题提取对象,行.列 ...

  10. iNeuOS工业互联平台,实现动态图元、计算平台、远程控制、数据转发等,和大厂相比如何

    目       录 1.      概述... 2 2.      平台演示... 2 3.      增加按钮组态元件... 2 4.      组态图元旋转及动画... 3 5.      后台容 ...