Redis数据同步之redis shake的实现方法


Posted in Redis onApril 21, 2022

前言

和很多同步工具一样,redis shake为同步redis数据而存在。在很多场景下,如果不使用同步工具,如果需要同步redis数据是一件相对繁琐的事情,可能需要编写代码,专门来做同步这件事,这就对开发提出了较高的要求,需要考虑到各种场景,

有了redis shake 之后,同步redis数据库数据变得容易了很多,其实我们可以猜想,它应该利用了解析redis的rdb或aof的文件来达到数据同步的目的,事实上也差不多,有了之前的canal的使用经验,其同步思想也如出一辙;

redis shake 简介

git地址:redis shake 官方地址

redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具

基本功能

redis-shake是我们基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。以下主要介绍同步sync;

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

基本原理

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

Redis数据同步之redis shake的实现方法

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

目前,redis-shake到目的端采用单链路实现,对于正常情况下,这不会成为瓶颈,但对于极端情况,qps比较大的时候,此部分性能可能成为瓶颈,后续我们可能会计划对此进行优化。另外,redis-shake到目的端的数据同步采用异步的方式,读写分离在2个线程操作,降低因为网络时延带来的同步性能下降;

更多内容请参阅官方说明

下面演示下,基于单节点模式下,使用redis shake完成redis两个节点数据库的完整过程;

环境准备

1、两个服务器(虚拟机或云服务器);

2、redis 的llinux版安装包;

下载地址:https://redis.io/download

wget https://download.redis.io/releases/redis-6.0.15.tar.gz

Redis数据同步之redis shake的实现方法

3、提前下载好 redis shake 安装包;

Redis数据同步之redis shake的实现方法

一、安装redis

在翻阅资料时,发现网上很多参考资料直接从redis shake开始,跳过了redis服务搭建步骤,为了方便学习和后续查阅,这里我们先快速搭建起redis服务,以便后面的演示;

1、更新机器的gcc相关依赖(本例redis为6.X版本,建议升级下gcc)

依次执行下面的命令

yum install centos-release-scl scl-utils-build #安装scl源

yum install -y devtoolset-9-toolchain  #安装9版本的gcc、gcc-c++、gdb工具链

scl enable devtoolset-9 bash         #设置版本生效,并再次查看版本(gcc -v)

注意:scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本;

设置版本长期生效: echo “source /opt/rh/devtoolset-9/enable” >>/etc/profile

2、安装redis

tar -xzf redis-6.0.15.tar.gz

cd redis-6.0.15

make

3、进入redis主目录,修改redis.conf文件

以下列举出主要修改的配置项,其他配置保持默认就好

bind 0.0.0.0  #测试使用的时候,可以使用4个0,生产环境下建议绑定本机IP

protected-mode no #是否开启保护模式,测试使用时候可以使用no

port 6379 #对外暴露的端口

requirepass 123456  #是否设置客户端连接密码【测试时候嫌麻烦可以注释掉】

daemonize no  #是否使用守护进程方式启动服务【测试使用时,可以使用no,即启动时候图形化展示】

4、进入src目录,启动redis服务

./redis-server …/redis.conf

Redis数据同步之redis shake的实现方法

5、进入src目录,启动客户端验证下

./redis-cli 或 ./redis-cli -p 3306

Redis数据同步之redis shake的实现方法

通过以上步骤,redis服务就搭建完毕,使用同样的方法在另一个机器上也把redis服务搭建起来吧;

二、redis shake使用步骤

1、下载redis shake安装包(上文已说明);

2、解压安装包;

tar -zxvf redis…
mv redis-shake-v2.0.3 redis-shake

Redis数据同步之redis shake的实现方法

3、进入主目录,修改 redis-shake.conf 文件

Redis数据同步之redis shake的实现方法

其实使用redis-shake 和其他同步工具类似,主要是修改配置文件,根据自身的实际情况做调整,比如有的是主从模式,有的是哨兵模式,还有的是单机模式等,不同的模式,配置文件中的相关参数也需要做适当的调整;

