1. 程式人生 > >redis-migration:獨創的redis線上資料遷移工具

redis-migration:獨創的redis線上資料遷移工具

一、常見redis資料遷移方式
業內,常見的redis資料遷移方式有以下三種:aof(日誌檔案)、rdb(快照檔案)、replication(主從複製)。

其中,aof和rdb兩種方式適用於跨網路(網路隔離)的redis例項之間的資料遷移,通過:在源例項上執行指令(bgrewriteaof/bgsave)生成aof或者rdb檔案 -> 下載資料檔案 -> 上傳資料檔案 -> 啟動目標例項 -> 完成資料遷移。aof和rdb的差異,主要體現在資料格式和資料載入速度兩個方面,前者是純文字格式(redis文字協議的流水記錄),載入的過程相當於歷史重放,而後者是二進位制格式,直接進行載入,所以一般情況下rdb資料載入會比aof載入快!這也是網上建議使用rdb做跨網路資料遷移的一個重要的原因。 而replication方式,適用於同一網路內的redis例項之間的資料遷移,在目標例項上通過指令(slaveof)完成資料全量複製遷移,在單例項的擴容應用上最適合。 二、開發redis-migration的需求
前面三種資料遷移方式都只解決點對點的資料遷移(缺陷1),而且aof和rdb還存在增量資料不能同步(缺陷2)的問題。事實上,我們開發redis-migration這個工具的原始需求來自於網易私有云redis叢集的橫向擴容:當叢集在縱向擴容到達雲主機規格極限時候,叢集如何再進行擴容? 三、如何開發redis-migration 工具定義 比較前面三種資料遷移方式,思考能不能把replication(主從複製)的過程剝離出來做成一個獨立工具呢?在連線源redis例項時候把自己模擬成slave,在連線目標redis例項(叢集)時候把自己模擬成客戶端,如下: 這樣的話,源redis例項即使是分散式叢集(多個源redis例項),也只需要同時啟動多個遷移工具例項就能解決了,如下:
流程設計 遷移過程整體上可以分為三個部分:快照資料和增量資料,其中增量資料分為2個階段,第1階段會落地成檔案,第二階段不落地直接TCP轉發: 技術難點
  1. 解析資料檔案:包括AOF和RDB,相對而言解析AOF檔案會簡單些,它是文字格式的,按照redis協議純文字處理即可;而RDB檔案是二進位制格式的,自己重新實現沒這個必要,因為redis已經有解析RDB的介面,但原始碼是和redis本身是耦合在一起的,比如對各種共享物件、全域性變數、資料結構dict/sds等的依賴,所以最後實現上變成了redis-benchmark.c和redis.c的結合體;
  2. 處理redis協議:解析來自資料來源的redis資料,讀取落地的RDB和AOF檔案資料組裝成redis協議資料。雖然客戶端使用的還是hiredis庫,但是請求和應答報文,都不能使用庫提供的介面來組裝和解析,需要重新實現,這一塊工作量比較大。RDB和AOF的請求報文組裝以及各自應答訊息的解析與校驗,其中RDB資料是二進位制的,所以需要逐欄位進行組裝,hiredis庫沒有提供這樣的介面,而且假設提供了也需要評估起效能;同時RDB資料裡會設定key的有效時間,一條RDB資料可能需要組裝成兩條redis指令;兩種資料都解析出型別後,用來精確判斷應答訊息的正確與否;
  3. 設計高效遷移:RDB資料有個特點,它儲存的是每個key的快照,無時序要求,所以可以考慮併發傳送的方式,提高遷移速度;而AOF資料,有時序要求,在目的地進行重放載入,不能併發,否則會亂序,出現數據錯誤,只能一個客戶端傳送,這時採用的是pipeline(批量)的方式;
  4. 方便除錯定位:遷移工具和資料來源、資料目的地的互動都是線上TCP流,而且都是瞬間完成的,對於中間的錯誤和異常,比較難以捕捉,現在的做法是在資料流入和流出的地方統一加了十六進位制的報文日誌;
功能特點
  1. 輕量級:僅增加了1個redis-migration.c檔案,同時在Makefile檔案中增加編譯redis-migration二進位制程式的2行指令;單執行緒,非同步訊息驅動模型,輕量化,工具編譯出來約4M大小;
  2. 高效能:前面有人可能會好奇,單執行緒程式怎麼實現多客戶端併發?是這樣的,因為一個客戶端的請求是序列的,存在RTT這樣一個時間視窗,那麼在這個時間窗口裡併發多個客戶端就可以避免系統等待,極大提高效能;另外,AOF遷移時候使用了pipeline特性,批量傳送,減少RTT來加速遷移;
  3. 低成本:遷移過程中的資料都做了落地處理,工具本身沒有對資料進行載入,記憶體開銷就很小,這一點非常重要!
  4. 易操作:啟動後,觀察遷移進度日誌即可;
工具價值 redis-migration遷移工具不僅可以解決外部例項遷往網易私有云redis叢集、私有云redis叢集橫向擴容的問題,也可以解決外部redis叢集的擴容問題,具有通用價值。比如:一個客戶端分片的分散式redis叢集,通過redis-migration工具(外加一個數據分片代理程式,比如twemproxy)將資料實時同步到新的叢集,然後應用直接切到新叢集上,叢集橫向擴容完成,中間不丟失任何資料! 應用案例 網易私有云線上已經有多個應用使用redis-migration進行了資料遷移,包括外部例項遷移、私有云分散式redis叢集擴容等,下圖為幾個典型的應用:   另外,網易新聞客戶端推薦系統2T規模的redis資料,也將會依賴redis-migration遷移到私有云redis叢集上來,目前正處於資源準備階段。 四、同行比較 豌豆夾redis資料遷移工具 騰訊雲redis資料遷移工具 crs-port,使用上和redis-port一致(包括日誌資訊),沒有落地,比較吃記憶體,簡單測試效率沒有redis-migration高下載地址:

分散式系統的橫向擴容歷來是很難實現的,對redis叢集這種純記憶體資料庫也不例外,而redis-migration遷移工具是對分散式redis叢集橫向擴容實現的一次實踐,事實證明效果比較理想!

原文地址:http://www.bitstech.net/2016/03/03/redis-migration/