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

在線數據遷移方式

對於大多數場景下的Redis的數據遷移,還是比較推薦大家參考我之前的前兩篇文章。

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

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

scan模式在線數據遷移的場景和原因

但是還有一種常見是前兩篇文章無法實現的,就是當雲廠商出於種種考慮禁用了Redis的 psync 命令時,前述方案不可用。 對於這種情況可以使用redis-shake的scan模式來進行數據遷移。

scan模式的簡單原理

原理是調用scan命令來獲取 Redis 中的 key,然後使用 dump 命令獲取 key 的內容,最終使用 restore 命令恢復 key 至目的端。

scan模式的侷限性

  • 如果某個 key 在遷移過程中一直存在,scan 模式能保證他一定被遷移
  • 如果某個 key 在遷移過程中不是一直存在,scan 模式不保證其一定被遷移
  • 如果某個 key 在遷移過程中被修改,scan 模式不保證修改能同步到對端
  • 可見 scan 模式會有許多缺點,所以推薦 sync 模式,其次 restore 模式。

redis-shake 的 scan 模式來遷移數據案例

使用redis-shake的scan在線遷移操作,主要通過scan.toml文件進行配置和執行遷移操作,如下圖所示。

實例信息

單機實例1

  • 地址:ip1
  • 端口:6379
  • 密碼:123456

單機實例2

  • 地址:ip2
  • 端口:6379
  • 無密碼

集羣實例1

  • 地址:
    • 192.168.0.1:6379
    • 192.168.0.2:6379
    • 192.168.0.3:6379
    • 192.168.0.4:6379
  • 密碼:123456

集羣實例2

  • 地址:
    • 192.168.1.1:6379
    • 192.168.1.2:6379
    • 192.168.1.3:6379
    • 192.168.1.4:6379
  • 密碼:123456

源Redis單機實例(1)到目標Redis單機實例(2)

修改 scan.toml,改爲如下配置:

type = "scan"
[source]
address = "ip1:6379"
password = "123456"

[target]
type = "standalone"
address = "ip2:6379"
password =
啓動 redis-shake:
./redis-shake scan.toml

源Redis單機實例(1)到目標Redis集羣實例(2)

修改 scan.toml,改爲如下配置:

type = "scan"
[source]
address = "ip1:6379"
password = "r-aaaaa:xxxxx"
[target]
type = "cluster"
address = "192.168.0.1:6379" # 這裏寫集羣中的任意一個節點的地址即可,redis-shake可以根據這個ip地址,拉取集羣的其他節點的ip和端口信息。
password = "123456"
啓動 redis-shake:
./redis-shake scan.toml

源Redis集羣實例(1)到目標Redis集羣實例(2)

方案1-手動起多個redis-shake,集羣1有四個節點:
  • 192.168.0.1:6379
  • 192.168.0.2:6379
  • 192.168.0.3:6379
  • 192.168.0.4:6379

把4個節點當成 4 個單機實例,參照前文部署 4 個 redis-shake 進行數據同步

方案2-藉助 cluster_helper.py 啓動

腳本cluster_helper.py方便啓動多個 redis-shake 從集羣遷移數據,效果等同於方法1。

注意

源端有多少個分片,cluster_helper.py 就會起多少個 redis-shake 進程,所以如果源端分片數較多的時候,需要評估當前機器是否可以承擔這麼多進程。

cluster_helper.py 異常退出的時候,可能沒有正常退出 redis-shake 進程,需要 ps aux | grep redis-shake 檢查。

每個 redis-shake 進程的執行日誌記錄在 RedisShake/cluster_helper/data/xxxxx 中,反饋問題請提供相關日誌。

依賴

Python 需要 python3.6 及以上版本,安裝 Python 依賴:

cd RedisShake/cluster_helper
pip3 install -r requirements.txt
配置

修改 scan.toml:

type = "scan"
[source]
address = "192.168.0.1:6379" # 集羣 C 中任意一個節點地址
password = "r-ccccc:xxxxx"

[target]
type = "cluster"
address = "192.168.1.1:6380" # 集羣 D 中任意一個節點地址
password = "r-ddddd:xxxxx"
運行
cd RedisShake/cluster_helper
python3 cluster_helper.py ../redis-shake ../scan.toml
  • 參數 1 是 redis-shake 可執行程序的路徑
  • 參數 2 是配置文件路徑

Redis哨兵模式

sentinel 節點,將哨兵拓撲當成普通的主從節點即可,參照單機到單機:A->B配置文件:

  • source 的 address 寫源端的 master 或 slave 節點地址,推薦 slave 節點。
  • target 的 address 些目的端的 master 節點地址。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章