赞
踩
redis-shake是基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。以下主要介绍同步sync。
基本原理
redis-shake 的基本原理就是模拟一个从节点加入源redis集群,首先进行全量拉取并回放,然后进行增量的拉取(通过psync命令)。
注意事项
如果目标库的数据逐出策略(maxmemory-policy)配置为noeviction以外的值,可能导致目标库的数据与源库不一致。关于数据逐出策略详情,请参见Redis数据逐出策略介绍。
如果源库中的某些Key使用了过期(expire)机制,由于可能存在Key已过期但未被及时删除的情形,所以在目标库中查看(如通过info命令)到的Key数量会比源库的Key数量少。
不要在同一个目录运行两个 RedisShake 进程,因为运行时产生的临时文件可能会被覆盖,导致异常行为。
不要降低 Redis 版本,比如从 6.0 降到 5.0,因为 RedisShake 每个大版本都会引入一些新的命令和新的编码方式,如果降低版本,可能会导致不兼容。
说明:源和目标库中,未设置过期机制或未过期的Key数量是一致的。
wget https://github.com/alibaba/RedisShake/releases/download/v3.1.2/redis-shake.tar.gz
mkdir redis-shake
tar xf redis-shake.tar.gz -C redis-shake
注意:需要找一个磁盘空间大的目录进行迁移
cat >redis-shake.toml<<'EOF' type = "sync" [source] address = "10.10.8.203:6379" # 来源实例的ip及端口 username = "" # 如果不使用ACL,请保持为空 password = "Passw0rd" # 如果不需要密码,请保持为空 tls = false elasticache_psync = "" # using when source is ElastiCache. ref: https://github.com/alibaba/RedisShake/issues/373 [target] type = "standalone" # 单机或哨兵写:"standalone",集群写:"cluster" address = "10.10.8.204:6379" # 新实例的ip及端口 username = "" # 如果不使用ACL,请保持为空 password = "Passw0rd" # 如果不需要密码,请保持为空 tls = false [advanced] dir = "data" ncpu = 4 pprof_port = 0 metrics_port = 0 log_file = "redis-shake.log" log_level = "info" # debug, info or warn log_interval = 5 # in seconds rdb_restore_command_behavior = "rewrite" # panic, rewrite or skip pipeline_count_limit = 1024 target_redis_client_max_querybuf_len = 1024_000_000 target_redis_proto_max_bulk_len = 512_000_000 EOF
**注意非单机请参阅官方文档进行配置:**https://github.com/alibaba/RedisShake/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%EF%BC%9A%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB
nohup ./redis-shake-linux-amd64 redis-shake.toml &
# 单实例开启只读模式
slaveof 127.0.0.1 6379
# 单实例关闭只读模式
slaveof no one
127.0.0.1:6379> select 0
127.0.0.1:6379> DBSIZE
127.0.0.1:6379> select 1
127.0.0.1:6379> DBSIZE
127.0.0.1:6379> select 2
······
127.0.0.1:6379> select 16
127.0.0.1:6379> DBSIZE
切换应用即可
将0库的数据同步到其他实例的15库
单库同步只需要修改db_id == 0
(0代表0库) 和 return 0, 15
(15代表15库,这里的0不要修改)即可。
vim /root/redis-shake/filters/swap_db.lua
function filter(id, is_base, group, cmd_name, keys, slots, db_id, timestamp_ms)
if db_id == 0 then
return 0, 15
else
return 1, db_id
end
end
将0库同步到14库,将1库同步到15库
多库同步只是在后面加 elseif 条件就可以了,具体操作同单库。
vim /root/redis-shake/filters/swap_db.lua
function filter(id, is_base, group, cmd_name, keys, slots, db_id, timestamp_ms)
if db_id == 0 then
return 0, 14
elseif db_id == 1 then
return 0, 15
else
return 1, db_id
end
end
运行
./redis-shake-linux-amd64 redis-shake.toml /root/redis-shake/filters/swap_db.lua
迁移 redis 流程:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。