1.我的場景
需要把本地的redis數據上傳到阿里云服務器上面,服務器上redis并沒有開aof持久化,但是將rdb文件上傳至服務器后每次重啟redis,rdb文件會被覆蓋導致無法同同步數據,最終決定使用RedisShake
2.RedisShake介紹
什么是 RedisShake?
RedisShake 是一個用于處理和遷移 Redis 數據的工具,它提供以下特性:
- Redis 兼容性:RedisShake 兼容從 2.8 到 7.2 的 Redis 版本,并支持各種部署方式,包括單機,主從,哨兵和集群。
- 云服務兼容性:RedisShake 與主流云服務提供商提供的流行 Redis-like 數據庫無縫工作,包括但不限于:
- 阿里云-云數據庫 Redis 版
- 阿里云-云原生內存數據庫Tair
- AWS - ElastiCache
- AWS - MemoryDB
- Module 兼容:RedisShake 與?TairString,TairZSet?和?TairHash?模塊兼容。
- 多種導出模式:RedisShake 支持 PSync,RDB 和 Scan 導出模式。
- 數據處理:RedisShake 通過自定義腳本實現數據過濾和轉換。
更詳細內容請見官方文檔
3.使用教程
3.1首先下載RedisShake
https://github.com/tair-opensource/RedisShake/releases
- 解壓后,得到 redis-shake 執行程序和 shake.toml 配置文件。windows系統自行將redis-shake加.exe后綴
3.2 編輯shake.toml配置文件
其中reader,用來對接不同的源端
- 對于從備份中恢復數據的場景,可以使用?
rdb_reader
。 - 對于數據遷移場景,優先選擇?
sync_reader
。一些云廠商沒有提供 PSync 協議支持,可以選擇scan_reader
。
3.2.1 rdb遷移
# 全局配置
log_file = "shake.log" # 日志文件路徑
log_level = "info" # 日志級別:info# 源數據
[rdb_reader]
filepath = "D:/develop/Redis-x64-3.2.100/dump.rdb" # 你的rdb文件位置
# 目標 Redis 配置# 目標redis
[redis_writer]
cluster = false # false就是單例, true是集群
address = "192.168.230.131:6379" # 如果cluster為true, 只需要填集群中的任意一個節點地址即可同步到整個集群
username = "" # ?開了ACL寫用戶名 沒開空著
password = "123456" # 如果有密碼,開沒開ACL都寫 否則空著
tls = false# 高級配置
[advanced]
pipeline_count_limit = 1024 # 默認管道大小
rdb_restore_command_behavior = "rewrite" # 遇到重復鍵時覆蓋
3.2.2? ? sync Reader
當源端數據庫兼容 PSync 協議時,推薦使用?sync_reader
優勢:數據一致性最佳,對源庫影響小,可以實現不停機的切換
# 全局配置
log_file = "shake.log" # 日志文件路徑
log_level = "info" # 日志級別:info# 源數據
[sync_reader]
cluster = false # set to true if source is a redis cluster
address = "127.0.0.1:6379" # when cluster is true, set address to one of the cluster node
username = "" # keep empty if not using ACL
password = "" # keep empty if no authentication is required
tls = false
sync_rdb = true # 是否同步 RDB,設置為 false 時,RedisShake 會跳過全量同步階段
sync_aof = true # 是否同步 AOF,設置為 false 時,RedisShake 會跳過增量同步階段,此時 RedisShake 會在全量同步階段結束后退出# 目標redis
[redis_writer]
cluster = false # false就是單例, true是集群
address = "192.168.230.131:6379" # 如果cluster為true, 只需要填集群中的任意一個節點地址即可同步到整個集群
username = "" # ?開了ACL寫用戶名 沒開空著
password = "123456" # 如果有密碼,開沒開ACL都寫 否則空著
tls = false# 高級配置
[advanced]
pipeline_count_limit = 1024 # 默認管道大小
rdb_restore_command_behavior = "rewrite" # 遇到重復鍵時覆蓋
3.2.3可選項
RedisShake 提供了多種內置的過濾規則,用戶可以根據需要選擇合適的規則。
[filter]
allow_keys = ["user:1001", "product:2001"] # 允許的鍵名
allow_key_prefix = ["user:", "product:"] # 允許的鍵名前綴
allow_key_suffix = [":active", ":valid"] # 允許的鍵名后綴
allow_key_regex = [":\\d{11}:"] # 允許的鍵名正則,11位手機號
block_keys = ["temp:1001", "cache:2001"] # 阻止的鍵名
block_key_prefix = ["temp:", "cache:"] # 阻止的鍵名前綴
block_key_suffix = [":tmp", ":old"] # 阻止的鍵名后綴
block_key_regex = [":test:\\d{11}:"] # 阻止的鍵名正則,11位手機號,前綴為test
如果不設置這些選項,默認允許所有鍵。
[filter]
allow_db = [0, 1, 2]
block_db = [3, 4, 5]
也可以指定遷移具體的庫或者阻止具體的庫, 不寫則默認所有庫進行遷移
3.3 執行redis-shake
redis-shake shake.toml
至此應該成功了,若顯示?redis-shake source db is not doing bgsave! continue.?
可以先看看數據遷移過去沒有,是有概率能遷移過去的,可以考慮從過濾項入手看一下,我將過濾項的allow_db刪掉后就不會出現那個問題了,其余的沒嘗試過請自行探索
4.官方文檔地址
https://tair-opensource.github.io/RedisShake/zh/