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 12 Redis
详解Redis集群搭建的三种方式
May 31 Redis
详解Redis复制原理
Jun 04 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
解决redis批量删除key值的问题
Mar 23 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
解决 redis 无法远程连接
May 15 Redis
一文教你快速生成MySQL数据库关系图
Jun 28 Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 Redis
Grafana可视化监控系统结合SpringBoot使用
Redis官方可视化工具RedisInsight安装使用教程
Redis实现一个账号只能登录一个设备
Apr 19 #Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 #Redis
Redis实战高并发之扣减库存项目
Redis中key的过期删除策略和内存淘汰机制
解决 Redis 秒杀超卖场景的高并发
You might like
PHP产生随机字符串函数
2006/12/06 PHP
PHP define函数的使用说明
2008/08/27 PHP
FleaPHP的安全设置方法
2008/09/15 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
php实现删除空目录的方法
2015/03/16 PHP
js 如何实现对数据库的增删改查
2012/11/23 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Python ini文件常用操作方法解析
2020/04/26 Python
python zip()函数的使用示例
2020/09/23 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
巴西宠物商店:Cobasi
2019/04/19 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
《搭石》教学反思
2014/04/07 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