
與在線遷移相比,離線遷移適宜于源實例與目標實例的網絡無法連通的場景,或者源端實例部署在其他云廠商Redis服務中,無法實現在線遷移。
【資料圖】
基于redis自身的RDB/AOF 備份機制,執行save\bgsave觸發數據持久化 RDB文件,拷貝redis備份文件(dump.rdb)到目標機器,重啟目標實例重新load RDB 文件。
命令 | save | bgsave |
IO阻塞 | 同步 | 異步 |
復雜度 | O(n) | O(n) |
缺點 | 阻塞客戶端 | 需要fork子線程,消耗內存 |
將上一步導出dump.rdb文件放到目標Redis服務所在的服務器的路徑為:/root/dump.rdb
需要使用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 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 restore.toml
redis-dump基于JSON 備份還原Redis的數據:??https://github.com/delano/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-dump –u :password@127.0.0.1:6379 > dump.json
dump.json redis-load
dump.json redis-load -u :password@127.0.0.1:6379
數據遷移后,我們通常需要對比源實例和目的實例中的數據是否一致。如果有不一致的數據,我們需要把它們找出來,從目的實例中剔除,或者是再次遷移這些不一致的數據。這里,我就要再給你介紹一個數據一致性比對的工具了,就是阿里云團隊開發的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 的值設置為我們想要比對的輪數。等到所有輪數都比對完成后,數據庫中記錄的數據就是源實例和目的實例最終的差異結果了。
KeyOutline ,只對比 key 值是否相等;ValueOutline ,只對比 value 值的長度是否相等;FullValue ,對比 key 值、value 長度、value 值是否相等。注意:Redis-full-check 提供了三種比對模式,我們可以通過 comparemode 參數進行設置。comparemode 參數有三種取值,含義如下:
在應用 Redis-full-check 時,根據業務對數據一致性程度的要求,選擇相應的比對模式。如果一致性要求高,就把 comparemode 參數設置為 FullValue 。
最后至此完成了對應的數據的遷移和離線導入。后面的章節會詳細介紹 Redis-full-check的應用實戰和實現原理。