阿里云redis-shake

一、介绍

redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。下载地址: https://github.com/alibaba/RedisShake/releases?spm=a2c6h.12873639.article-detail.4.4b8974957Y7slI

二、配置

第一次使用,如何进行配置: https://github.com/alibaba/RedisShake/wiki/第一次使用,如何进行配置?
官方介绍: https://developer.aliyun.com/article/691794

conf.version = 1
id = redis-shake-calling_scheduling
log.file = /root/RedisShake-release-v2.1.2-20220329/logs/redis-shake-calling_scheduling.log
log.level = info
pid_path = /root/RedisShake-release-v2.1.2-20220329/logs/
system_profile = 9310
http_profile = 9320
parallel = 32
source.type = standalone
source.address = user:password
source.auth_type = auth
source.tls_enable = false
source.tls_skip_verify = false
source.rdb.input =
source.rdb.parallel = 0
source.rdb.special_cloud = 
target.type = proxy
target.address = proxy_addr:6379
target.password_raw =
target.auth_type = auth
target.db = -1
target.dbmap =
target.tls_enable = false
target.tls_skip_verify = false
target.rdb.output = local_dump
target.version = 5.0
fake_time =
key_exists = none
filter.db.whitelist = 4
filter.db.blacklist =
filter.key.whitelist =
filter.key.blacklist =
filter.slot =
filter.command.whitelist =
filter.command.blacklist =
filter.lua = false
big_key_threshold = 524288000
metric = true
metric.print_log = true
sender.size = 104857600
sender.count = 4095
sender.delay_channel_size = 65535
keep_alive = 1
scan.key_number = 50
scan.special_cloud =
scan.key_file =
qps = 200000
resume_from_break_point = false
replace_hash_tag = false

三、启动

3.1 支持场景

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版本的迁移。

3.2 安装 并启动 使用sync同步

wget https://github.com/alibaba/RedisShake/releases/download/release-v2.1.2-20220329/release-v2.1.2-20220329.tar.gz
tar xf release-v2.1.2-20220329.tar.gz
cd RedisShake-release-v2.1.2-20220329
bash build.sh
nohup ./redis-shake.linux -conf redis-shake.conf -type sync &  # 使用sync同步

四、遇到的问题

4.1 read error, please check source redis log or network

两个解决方向
① 修改redis的client-output-buffer-limit pubsub

CONFIG GET *
167) "client-output-buffer-limit"
168) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"  
  1. 对于普通客户端来说,限制为0,也就是不限制。因为普通客户端通常采用阻塞式的消息应答模式,何谓阻塞式呢?如:发送请求,等待返回,再发送请求,再等待返回。这种模式下,通常不会导致Redis服务器输出缓冲区的堆积膨胀;
  2. 对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端连接;
  3. 对于slave客户端来说,大小限制是256M,持续性限制是当客户端缓冲区大小持续60秒超过64M,则关闭客户端连接。
  • 具体参数的意义:
    class: 客户端种类,包括Normal,Slaves和Pub/Sub
    Normal: 普通的客户端。默认limit 是0,也就是不限制。
    Pub/Sub: 发布与订阅的客户端的。默认hard limit 32M,soft limit 8M/60s。
    Slaves: 从库的复制客户端。默认hard limit 256M,soft limit 64M/60s。
    hard limit: 缓冲区大小的硬性限制。
    soft limit: 缓冲去大小的软性限制。
    soft seconds: 缓冲区大小达到了(超过)soft limit值的持续时间。
    client-output-buffer-limit参数限制分配的缓冲区的大小,防止内存无节制的分配,Redis将会做如下自我保护:
    client buffer的大小达到了soft limit并持续了soft seconds时间,将立即断开和客户端的连接
    client buffer的大小达到了hard limit,server也会立即断开和客户端的连接
    所以需要client-output-buffer-limit slave项的配置,将其改为0 0 0 。重启主库即可解决这种由scheduled to be closed ASAP for overcoming of output buffer limits引起的Redis is LOADING the dataset问题。当然引起Redis is LOADING the dataset问题还有其它的原因,比如内存不足。导致使用SWAP,这样redis加载数据的性能会大大降低导致报错Redis is LOADING the dataset。

② 修改redis-shake的keep_alive
我这边下载redis-shake的时候,keep_alive 默认是0 ,我这边修改为1后,就不会有这个报错了

4.2 redis数据同步keys数量不对

这个是因为redis对于过期key的策略,官方文档:https://redis.io/commands/expire/

Redis 如何使密钥过期 (How Redis expires keys)

Redis 密钥以两种方式过期:被动方式和主动方式。

  • 被动方式: 仅当某些客户端尝试访问密钥时,密钥就会被动过期,并且发现密钥已超时。

  • 主动方式: 当然这还不够,因为有过期的密钥将永远不会被再次访问。这些密钥无论如何都应该过期,因此 Redis 会定期在设置过期的密钥中随机测试几个密钥。所有已经过期的键都会从键空间中删除

    具体来说,这是 Redis 每秒执行 10 (redis.conf中的hz参数代表每秒执行的次数,也可以通过config get hz获取,config set hz 1 设置)次的操作:

    1.从具有关联过期时间的密钥集中测试 20 个随机密钥。
    2.删除所有发现过期的密钥。
    3.如果超过 25% 的密钥过期,请从步骤 1 重新开始。
    这是一个简单的概率算法,基本上假设我们的样本代表了整个密钥空间,并且我们继续过期直到可能过期的密钥百分比低于 25%
    这意味着在任何给定时刻,使用内存的已过期密钥的最大数量等于每秒最大写入操作量除以 4。

删除过期key的方法

可以使用scan命令,将所有key扫描一遍,因为如果key过期,scan扫描时会访问到这些key,进而可以将已过期的key被真实的删除
示例:

# 将每秒扫描次数哦降低为1次
redis-cli -p 6310 -a 6310 config set hz 1

# 生成一万个key定时过期的key
for i in  `seq 1 10000`;do  redis-cli -p 6310 -a 6310 set key${i} value${i} EX ${i};done

# 生成完以后,等几分钟,查看key的个数
redis-cli -p 6310 -a 6310 info keyspace
# Keyspace
db0:keys=9962,expires=9962,avg_ttl=4598679

# 使用scan扫描
redis-cli -p 6310 -a 6310 scan 0 count 2500 | head -1
10498
redis-cli -p 6310 -a 6310 scan 10498 count 2500 | head -1
6654
redis-cli -p 6310 -a 6310 scan 6654 count 2500 | head -1
509
redis-cli -p 6310 -a 6310 scan 509 count 2500 | head -1
0

# 再次查看key的个数
redis-cli -p 6310 -a 6310 info keyspace
# Keyspace
db0:keys=9755,expires=9755,avg_ttl=4907100
posted @ 2022-04-15 12:15  董大轩  阅读(475)  评论(0编辑  收藏  举报