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 Cluster 字段模糊匹配及删除
May 27 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis特殊数据类型bitmap位图
Jun 01 Redis
Redis全局ID生成器的实现
Jun 05 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 Redis
Grafana可视化监控系统结合SpringBoot使用
Redis官方可视化工具RedisInsight安装使用教程
Redis实现一个账号只能登录一个设备
Apr 19 #Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 #Redis
Redis实战高并发之扣减库存项目
Redis中key的过期删除策略和内存淘汰机制
解决 Redis 秒杀超卖场景的高并发
You might like
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
微信支付的开发流程详解
2016/09/13 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
保护动物倡议书
2014/04/15 职场文书
暑假学习心得体会
2014/09/02 职场文书
个人买房协议书范本
2014/10/06 职场文书
聘用合同范本
2015/09/21 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript