天天看點

一次Redis-shake遷移資料缺少key問題記錄1、背景2、問題排查3、解決方法

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初始化完成進入增量,日志如下:

一次Redis-shake遷移資料缺少key問題記錄1、背景2、問題排查3、解決方法

2.2、通過redis-full-check進行校驗

        在上面初始化完成,進入增量後,通過redis-full-check校驗資料,發現源端和目标端key相差較大,資訊如下:

一次Redis-shake遷移資料缺少key問題記錄1、背景2、問題排查3、解決方法

2.3、檢視rdb檔案

        這次拿的的redis-shake工具備份的備份檔案,在檢視備份檔案rdb時發現,上面目标端缺少的key在rdb中沒有,但是實際在源端是存在的。

        因為備份的檔案看出有問題,這次去拿實際的redis rdb檔案,登入到redis叢集伺服器,檢視redis參數檔案,找到rdb檔案相關資訊,發現

        ①三個主節點配置的dbfilename dump.rdb;dir ./這兩個參數都是一樣的

        ②去拿rdb檔案,發現伺服器上dump.rdb隻有一個,結合上面參數的設定,懷疑三個主節點都寫入到了同一個dump.rdb中

一次Redis-shake遷移資料缺少key問題記錄1、背景2、問題排查3、解決方法

        ③檢視redis三個主節點啟動路徑,驗證②中的猜測

一次Redis-shake遷移資料缺少key問題記錄1、背景2、問題排查3、解決方法
一次Redis-shake遷移資料缺少key問題記錄1、背景2、問題排查3、解決方法

        從這裡可以看到,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全量+增量遷移。

繼續閱讀