Redis異構集羣之間數據遷移方案

1、Redis集羣遷移工具

最近在作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爲例,進行數據遷移演示。

2、redis-migrate-tool特性

  • 快速,多線程
  • 支持異構遷移,如支持Twemproxy集羣,redis cluster集羣,rdb文件和aof文件相互遷移

支持下面幾種異構集羣之間的數據遷移和同構集羣擴容/縮容。

1)redis<–>twemproxy/redis cluster遷移;

2)twemproxy<–>twemproxy/redis cluster遷移;

3)redis cluster<–>twmeproxy/redis cluster遷移。

當目標集羣是Twemproxy,數據會跳過Twemproxy直接導入到後端的redis。

  • 在線遷移,基於redis複製作到實時遷移,而且遷移過程當中,源集羣不影響對外提供服務

RMT啓動後模擬成redis slave,請求master的全量數據和增量數據。RMT收到數據以後解析成redis協議格式的oplog(寫操做),而後發送給目標集羣。有兩種請求方式,source_safe: true,對於同一ip上的redis,逐個的請求全量數據(RDB);source_safe: false,並行請求同步全量數據。source_safe: false時,須要注意多個源redis所在的同一主機是否有足夠的內存 和 RDB 併發落盤時的 IOPS 性能。

  • 從AOF或RDB恢復數據

若是在線集羣數據所有丟失,不要慌,RMT能夠幫你從備份的AOF和RDB文件恢復到目標集羣。

  • 數據過濾

能夠過濾算法上不屬於源集羣的髒數據,好比有人繞過twemproxy,非正常方式直接向後端redis寫入數據。還能夠在配置文件[common]中使用filter參數,過濾掉不須要的數據。

  • 遷移狀態顯示

3、redis-migrate-tool安裝

$ 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

4、redis-migrate-tool配置

RMT工具可使用命令行運行,也能夠支持配置文件。

RMT的配置主要由三部分組成,數據源[source],目標集羣[target],通用配置部分[common]。

  • source or target

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。

  • common

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)。或者重啓應用,強制斷開長鏈接。

5、注意事項

一、重要的事說三遍,RMT遷移數據到twemproxy,須要保持rmt.conf 中 [target]  hash、distribution、servers 三個參數和目標集羣的twemproxy配置嚴格一致。

二、遷移中和業務切換以前,請反覆觀察「-o rmt.log」日誌信息,確認是否有異常。

三、業務切換以前,請充分檢查,特別是數據的一致性。

四、RMT 建議部署在單獨空閒機器上,同目的集羣在同一個網段(跨機房遷移數據,能夠提升遷移速度)。千萬不要部署在源集羣所在的機器,防止資源不足,好比內存,帶寬,IOPS。

五、注意RDB傳輸是否超時。

六、redis client buf中的slave項,設置足夠大的buffer size和超時時間。

6、實戰

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遷移工具測試基本完畢,下一步就是上生產了,更多功能本身嘗試。

相關文章
相關標籤/搜索