最近在作Redis數據遷移,網上找了兩款開源的Redis遷移工具。mysql
第一種:redis-portgit
Codis官方提供的一個工具,redis-port是一個Redis工具,經過解析rdb文件,實現Redis主節點和從節點的數據同步,我具體沒有測試過。github
簡單來講,redis-port就是把自已假裝成slave,欺騙master來達到數據流同步的目地。redis
發送sync命令->接收rdb->解析rdb->過濾->回放rdb->回放master推送的同步數據算法
上面是原理流程,很是容易理解,解析完rdb後的每一步均可以高度定製。DBA看着是否是很熟悉? 很是像淘寶的canal,基於binlog作數據的增量消費。相比mysql replication的原理redis簡單太多,增量的數據就是普通的命令,須要解析的只有rdb文件。sql
Github地址:https://github.com/CodisLabs/redis-port後端
第二種:redis-migrate-tool安全
redis-migrate-tool(簡稱RMT)是惟品會開源的redis數據遷移工具,主要用於異構redis集羣間的數據在線遷移,即數據遷移過程當中源集羣仍能夠正常接受業務讀寫請求,無業務中斷服務時間。這篇blog主要內容包括工具特性簡介、使用方法以及注意的要點。關於實現的原理,能夠自行閱讀源碼理解。bash
Github地址:https://github.com/vipshop/redis-migrate-tool服務器
下面以rmt爲例,進行數據遷移演示。
支持下面幾種異構集羣之間的數據遷移和同構集羣擴容/縮容。
1)redis<–>twemproxy/redis cluster遷移;
2)twemproxy<–>twemproxy/redis cluster遷移;
3)redis cluster<–>twmeproxy/redis cluster遷移。
當目標集羣是Twemproxy,數據會跳過Twemproxy直接導入到後端的redis。
RMT啓動後模擬成redis slave,請求master的全量數據和增量數據。RMT收到數據以後解析成redis協議格式的oplog(寫操做),而後發送給目標集羣。有兩種請求方式,source_safe: true,對於同一ip上的redis,逐個的請求全量數據(RDB);source_safe: false,並行請求同步全量數據。source_safe: false時,須要注意多個源redis所在的同一主機是否有足夠的內存 和 RDB 併發落盤時的 IOPS 性能。
若是在線集羣數據所有丟失,不要慌,RMT能夠幫你從備份的AOF和RDB文件恢復到目標集羣。
能夠過濾算法上不屬於源集羣的髒數據,好比有人繞過twemproxy,非正常方式直接向後端redis寫入數據。還能夠在配置文件[common]中使用filter參數,過濾掉不須要的數據。
$ yum install automake libtool autoconf bzip2 -y $ git clone https://github.com/vipshop/redis-migrate-tool $ cd redis-migrate-tool $ autoreconf -fvi $ ./configure $ make
$ src/redis-migrate-tool -h Usage: redis-migrate-tool [-?hVdIn] [-v verbosity level] [-o output file] [-c conf file] [-C command] [-f source address] [-t target address] [-p pid file] [-m mbuf size] [-r target role] [-T thread number] [-b buffer size] Options: -h, --help : this help -V, --version : show version and exit -d, --daemonize : run as a daemon -I, --information : print some useful information -n, --noreply : don't receive the target redis reply -v, --verbosity=N : set logging level (default: 5, min: 0, max: 11) -o, --output=S : set logging file (default: stderr) -c, --conf-file=S : set configuration file (default: rmt.conf) -p, --pid-file=S : set pid file (default: off) -m, --mbuf-size=N : set mbuf size (default: 512) -C, --command=S : set command to execute (default: redis_migrate) -r, --source-role=S : set the source role (default: single, you can input: single, twemproxy or redis_cluster) -R, --target-role=S : set the target role (default: single, you can input: single, twemproxy or redis_cluster) -T, --thread=N : set how many threads to run the job(default: 4) -b, --buffer=S : set buffer size to run the job (default: 1048576 byte, unit:G/M/K) -f, --from=S : set source redis address (default: 127.0.0.1:6379) -t, --to=S : set target redis group address (default: 127.0.0.1:6380) -s, --step=N : set step (default: 1) Commands: redis_migrate : Migrate data from source group to target group. redis_check : Compare data between source group and target group. Default compare 1000 keys. You can set a key count behind. redis_testinsert : Just for test! Insert some string, list, set, zset and hash keys into the source redis group. Default 1000 keys. You can set key type and key count behind.
運行方式
$ src/redis-migrate-tool -c rmt.conf -o log -d
RMT工具可使用命令行運行,也能夠支持配置文件。
RMT的配置主要由三部分組成,數據源[source],目標集羣[target],通用配置部分[common]。
type
[source]支持五種數據類型,如:single、twemproxy、redis cluster、rdb file、aof file;[target]中的type支持:single、twemproxy、cluster、rdb fil四種類型。
RMT對源集羣的類型並不敏感,對每一個redis節點假裝成一個slave。於是twemproxy和cluster集羣,可使用single和cluster類型。建議配置成對應的twemproxy或者cluster類型。有兩方面做用:
1)RMT在數據遷移時,能夠根據 twemproxy(hash)或者cluster(slots)數據分佈規則,過濾掉本來不屬於該節點的數據;
2)當源集羣類型是cluster時,只用配置一個節點,簡化配置。
目標集羣,由於不一樣數據分佈規則須要執行不一樣的寫入邏輯,於是配置很是嚴謹。對於twemproxy集羣,必須設置hash、distribution、servers等參數,而且遷移到目標集羣的server配置須要和twemproxy中保持一致,包括hash算法、數據分佈算法、節點的ip和port、權重、節點的名字。
servers
設置集羣節點IP和端口。若是[source]或[target]是redis cluster,那麼節點IP能夠寫一個或多個都行,若是[source]或[target]有一方是twemproxy,那麼就須要填寫全部節點IP;若是[source]或[target]雙方都是twemproxy,那麼雙方的IP節點數必定是相同的,包括hash算法、數據分佈算法、權重、節點的名字。
redis_auth
Redis server若是開啓了認證,那麼這裏須要配置其密碼。
timeout
Redis server的讀寫超時時間,單位毫秒,默認120秒。
hash
若是[source]或[target]有任意一方是twemproxy集羣,那麼就須要指定其hash算法,md五、fnv1_6四、fnv1a_6四、fnv1_3二、fnv1a_3二、hsieh、murmur、jenkins。
hash_tag
若是[source]或[target]有任意一方是twemproxy集羣,那麼能夠爲其key指定tag,也能夠忽略。
distribution
若是[source]或[target]有任意一方是twemproxy集羣,須要指定key的分佈式模式,通常有三種:ketama、modula、random。
listen
RMT自己監聽的地址和端口,默認127.0.0.1:8888。
max_clients
RMT最大的客戶端鏈接數。
threads
設置RMT線程數。
step
用於解析請求步驟,數值越高,越快遷移,可是佔用內存更大。默認爲1。
mbuf_size
RMT buffer大小設置,默認512M。
noreply
一個布爾值,用來定義是否要檢查目標主機組確認信息,默認爲false。
source_safe
用於保護源主機組內存安全的,運行此工具以前,請確保您的源Redis的機器有足夠的內存容許至少一個Redis生成rdb文件。若是您的源機器內存容許全部Redis一次生成rdb文件,您能夠設置 ‘source_safe︰ false‘在rmt.conf配置文件中,默認這個值爲true,將會使用較少的線程。
dir
設置工做目錄,默認當前目錄。
filter
過濾匹配這個模式的key,默認爲NULL。
配置文件示例:
一、從redis cluster集羣遷移數據到twemproxy集羣
[source] type: redis cluster servers: - 127.0.0.1:6379 [target] type: twemproxy hash: fnv1a_64 hash_tag: "{}" distribution: ketama servers: - 127.0.0.1:6380:1 server1 - 127.0.0.1:6381:1 server2 - 127.0.0.1:6382:1 server3 - 127.0.0.1:6383:1 server4 [common] listen: 0.0.0.0:34345 threads: 8 step: 1 mbuf_size: 512 source_safe: true
二、從redis cluster集羣遷移數據到另一個redis cluster集羣
[source] type: redis cluster servers: - 127.0.0.1:8379 [target] type: redis cluster servers: - 127.0.0.1:7379 [common] listen: 0.0.0.0:8888
三、從rdb文件恢復數據到redis cluster集羣
[source] type: rdb file servers: - /data/redis/dump1.rdb - /data/redis/dump2.rdb - /data/redis/dump3.rdb [target] type: redis cluster servers: - 127.0.0.1:7379 [common] listen: 0.0.0.0:8888
四、遷移狀態查看
使用redis-cli能夠鏈接 rmt.conf 中配置的端口,執行info命令,就能夠觀察遷移的狀態。
total_msgs_outqueue能夠判斷是否有oplog在隊列中等待處理,若是total_msgs_outqueue>0,請繼續等待。
$ redis-cli -h 127.0.0.1 -p 8888 info
五、數據校驗:當數據遷移完成後,就能夠進行數據遷移後的檢查操做
$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_check" Check job is running... Checked keys: 1000 Inconsistent value keys: 0 Inconsistent expire keys : 0 Other check error keys: 0 Checked OK keys: 1000 All keys checked OK! Check job finished, used 1.041s
在業務切換到目標服務器以前,可以使用RMT抽樣檢查數據的一致性,默認抽樣1000個key。
也能夠指定檢查多少個key,以下:
$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 2000"
六、如何完成業務切換?
若是是異構集羣的遷移,更改redis驅動/客戶端和修改代碼,從新發布是必然的事情。若是是同構集羣,作配置發佈就能夠。若是沒有作重啓發布,等待源集羣沒有鏈接以後,能夠關閉RMT進程(kill)。或者重啓應用,強制斷開長鏈接。
一、重要的事說三遍,RMT遷移數據到twemproxy,須要保持rmt.conf 中 [target] hash、distribution、servers 三個參數和目標集羣的twemproxy配置嚴格一致。
二、遷移中和業務切換以前,請反覆觀察「-o rmt.log」日誌信息,確認是否有異常。
三、業務切換以前,請充分檢查,特別是數據的一致性。
四、RMT 建議部署在單獨空閒機器上,同目的集羣在同一個網段(跨機房遷移數據,能夠提升遷移速度)。千萬不要部署在源集羣所在的機器,防止資源不足,好比內存,帶寬,IOPS。
五、注意RDB傳輸是否超時。
六、redis client buf中的slave項,設置足夠大的buffer size和超時時間。
1)redis cluster <–> redis遷移
環境以下:
$ ll /data/redis/ # 單實例; drwxr-xr-x 6 root root 48 Dec 21 15:38 6379 # source集羣; drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6551 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6552 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6553 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6554 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6555 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6556 # target集羣; drwxr-xr-x 6 root root 101 Mar 15 15:57 cluster-7551 drwxr-xr-x 6 root root 101 Mar 15 15:57 cluster-7552 drwxr-xr-x 6 root root 101 Mar 15 15:57 cluster-7553 drwxr-xr-x 6 root root 101 Mar 15 13:59 cluster-7554 drwxr-xr-x 6 root root 101 Mar 15 13:59 cluster-7555 drwxr-xr-x 6 root root 101 Mar 15 13:59 cluster-7556 # rmt配置文件; -rw-r--r-- 1 root root 148 Mar 15 15:56 rmt.conf
具體集羣配置啓動本身搞定了。
rmt配置文件信息以下:
[source] type: redis cluster servers: - 10.99.73.11:6551 [target] type: redis cluster servers: - 10.99.73.11:7551 [common] listen: 0.0.0.0:8888 threads: 8 step: 1 mbuf_size: 512 source_safe: true
[source]集羣創造數據
#!/bin/bash # for i in `seq 1 1000`;do redis-cli -c -p 6551 set pkey"$i" "$i" redis-cli -c -p 6551 hset hkey"$i" "$i" "$i" done
$ redis-cli -c -p 6551 127.0.0.1:6551> DBSIZE (integer) 671 $ redis-cli -c -p 6552 127.0.0.1:6552> DBSIZE (integer) 668 $ redis-cli -c -p 6553 127.0.0.1:6553> DBSIZE (integer) 661
開始遷移:
$ ./src/redis-migrate-tool -c /data/redis/rmt.conf -o log -d
查看遷移效果:
$ redis-cli -p 7551 127.0.0.1:7551> DBSIZE (integer) 671 $ redis-cli -p 7552 127.0.0.1:7552> DBSIZE (integer) 668 $ redis-cli -p 7553 127.0.0.1:7553> DBSIZE (integer) 661
2)redis cluster <–> redis遷移
配置文件信息以下:
[source] type: redis cluster servers: - 10.99.73.11:6551 [target] type: single servers: - 10.99.73.11:6379 [common] listen: 0.0.0.0:8888 threads: 8 step: 1 mbuf_size: 512 source_safe: true
開始遷移:
./src/redis-migrate-tool -c /data/redis/rmt.conf -o log -d
查看遷移效果:
$ redis-cli -p 6379 127.0.0.1:6379> DBSIZE (integer) 2000
到此MTR遷移工具測試基本完畢,下一步就是上生產了,更多功能本身嘗試。