面試官: 兩個Redis集群 如何平滑數據遷移
- 2019 年 11 月 7 日
- 筆記
問題
由於生產環境的各種原因,我們需要對現有伺服器進行遷移,包括線上正在運行的 redis 集群環境 如何去做?
涉及到數據源變動,原有數據如何平滑遷移到新實例,從而可以實現無縫遷移?
方案匯總
基於 redis 自身的RDB/AOF 備份機制

- 執行
savebgsave
觸發數據持久化RDB
文件 - 拷貝redis備份文件(dump.rdb)到目標機器
- 重啟目標實例重新
load
RDB 文件
- 關於 save/bgsave 的區別
命令 |
save |
bgsave |
---|---|---|
IO阻塞 |
同步 |
非同步 |
複雜度 |
O(n) |
O(n) |
缺點 |
阻塞客戶端 |
需要fork,消耗記憶體 |
基於 redis-dump
導入導出 json
備份
redis-dump 基於JSON 備份還原Redis的數據https://github.com/delano/redis-dump

# 導出命令 redis-dump –u 127.0.0.1:6379 > lengleng.json # 導出指定資料庫數據 redis-dump -u 127.0.0.1:6379 -d 15 > lengleng.json # 如果redis設有密碼 redis-dump –u :[email protected]:6379 > lengleng.json # 導入命令 < lengleng.json redis-load # 指定redis密碼 < lengleng.json redis-load -u :[email protected]:6379
基於 redis-shake
實現 redis-cluster
遷移
redis-shake是阿里雲Redis&MongoDB團隊開源的用於redis數據同步的工具https://github.com/alibaba/RedisShake。

- 基於
Docker
創建兩個集群
docker run --name redis-cluster1 -e CLUSTER_ANNOUNCE_IP=192.168.0.31 -p 8000-8005:7000-7005 -p 18000-18005:17000-17005 pig4cloud/redis-cluster:4.0
docker run --name redis-cluster2 -e CLUSTER_ANNOUNCE_IP=192.168.0.31 -p 8000-8005:7000-7005 -p 18000-18005:17000-17005 pig4cloud/redis-cluster:4.0
- 配置
redis-shake.conf
source.type: cluster source.address: [email protected]:7000 #配置一個節點自動發現 target.type: cluster target.address: [email protected]:8000 #配置一個節點自動發現
- 執行全量、增量同步

- restful監控指標
# 用戶可以通過restful監控指標查看內部運行狀況,默認的restful埠是9320: http://127.0.0.1:9320/metric