阿里云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"
- 对于普通客户端来说,限制为0,也就是不限制。因为普通客户端通常采用阻塞式的消息应答模式,何谓阻塞式呢?如:发送请求,等待返回,再发送请求,再等待返回。这种模式下,通常不会导致Redis服务器输出缓冲区的堆积膨胀;
- 对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端连接;
- 对于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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义