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
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
基于Redis位图实现用户签到功能
May 08 Redis
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
解析redis hash应用场景和常用命令
Aug 04 Redis
使用redis生成唯一编号及原理示例详解
Sep 15 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis集群节点通信过程/原理流程分析
Mar 18 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
Redis高并发缓存架构性能优化
May 15 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跨站刷票的实现代码
2013/06/18 PHP
php 获取本地IP代码
2013/06/23 PHP
PHP速成大法
2015/01/30 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
JavaScript实现简单计算器
2020/03/19 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
python修改字典内key对应值的方法
2015/07/11 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
pandas 将索引值相加的方法
2018/11/15 Python
Python二维码生成识别实例详解
2019/07/16 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
Python 中Operator模块的使用
2021/01/30 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
自主招生自荐信范文
2013/12/04 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
js 数组 fill() 填充方法
2021/11/02 Javascript