【Redis 技術探索】「資料遷移實戰」手把手教你如何實現線上 + 離線模式進行遷移Redis資料實戰指南(離線同步資料)

洛神灬殤發表於2023-01-09

離線遷移

與線上遷移相比,離線遷移適宜於源例項與目標例項的網路無法連通的場景,或者源端例項部署在其他雲廠商Redis服務中,無法實現線上遷移。

存在的問題

  • 由於生產環境的各種原因,我們需要對現有伺服器進行遷移,包括線上正在執行的redis叢集環境 如何去做?
  • 涉及到資料來源變動,原有資料如何平滑遷移到新例項,從而可以實現無縫遷移?

方案彙總

save/bgsave匯出RDB+Redis-Shake進行遷移

基於redis自身的RDB/AOF 備份機制,執行save\bgsave觸發資料持久化 RDB檔案,複製redis備份檔案(dump.rdb)到目標機器,重啟目標例項重新load RDB 檔案。

命令 save bgsave
IO阻塞 同步 非同步
複雜度 O(n) O(n)
缺點 阻塞客戶端 需要fork子執行緒,消耗記憶體

匯入原有Redis例項的資料dump.rdb

將上一步匯出dump.rdb檔案放到目標Redis服務所在的伺服器的路徑為:/root/dump.rdb

遷移到目標例項為單節點服務

需要使用restore.toml檔案,進行編輯,從而進行執行執行檔案進行遷移重放資料,如下圖所示。

修改 restore.toml 為:
type = "restore"

[source]
rdb_file_path = "/root/dump.rdb"

[target]
type = "standalone"
address = "127.0.0.1:6379"
password = "r-aaaaa:xxxxx"
執行 redis-shake:
redis-shake restore.toml
遷移到目標例項為叢集例項服務

修改 restore.toml 為:

type = "restore"
[source]
rdb_file_path = "/root/dump.rdb"

[target]
type = "cluster"
address = "192.168.0.1:6379" # 這裡寫叢集中的任意一個節點的地址即可
password = "r-ccccc:xxxxx"

執行 redis-shake:

redis-shake restore.toml

基於redis-dump匯入匯出 json備份

redis-dump基於JSON 備份還原Redis的資料:https://github.com/delano/redis-dump

下載和執行redis-dump

git clone https://github.com/delano/redis-dump.git
$ cd redis-dump
$ gem install redis
$ gem install uri-redis
$ gem install yajl-ruby
$ gem install drydock
$ ruby -r rubygems bin/redis-dump

匯出命令

redis-dump –u 127.0.0.1:6379 > dump.json

匯出指定資料庫資料

redis-dump -u 127.0.0.1:6379 -d 15 > dump.json

如果redis設有密碼

redis-dump –u :password@127.0.0.1:6379 > dump.json

匯入命令

dump.json redis-load
指定redis密碼
dump.json redis-load -u :password@127.0.0.1:6379

資料遷移之後進行資料對比

資料遷移後,我們通常需要對比源例項和目的例項中的資料是否一致。如果有不一致的資料,我們需要把它們找出來,從目的例項中剔除,或者是再次遷移這些不一致的資料。這裡,我就要再給你介紹一個資料一致性比對的工具了,就是阿里雲團隊開發的Redis-full-check 。

Redis-full-check

Redis-full-check 的工作原理很簡單,就是對源例項和目的例項中的資料進行全量比對,從而完成資料校驗。不過,為了降低資料校驗的比對開銷,Redis-full-check 採用了多輪比較的方法。

  • 在第一輪校驗時,Redis-full-check 會找出在源例項上的所有 key,然後從源例項和目的例項中把相應的值也都查詢出來,進行比對。第一次比對後,Redis-full-check 會把目的例項中和源例項不一致的資料,記錄到 sqlite 資料庫中。

  • 從第二輪校驗開始,Redis-full-check 只比較上一輪結束後記錄在資料庫中的不一致的資料。

為了避免對例項的正常請求處理造成影響,Redis-full-check 在每一輪比對結束後,會暫停一段時間。隨著 Redis-shake 增量同步的進行,源例項和目的例項中的不一致資料也會逐步減少,所以,我們校驗比對的輪數不用很多。

在執行 Redis-full-check 命令時,把引數 comparetimes 的值設定為我們想要比對的輪數。等到所有輪數都比對完成後,資料庫中記錄的資料就是源例項和目的例項最終的差異結果了。

注意:Redis-full-check 提供了三種比對模式,我們可以透過 comparemode 引數進行設定。comparemode 引數有三種取值,含義如下:

  • KeyOutline ,只對比 key 值是否相等;
  • ValueOutline ,只對比 value 值的長度是否相等;
  • FullValue ,對比 key 值、value 長度、value 值是否相等。

在應用 Redis-full-check 時,根據業務對資料一致性程度的要求,選擇相應的比對模式。如果一致性要求高,就把 comparemode 引數設定為 FullValue 。

最後至此完成了對應的資料的遷移和離線匯入。後面的章節會詳細介紹 Redis-full-check的應用實戰和實現原理。

相關文章