環球快報:【Redis技術探索】「數據遷移實戰」手把手教你如何實現在線 + 離線模式進行遷移Redis數據實戰指南(離線同步數據)

2023-01-08 11:23:43 來源:51CTO博客

離線遷移

與在線遷移相比,離線遷移適宜于源實例與目標實例的網絡無法連通的場景,或者源端實例部署在其他云廠商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的應用實戰和實現原理。

標簽: 數據遷移 是否相等 我們需要

上一篇:深度學習背景下的圖像三維重建技術進展綜述
下一篇:【報資訊】hadoop中namenode職責和hdfs讀寫