Redis異構集群數據在線遷移工具Redis-Migrate-Tool【轉】
摘要:Redis-Migrate-Tool(後面都簡稱RMT),是唯品會開源的redis數據遷移工具,主要用於異構redis集群間的數據在線遷移,即數據遷移過程中源集群仍可以正常接受業務讀寫請求,無業務中斷服務時間。這篇blog主要內容包括工具特性簡介、使用方法以及註意的要點。關於實現的原理,可以自行閱讀源碼理解或者聯系我們交流。
目前該項目已經開源在GitHub上(https://github.com/vipshop/redis-migrate-tool 鏈接入口可點擊原文閱讀)。
一、RMT特性
1、異構集群相互之間的遷移
支持下面幾種異構集群之間的數據遷移和同構集群擴容/縮容。
1)單個redis到twemproxy/cluster遷移;
2)twemproxy到twemproxy/cluster遷移;
3)cluster到twmeproxy/cluster遷移。
2、在線遷移
RMT啟動後模擬成redis slave,請求master的全量數據和增量數據。RMT收到數據之後解析成redis協議格式的oplog(寫操作),然後發送給目標集群。有兩種請求方式,source_safe: true,對於同一ip上的redis,逐個的請求全量數據(RDB);source_safe: false,並行請求同步全量數據。source_safe: false時,需要註意多個源redis所在的同一主機是否有足夠的內存 和 RDB 並發落盤時的 IOPS 性能。
3、從AOF 或 RDB恢復數據
如果在線集群數據全部丟失,不要方,RMT可以幫你從備份的 AOF 和 RDB 文件恢復到目標集群。
4、數據過濾
可以過濾算法上不屬於源集群的臟數據,比如有人繞過twemproxy,非正常方式直接向後端redis寫入數據。還可以在配置文件[common]中使用filter參數,過濾掉不需要的數據。
二、使用方法
下面手把手教你使用 RMT,包括安裝、配置、監控還有業務在線切換方式。
1、RMT安裝
github開源地址:https://github.com/vipshop/redis-migrate-tool
安裝:
生成的執行文件在src目錄下,使用"-h"選項查看使用方法。
2、RMT配置文件
RMT的配置主要由三部分組成,數據源[source],目標集群[target],通用配置部分[common]。
RMT對源集群的類型並不敏感,對每個redis節點偽裝成一個slave。因而 twemproxy和cluster集群,可以使用 single 和 cluster 類型。建議配置成對應的 twemproxy 或者 cluster類型。有兩方面作用:1)RMT在數據遷移時,可以根據 twemproxy(hash)或者cluster(slots)數據分布規則,過濾掉原本不屬於該節點的數據;2)當源集群類型是cluster時,只用配置一個節點,簡化配置。
目標集群,因為不同數據分布規則需要執行不同的寫入邏輯,因而配置非常嚴謹。特別是tw集群,遷移到目標集群的server配置需要和twemproxy中保持一致,包括hash算法、數據分布算法、節點的ip和port、權重、節點的名字。
部分配置下面會詳細講解,完整配置請參考github(https://github.com/vipshop/redis-migrate-tool#configuration)。
2.1、redis/twemproxy到twemproxy
[source]和[taget] 由集群類型type和redis節點server組成。[source] type可以支持single/twemproxy/cluster/aof file/rdb file 五種類型。[target]中的type支持single/twemproxy/cluster/rdb file 四種類型。
對於twemproxy集群,必須設置 hash、distribution、servers等參數,而且和目標集群的twemproxy一模一樣(敲黑板)。前幾天,有某站公司的朋友問,RMT遷移之後,存在數據讀取不到,0.0。了解之後,發現是 target部分和twemproxy配置不一致導致。這也是寫這篇 使用文檔初衷和動力,怕坑到更多使用這個開源軟件的朋友。
在[common]中,一些參數主要作用如下,其他參數參考GitHub(https://github.com/vipshop/redis-migrate-tool#common)
2.2、cluster集群到cluster集群遷移
[source] 和 [target]只需配置集群的一個節點。當然[source]部分cluster也可以配置成如下形式。
2.3、cluster到twemproxy的遷移
twemproxy 到 cluster的遷移,作為練習題,你們自己測試吧
2.4、從AOF 和 RDB中恢復數據
3、RMT遷移
使用下面的命令就可以開始遷移數據
4、觀察遷移狀態
使用redis-cli可以連接 rmt.conf 中配置的端口,執行info命令,就可以觀察遷移的狀態。
total_msgs_outqueue可以判斷是否有oplog在隊列中等待處理,如果total_msgs_outqueue>0,請繼續等待。
5 RMT檢驗源集群和目標集群的差異
在業務切換到目標服務器之前,可使用 RMT 抽樣檢查數據的一致性,默認抽樣1000個key。
6 如何完成業務切換?
如果是異構集群的遷移,更改redis驅動/客戶端和修改代碼,重新發布是必然的事情。如果是同構集群,做配置發布就可以。如果沒有做重啟發布,等待源集群沒有連接之後,可以關閉RMT進程(kill)。或者重啟應用,強制斷開長連接。
三、註意事項
1、重要的事說三遍,RMT遷移數據到twemproxy,需要保持rmt.conf 中 [target] hash、distribution、servers 三個參數和目標集群的twemproxy配置嚴格一致。
2、遷移中和業務切換之前,請反復觀察“-o rmt.log”日誌信息,確認是否有異常。
3、業務切換之前,請充分檢查,特別是數據的一致性。
4、RMT 建議部署在單獨空閑機器上,同目的集群在同一個網段(跨機房遷移數據,可以提高遷移速度)。千萬不要部署在源集群所在的機器,防止資源不足,比如內存,帶寬,IOPS。
5、註意RDB傳輸是否超時;
6、redis client buf中的slave項,設置足夠大的buffer size和超時時間。
Redis異構集群數據在線遷移工具Redis-Migrate-Tool【轉】