RedisShake是一(yi)款開源的(de)Redis遷移(yi)工具,支持Cluster集(ji)群(qun)的(de)在線遷移(yi)與(yu)離線遷移(yi)(備份文(wen)件導入(ru))。DCS Cluster集(ji)群(qun)與(yu)Redis Cluster集(ji)群(qun)設(she)計(ji)一(yi)致(zhi),數據可平滑遷移(yi)。
本文以Linux系(xi)統環境為例,介紹如何使用(yong)Redis-Shake工具(ju)進行(xing)Cluster集群(qun)數據遷(qian)移。
在線遷移
在線遷移主要適(shi)用于自建(jian)Redis Cluster集群(qun)遷移到DCS Cluster集群(qun)的場景,且兩端集群(qun)實(shi)例(li)能夠網絡(luo)連通(tong),或者(zhe)有一(yi)臺中轉(zhuan)服務器能夠連通(tong)兩端集群(qun)實(shi)例(li)。
部署在(zai)其他云(yun)廠商Redis服務上的Cluster集群數(shu)據,由(you)于SYNC、PSYNC命令(ling)被云(yun)廠商禁用(yong),暫不支持(chi)在(zai)線遷移。
- 在DCS控制臺創建Cluster集群實例。
注意(yi)集(ji)群(qun)的內存規(gui)格不能小于源端Cluster集(ji)群(qun)。
- 準備一臺云主機,并安裝RedisShake
RedisShake既能訪問源端(duan)Cluster集群(qun),也需要能訪問目標(biao)端(duan)DCS Cluster集群(qun),需要綁定彈性公網IP。
建議(yi)使用彈性云主(zhu)機(ECS),且ECS與(yu)DCS Cluster集群實例配置相同虛(xu)擬(ni)私有(you)云、子(zi)網與(yu)安(an)全(quan)組。如果源(yuan)端(duan)Cluster集群在本地(di)或者其他云廠商(shang)的服務器上自建,則需要(yao)允(yun)許被公網訪問。
可下載release版本,解(jie)壓(ya)縮后即可使用。(此處以(yi)下載Redis-Shake v2.1.2為(wei)例(li),您可以(yi)根據實際(ji)需要選(xuan)擇其他。)


- 獲取源集群和目標集群的Master節點和IP。
在線遷移需要(yao)將(jiang)各個節點(dian)數據分(fen)別(bie)遷移。使用如下(xia)命(ming)令查詢源和目標Cluster集群的所有節點(dian)的IP地(di)址與端口(kou):
redis-cli -h ** {redis_address} ** -p ** {redis_port} ** -a ** {redis_password} cluster nodes**
在命令返回的結(jie)果(guo)中,獲取所有master節點的IP端口,如(ru)下如(ru)所示:


說明
安(an)(an)裝(zhuang)了Redis后(hou),自(zi)帶redis-cli命(ming)令(ling)。如CentOS下安(an)(an)裝(zhuang)Redis:yum install redis
- 編輯RedisShake配置文件。
編輯(ji)redis-shake工具配置文件redis-shake.conf,補(bu)充源端與目(mu)標端所有(you)master節點的連(lian)接信(xin)息(xi):
source.type = cluster
#如果無密碼,本項不填
source.password_raw = ***{source_redis_password} ***
#源Cluster集群所有master節點的IP地址與端口,以分號分隔
source.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port} … {masterN_ip}:{masterN_port}
target.type = cluster
#如果無密碼,本項不填
target.password_raw = ***{target_redis_password} ***
#目標Cluster集群所有master節點的IP地址與端口,以分號分隔
target.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port} … {masterN_ip}:{masterN_port}
保存(cun)并退出文件編輯。
- 在線遷移,同步數據
使(shi)用如下(xia)命(ming)令同步源Redis集群和目(mu)標Redis集群數(shu)據:
./redis-shake -type sync -conf redis-shake.conf
執行日志中出現如下信息,代表全量(liang)數據同步完成,進入(ru)增量(liang)同步階段:
sync rdb done.
執行日志出現如下信息時,代表(biao)增(zeng)量同步無(wu)新增(zeng)內(nei)容,可手(shou)動停(ting)止(zhi)同步(Ctrl + C):
sync: +forwardCommands=0 +filterCommands=0 +writeBytes=0
redis-shake在(zai)線遷移示(shi)意圖(tu)


