背景說明
-
部(bu)分云廠商的Redis實例禁止(zhi)客戶端發起SLAVEOF、BGSAVE、PSYNC等命令(ling),無法使(shi)用redis-cli、或redis-shake等工具快速導出數(shu)據(ju)。
-
使用(yong)KEYS命令容易造成(cheng)服務端阻塞。
-
云(yun)廠(chang)商一般(ban)只(zhi)提供備份文件下載,這種(zhong)方式僅(jin)適宜離線遷移,且遷移過程對業務中(zhong)斷(duan)時間較(jiao)長。
是一(yi)款開源的Redis數(shu)據在線遷移工(gong)具,支持在同一(yi)個實例(li)的不同數(shu)據庫之(zhi)間(jian)互(hu)相遷移,以(yi)及(ji)不同實例(li)的數(shu)據庫之(zhi)間(jian)遷移。
遷移原理
Rump使用SCAN來(lai)獲取(qu)keys,用DUMP/RESTORE來(lai)get/set值(zhi)。
SCAN是(shi)一(yi)個時間復雜度O(1) 的命令(ling),可以快速(su)獲得所有的key。DUMP/RESTORE使(shi)讀/寫值獨立于關鍵(jian)工作。
以下是Rump的主要特(te)性(xing):
-
通(tong)過SCAN非阻(zu)塞的獲(huo)取key,避免KEYS命令造成Redis服務阻(zu)塞。
-
支持所有數據類型(xing)的遷移。
-
把SCAN和DUMP/RESTORE操作放在同一個管(guan)道中,利用pipeline提升數據遷移過(guo)程中的(de)網絡效率。
-
不使(shi)用(yong)(yong)任何臨時文件,不占用(yong)(yong)磁盤空間。
-
使用帶(dai)緩沖區的channels,提升源服務器(qi)的性能(neng)。
說明
1.?Rump工(gong)具不支持遷移到DCS集群實例(li)。請改用其他(ta)工(gong)具,如redis-shake或(huo)Redis-cli。
2.?Redis實例的密碼不(bu)能包含(han)#@:等特殊字符,避免遷移命令(ling)解析出錯。
3.?建議停業務遷(qian)移。遷(qian)移過程中如(ru)果不斷寫入新(xin)的數據,可能(neng)會丟失少量Key。
步驟1:安裝Rump
- 下載Rump的。
以64位(wei)Linux操作系統(tong)為例,執行以下命令:
wget //github.com/stickermule/rump/releases/download/0.0.3/rump-0.0.3-linux-amd64;
- 解壓縮后,添加可執行權限。
mv rump-0.0.3-linux-amd64 rump;
chmod +x rump;
步驟2:遷移數據
rump -from { source_redis_address } -to { target_redis_address }
參數/選項說明:
- {source_redis_address}
源Redis實例地址,格(ge)式為(wei)(wei):redis://[user:password@]host:port/db,中括號部分為(wei)(wei)可(ke)選項,實例設置了(le)密碼(ma)訪問時(shi)需要(yao)填寫密碼(ma),格(ge)式遵循(xun)RFC 3986規(gui)范。注意用(yong)戶(hu)名可(ke)為(wei)(wei)空(kong),但冒號不(bu)能省略(lve),例如redis://:mypassword@192.168.0.45:6379/1。
db為數據庫編號,不傳則默認為0。
- { target_redis_address }
目標Redis實例地址,格式與from相同。
以下示(shi)例表示(shi)將(jiang)本地(di)Redis數(shu)據(ju)庫的第0個DB的數(shu)據(ju)遷移到(dao)192.168.0.153這臺Redis數(shu)據(ju)庫中,其中密碼以*替代顯示(shi)。
[root@ecs ~]# ./rump -from redis://127.0.0.1:6379/0 -to redis://:******@192.168.0.153:6379/0
.Sync done.
[root@ecs ~]#