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实现限流的三种方式
Apr 27 Redis
Redis实现订单自动过期功能的示例代码
May 08 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis keys命令的具体使用
Jun 05 Redis
Grafana可视化监控系统结合SpringBoot使用
Redis官方可视化工具RedisInsight安装使用教程
Redis实现一个账号只能登录一个设备
Apr 19 #Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 #Redis
Redis实战高并发之扣减库存项目
Redis中key的过期删除策略和内存淘汰机制
解决 Redis 秒杀超卖场景的高并发
You might like
php长字符串定义方法
2012/07/12 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
EXT中xtype的含义分析
2010/01/07 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
vue如何进行动画的封装
2018/09/26 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
医学生自我鉴定范文
2014/03/26 职场文书
读群众路线的心得体会
2014/09/03 职场文书
骨干教师考核评语
2014/12/31 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书