如下列举出核心的需要修改的配置,结合了本例的实际情况,

# source redis configuration.
# used in `dump`, `sync` and `rump`.
# source redis type, e.g. "standalone" (default), "sentinel" or "cluster".
#   1. "standalone": standalone db mode.
#   2. "sentinel": the redis address is read from sentinel.
#   3. "cluster": the source redis has several db.
#   4. "proxy": the proxy address, currently, only used in "rump" mode.
# 源端redis的类型,支持standalone,sentinel,cluster和proxy四种模式,注意:目前proxy只用于rump模式。
source.type = standalone  #【单机模式下直接使用standalone 即可】

# 源redis地址
source.address = 127.0.0.1:6379  #【本例从本机同步到远程的redis上】

# password.
source.password_raw = 123456 #【如果没有设置密码,可以不用填】

# auth type, don't modify it
source.auth_type = auth


# target redis configuration. used in `restore`, `sync` and `rump`.
# the type of target redis can be "standalone", "proxy" or "cluster".
#   1. "standalone": standalone db mode.
#   2. "sentinel": the redis address is read from sentinel.
#   3. "cluster": open source cluster (not supported currently).
#   4. "proxy": proxy layer ahead redis. Data will be inserted in a round-robin way if more than 1 proxy given.
# 目的redis的类型,支持standalone,sentinel,cluster和proxy四种模式。
target.type = standalone  #【单机模式下直接使用standalone 即可】

# 目的redis地址
target.address = 目的地IP:6379

# password.
target.password_raw = 123456 #【如果没有设置密码,可以不用填】

# auth type, don't modify it
target.auth_type = auth
# version number, default is 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)

target.version = 6
# all the data will come into this db. < 0 means disable.
# used in `restore` and `sync`.
target.db = -1

# 当源目的有重复key,是否进行覆写
rewrite = true

其他的配置可以保持默认即可,在正式同步之前,我们先在本机上做几条测试数据

Redis数据同步之redis shake的实现方法

而在远程机器上,此时没有任何数据

Redis数据同步之redis shake的实现方法

然后在redis-shake主目录下,执行如下的同步命令

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

看到下面的图示,表示执行成功,

Redis数据同步之redis shake的实现方法

Redis数据同步之redis shake的实现方法

 到此这篇关于redis shake同步redis数据的实现方法的文章就介绍到这了!


Tags in this post...

Redis 相关文章推荐
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
Redis持久化与主从复制的实践
Apr 27 Redis
详解缓存穿透击穿雪崩解决方案
May 28 Redis
使用redis生成唯一编号及原理示例详解
Sep 15 Redis
基于Redis结合SpringBoot的秒杀案例详解
Oct 05 Redis
Redis模仿手机验证码发送的实现示例
Nov 02 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
Redis调用Lua脚本及使用场景快速掌握
Mar 16 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Mar 17 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
Grafana可视化监控系统结合SpringBoot使用
Redis官方可视化工具RedisInsight安装使用教程
Redis实现一个账号只能登录一个设备
Apr 19 #Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 #Redis
Redis实战高并发之扣减库存项目
Redis中key的过期删除策略和内存淘汰机制
解决 Redis 秒杀超卖场景的高并发
You might like
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
yii操作session实例简介
2014/07/31 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
vue的for循环使用方法
2019/02/12 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python实现BackPropagation算法
2017/12/14 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python制作简单五子棋游戏
2019/06/18 Python
Python数据可视化图实现过程详解
2020/06/12 Python
浅谈python锁与死锁问题
2020/08/14 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
大学生应聘自荐信
2013/10/11 职场文书
项目资料员岗位职责
2013/12/10 职场文书
房展策划方案
2014/06/07 职场文书
银行委托书范本
2014/09/28 职场文书
2014年食堂工作总结
2014/11/20 职场文书
人事局接收函
2015/01/30 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python