- 遷移后驗證
數據(ju)(ju)同步結束后,可(ke)使用redis-cli工具連(lian)接DCS Cluster集群,通過info命令查看(kan)Keyspace中的Key數量,確認數據(ju)(ju)是否(fou)完整導(dao)入。
如果數(shu)據(ju)不完整,可使用(yong)flushall或者flushdb命(ming)令清理實(shi)例(li)中的(de)緩存數(shu)據(ju)后重新同(tong)步。
- 清理RedisShake配置文件。
離線遷移(備份文件導入)
與(yu)在線(xian)(xian)遷(qian)移相比,離線(xian)(xian)遷(qian)移適宜于源實(shi)例(li)與(yu)目標實(shi)例(li)的(de)網(wang)絡無法(fa)連(lian)通(tong)的(de)場景,或者(zhe)源端實(shi)例(li)部署(shu)在其(qi)他(ta)云(yun)廠商Redis服(fu)務中,無法(fa)實(shi)現在線(xian)(xian)遷(qian)移。
- 在DCS控制臺創建Cluster集群實例。
注意集群(qun)的內存規格不(bu)能小于源端Cluster集群(qun)。
- 分別獲取源端與目標端Cluster集群的Master節點IP地址與端口。
redis-cli -h {redis_address} -p {redis_port} -a {redis_password} cluster nodes
在命令返回(hui)的(de)結果中,獲取所(suo)有master節(jie)點(dian)的(de)IP端口,如下如所(suo)示:



說明
安裝了Redis后,自帶redis-cli命令。如(ru)CentOS下安裝Redis:yum install redis
- 準備一臺云主機,并安裝RedisShake
RedisShake需要(yao)能訪問(wen)目標端(duan)DCS Cluster集群,也需要(yao)綁定彈性(xing)公網IP,以便將(jiang)備份文件(jian)上傳到(dao)云主機。
建議(yi)使(shi)用彈性云主機(ECS),且ECS與DCS Cluster集群實例配置相(xiang)同虛擬私有云、子網與安全組。
可下載(zai)release版本,解壓(ya)縮后即可使用。(此處(chu)以下載(zai)Redis-Shake v2.1.2為例)


說明
如(ru)果源端集群部(bu)署在(zai)數(shu)據(ju)中心內網(wang),則需在(zai)內網(wang)服務器上(shang)安裝RedisShake,并(bing)參考下述步驟(zou)進行(xing)數(shu)據(ju)導出,然(ran)后將數(shu)據(ju)文(wen)件上(shang)傳到云主(zhu)機。
- 導出RDB文件
編輯redis-shake工具配置文(wen)件redis-shake.conf,補充(chong)源端(duan)與目標(biao)端(duan)所有master節點的連接信息:
source.type = cluster
#如果無密碼,本項不填
source.password_raw = {source_redis_password}
#源Cluster集群所有master節點的IP地址與端口,以分號分隔
source.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port}…{masterN_ip}:{masterN_port}
導(dao)出源Redis集群的RDB格式備份文件(jian)
./redis-shake -type dump -conf redis-shake.conf
執行日志中出現(xian)如下信息時導出備份文件(jian)完成:
execute runner[*run.CmdDump] finished!
- 導入RDB文件
a. 將導出的(de)RDB文(wen)件(含多個)上傳到(dao)與云(yun)主機(ji)上。云(yun)主機(ji)與目標(biao)端DCS Cluster集群(qun)實例(li)的(de)網絡連通。
b. 編(bian)輯RedisShake配置文件(jian)。
編輯redis-shake工(gong)具配置文(wen)件redis-shake.conf,補(bu)充(chong)源端與(yu)目標(biao)端所有master節點的連接信息:
target.type = cluster
#如果無密碼,本項不填
target.password_raw = {target_redis_password}
#目標Cluster集群所有master節點的IP地址與端口,以分號分隔
target.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port}…{masterN_ip}:{masterN_port}
#需要導入的rdb文件列表,用分號分隔
rdb.input = local_dump.0;local_dump.1;local_dump.2;local_dump.3
保存并退(tui)出文(wen)件編輯(ji)。
c. 使用如下命(ming)令導入rdb文件到(dao)目(mu)標Cluster集群:
./redis-shake -type restore -conf redis-shake.conf
執行日志中出現如下信息時(shi)導入備份文件完成:
Enabled http stats, set status (incr), and wait forever.
- 遷移后驗證
數據同步結束后,可(ke)使用redis-cli工具連接DCS Cluster集群,通過info命(ming)令查看(kan)Keyspace中的Key數量,確認數據是否(fou)完整導入。
如果數據不完整(zheng),可使用flushall或者flushdb命令清理實例(li)中的緩存數據后重新同步。