redis-migrate-tool
redis-migrate-tool是唯品會開源的redis遷移工具,可以實現熱遷移,實現aof/rdb文件遷移,可以全量或增量遷移,可以異構集羣遷移,可以輔助check遷移後的數據質量,簡直好用!
git地址:https://github.com/vipshop/redis-migrate-tool
遷移任務描述
兩個測試服務器集羣,需要將8億數據從3節點集羣遷移到5節點集羣。
源集羣:3主0從 172.18.5.9:6010 172.18.5.10:6020 172.18.5.11:6030
目的集羣:5主0從 172.18.5.14:6060 172.18.5.15:6070 172.18.5.16:6080 172.18.5.35:6090 172.18.5.36:6100
因爲特殊需求,測試服務器的配置比較高,物理機、全SSD盤、1T內存。
遷移過程
集羣參數修改
首先該工具必須保持到源集羣和目的集羣的長連接,如果設置了redis的timeout參數,請將其關閉:
redis-cli -c -p 6010 -h 172.18.5.9 config set timeout 0
redis-cli -c -p 6020 -h 172.18.5.10 config set timeout 0
redis-cli -c -p 6030 -h 172.18.5.11 config set timeout 0
redis-cli -c -p 6060 -h 172.18.5.14 config set timeout 0
redis-cli -c -p 6070 -h 172.18.5.15 config set timeout 0
redis-cli -c -p 6080 -h 172.18.5.16 config set timeout 0
redis-cli -c -p 6090 -h 172.18.5.35 config set timeout 0
redis-cli -c -p 6100 -h 172.18.5.36 config set timeout 0
啓動遷移任務
將遷移工具安裝在172.18.5.14:/app/redis-migrate-tool
注意該工具耗用內存,不能安裝在源集羣的服務器上
配置文件/app/redis-migrate-tool/rmt.conf:
[source]
type: redis cluster
servers :
-172.18.5.9:6010
[target]
type: redis cluster
servers :
-172.18.5.14:6060
[common]
listen: 0.0.0.0:8888
step: 3
threads: 30
mbuf_size: 1024
啓動遷移任務:src/redis-migrate-tool -c rmt.conf -o log -d
執行後遷移任務會作爲後臺服務運行
監控遷移狀態
# 看日誌
vim log
# 看遷移任務的狀態
redis-cli -c -p 8888 info
檢查數據一致性
# 源數據量
redis-cli -c -p 6010 -h 172.18.5.9 dbsize
redis-cli -c -p 6020 -h 172.18.5.10 dbsize
redis-cli -c -p 6030 -h 172.18.5.11 dbsize
# 目的數據量
redis-cli -c -p 6060 -h 172.18.5.14 dbsize
redis-cli -c -p 6070 -h 172.18.5.15 dbsize
redis-cli -c -p 6080 -h 172.18.5.16 dbsize
redis-cli -c -p 6090 -h 172.18.5.35 dbsize
redis-cli -c -p 6100 -h 172.18.5.36 dbsize
# 抽樣檢查數據質量
src/redis-migrate-tool -c rmt.conf -o log -C redis_check
遷移結果
遷移8億數據,耗時79分鐘。
運行無誤,最後的日誌輸出:
[2019-03-26 12:58:21.941] rmt_redis.c:1643 rdb file node172.18.5.10:6020-1553575005969542-590513.rdb write complete
[2019-03-26 13:18:28.633] rmt_redis.c:6601 Rdb file for node[172.18.5.11:6030] parsed finished, use: 1387 s.
[2019-03-26 13:18:33.586] rmt_redis.c:6709 All nodes' rdb file parsed finished for this write thread(0).
[2019-03-26 13:21:26.079] rmt_redis.c:6601 Rdb file for node[172.18.5.9:6010] parsed finished, use: 1391 s.
[2019-03-26 13:21:31.791] rmt_redis.c:6709 All nodes' rdb file parsed finished for this write thread(1).
[2019-03-26 13:25:13.356] rmt_redis.c:6601 Rdb file for node[172.18.5.10:6020] parsed finished, use: 1611 s.
[2019-03-26 13:25:18.501] rmt_redis.c:6709 All nodes' rdb file parsed finished for this write thread(2).
注意
- 只有源和目的都是redis節點或者redis集羣的時候才能使用redis_check做數據質量檢查,並不支持aof和rdb
- redis節點必須將timeout設置爲0,否則報錯
- 該工具的報錯非常簡潔,不利於debug