1. 程式人生 > >redis遷移工具redis-migrate-tool測試

redis遷移工具redis-migrate-tool測試

存儲 color bce watermark 默認 vim 區別 認證 設置

1、 部署
依賴:
yum -y install automake
yum -y install libtool
yum -y install autoconf
yum -y install bzip2

安裝redis-migrate-tool
unzip redis-migrate-tool-master.zip
cd redis-migrate-tool-master
autoreconf -fvi
./configure
make

檢查安裝是否成功,如下圖所示即為正確
src/redis-migrate-tool -h
技術分享圖片

參數說明:
-d 以守護進程執行
-I 輸出有用的信息
-n 不接收目標redis的回應
-v 設置日誌等級,默認5,最小0,最大11

-o 輸出到日誌
-c 配置文件
-p 進程文件,默認沒有
-m 存儲器緩沖大小,默認512字節,和機器磁盤一個扇區一樣,我猜的
-C 默認redis_migrate,就是遷移命令
-r 源類型,默認single,還可以是twemproxy或者redis_cluster
-R 目標類型,默認single,還可以是twemproxy或者redis_cluster
-T 線程數,使用多少線程來跑這個job,默認1
-b 默認可以使用128T的緩存來運行這個job
-f 源ip:port
-t 目標ip:port
-S 默認1,用於解析請求的步驟,數值越大,遷移越快,內存占用也就越大

使用:
可以將這些設置寫入到配置文件中

vim /tmp/rmt.conf
[source]
type:single
servers:

  • 192.168.1.150:6379

[target]
type:single
servers:

  • 192.168.1.172:6379

[common]
listen:0.0.0.0:8910
threads:2
mbuf_size:512

運行測試:
從150遷到172,並且在遷移過程中,150繼續寫入
150
技術分享圖片
172
技術分享圖片
./redis-migrate-tool -c /tmp/rmt.conf -o log -d
技術分享圖片
可以看到遷移程序運行中
結果什麽都沒有發生,查看log,發現報錯了
[2018-08-30 11:24:04.392] rmt_redis.c:6446 ERROR: Can‘t handle RDB format version -1219911672

[2018-08-30 11:24:04.392] rmt_redis.c:6715 ERROR: Rdb file for node[192.168.1.150:6379] parsed failed
因為redis每個版本的rdb都不一樣,所以原因可能是不支持redis4.0.1的rdb解析

沒辦法了,換3.2.12試試
我在172上設置了3.2版本的6379和6380
修改下配置文件
[source]
type:single
servers:

  • 192.168.1.172:6379

[target]
type:single
servers:

  • 192.168.1.172:6380

[common]
listen:0.0.0.0:8910
threads:2
mbuf_size:512
還是之前的數據
6379
技術分享圖片
6380
技術分享圖片
執行migrate
技術分享圖片
查看6380,如下圖,已經同步
技術分享圖片
接著再在6379上寫入
技術分享圖片
查看6380,如下圖已復制過來。
技術分享圖片
證明redis-migrate-tool是實時的
上面這些操作,我均沒有添加認證,那麽我添加認證會如何呢?
6379,6380同時添加認證
技術分享圖片
看,認證已生效
技術分享圖片
再來測試,是否會實時同步
6379寫入
技術分享圖片
6380查看,如下圖,顯然沒有同步過來。
技術分享圖片
日誌循環報如下報錯:
技術分享圖片
那麽能不能通過配置文件加認證呢?不清楚,但可以試試
答案是可以,在配置文件中的[source][target]下加入redis_auth:111111
技術分享圖片
重啟migrate,再查看6380,已經遷移過來
技術分享圖片

上面測試的是同一個庫下的,那麽不同庫下的呢?
6379
技術分享圖片
查看6380
技術分享圖片
結果,在6379的2庫和3庫中的數據都插入到了6380的0庫
這個看已解決的issues中,是要改一個文件。
我進行了改完,但結果也只是把db 0改成了db n,並沒有將源多個庫中的數據一一對應到目標數據庫中。所以源存在多庫時候慎用。

遷移cluster和single一樣,區別是type,所以不過多敘述
type:redis cluster

2、 總結
A、 不適用4.0.x版本。
B、 源中存在多庫時,禁用,避免發生鍵值覆蓋。

3、 多源配置:
文檔源自測試結果,達到了目的,但是有限制,由於沒有別的文檔可查閱
[source]
type:single
servers:

  • 192.168.1.172:6379
  • 192.168.1.172:6381
    redis_auth:111111

[target]
type:single
servers:

  • 192.168.1.172:6380
    redis_auth:111111

[common]
listen:0.0.0.0:8910
threads:2
mbuf_size:512

多源設置如上配置,要不都不帶密碼,要不源是同一個密碼,否則無法啟動,在線變更密碼可以通過config set requirepass 密碼 來進行操作
6379的所有key 共11個
技術分享圖片
技術分享圖片
6381的所有Key 共7個
技術分享圖片
目標6381 自帶1個重復的測覆蓋用
技術分享圖片

我的為啥是10號庫,因為我改文件了……

執行之後如下圖,看到6379,6381的全部過來了,並且把原本的ttl6的值給覆蓋了
技術分享圖片
同時6379和6381繼續寫入
技術分享圖片
查看結果,已經追加過來了
技術分享圖片

4、 測試過濾器
說是過濾器,其實是這個過濾器指定哪個,哪個才能被遷移過來。
限制:沒有找到可以同時過濾多個的寫法,只能寫1個
看測試結果
先清空6380
過濾條件加入filter:ttl,也就是ttl開頭的都遷移過來
[common]
listen:0.0.0.0:8910
threads:2
mbuf_size:512
filter:ttl

查看結果:
技術分享圖片
可以看到只遷移過來了ttl開頭的key
6379,6381繼續寫一些包含ttl開頭還有其他
技術分享圖片
技術分享圖片
查看6380,都已經遷移過來
技術分享圖片

一個想法,我要是啟多個migrate呢?是不是能過濾多個條件?
再啟動一個migrate,換個端口,再添加個配置文件,修改filter:name*
技術分享圖片
哎呦,都追加過來了
再在6379上同時寫入1個ttl開頭,1個name開頭的
技術分享圖片
查看6380,都已經追加過來
技術分享圖片
但是這種雙開的方法我不確定靠不靠譜哈

redis遷移工具redis-migrate-tool測試