1、背景
某客戶卡卷Redis叢集資料遷移到阿裡雲redis,通過redis-shake工具遷移,遇到如下問題:
①源端:idc自建redis cluster,版本3.0.5,庫中key基本都帶過期時間
②目标端:阿裡雲redis 4分片叢集,版本4.0
③通過redis-shake工具遷移,初始化完成,日志顯示sync rdb done,進入增量階段,發現目标庫比源庫少好多key,重試了多次,資料仍有缺失。
2、問題排查
2.1、觀察redis-shake日志
sync初始化完成進入增量,日志如下:
2.2、通過redis-full-check進行校驗
在上面初始化完成,進入增量後,通過redis-full-check校驗資料,發現源端和目标端key相差較大,資訊如下:
2.3、檢視rdb檔案
這次拿的的redis-shake工具備份的備份檔案,在檢視備份檔案rdb時發現,上面目标端缺少的key在rdb中沒有,但是實際在源端是存在的。
因為備份的檔案看出有問題,這次去拿實際的redis rdb檔案,登入到redis叢集伺服器,檢視redis參數檔案,找到rdb檔案相關資訊,發現
①三個主節點配置的dbfilename dump.rdb;dir ./這兩個參數都是一樣的
②去拿rdb檔案,發現伺服器上dump.rdb隻有一個,結合上面參數的設定,懷疑三個主節點都寫入到了同一個dump.rdb中
③檢視redis三個主節點啟動路徑,驗證②中的猜測
從這裡可以看到,redis叢集主節點啟動路徑是一樣的,多個節點資料都寫入到了一個dump.rdb檔案中。
2.4、redis-shake sync
從上面看到的資訊,結合本次使用的redis-shake工具,使用了sync模式,在全量初始化的時候,redis-shake需要去拿主節點的dump.rdb檔案,結果源端隻有一個dump.rdb檔案,三個主節點之間資料互相覆寫,導緻資料不完整,redis-shake進入增量之後,redis-full-check校驗資料相差較大。
3、解決方法
結合這次遷移環境,源端寫入的key都是帶過期時間的,等目标端缺少的這些key在源端過期後,之後的增量能實時從源庫同步到目标庫,達到資料遷移的目的。
上面的方法隻是針對這次的實際環境,最好是源端重新配置那兩個參數,每個節點生成一個rdb檔案,重新配置redis-shake全量+增量遷移。