前言
和很多同步工具一样,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-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
3、提前下载好 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
5、进入src目录,启动客户端验证下
./redis-cli 或 ./redis-cli -p 3306
通过以上步骤,redis服务就搭建完毕,使用同样的方法在另一个机器上也把redis服务搭建起来吧;
二、redis shake使用步骤
1、下载redis shake安装包(上文已说明);
2、解压安装包;
tar -zxvf redis…
mv redis-shake-v2.0.3 redis-shake
3、进入主目录,修改 redis-shake.conf 文件
其实使用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-shake主目录下,执行如下的同步命令
./redis-shake.linux -conf=redis-shake.conf -type=sync
看到下面的图示,表示执行成功,
到此这篇关于redis-shake同步redis数据的实现方法的文章就介绍到这了,更多相关redis-shake同步redis数据内容请搜索好代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好代码网!