天天看點

iX redis(3)redis資料遷移:

加載rdb檔案(或加載aof檔案);

redis replication;

redis-migrate-tool,此工具适用任何場景,是重點:

https://github.com/vipshop/redis-migrate-tool,Features特點:

Fast.快速;

Multi-Threads.多線程;

Based on redis replication.基于redis複制;

Live migration.實時遷移;

In the process of migrating data, the source redis can also provide services for users.遷移過程中,源叢集不影響對外提供服務;

Heterogeneous migration.異構遷移;

Twemproxy and redis cluster support.支援twemproxy叢集,redis叢集,rdb檔案和aof檔案;

When the target is twemproxy, keys are direct imported into redis behind the twemproxy.過濾功能;

Migration Status view.遷移狀态顯示;

Data Verification Mechanism.完善的資料抽樣校驗;

source來源可以是:單redis執行個體、redis cluster、rdb檔案、aof檔案、twemproxy叢集;

target目标可以是:單redis執行個體、redis cluster、rdb檔案、twemproxy叢集;

配置檔案rmt.conf常用配置項如下:

type: The group redis type. Possible values are:

single

twemproxy

redis cluster

rdb file

aof file

servers: The list of redis address in the group. If type is twemproxy, this is same as the twemproxy config file. If type is rdb file, this is the filename.

listen: The listening address and port (name:port or ip:port). Defaults to 127.0.0.1:8888.

以下操作有:單節點遷到單節點、redis叢集遷到redis叢集,各用兩種方法,其中:

單節點遷到單節點(方一,直接複制并加載rdb或aof檔案;方二,利用redis複制機制);

redis叢集遷到redis叢集(兩種方法都使用redis-migrate-tool工具;方一,網絡隔離情況時,在被遷移端導出rdb檔案,再到遷移端加載;方二,相同網段時,線上遷移);

1、redis單節點資料遷到另一單節點上:

方一:

利用redis啟動時加載rdb二進制檔案方式(或加載aof文本檔案方式),直接将被遷移端的dump.rdb檔案(即snapshotting快照檔案)上傳至遷移端主機;

被遷移端注意:

停連接配接redis的應用,即禁止往redis裡寫資料;

在redis互動模式下執行>bgsave   #(即重新fork一個線程,用于将目前記憶體中的資料持久化到磁盤上;若使用加載aof檔案,此步用>bgrewriteaof指令);

遷移端注意:

将被遷移端的dump.rdb上傳至遷移端指定路徑下,即要與配置檔案中dir和dbfilename配置項一緻;

啟動前将配置檔案中的rdb持久化配置項注釋掉,此步重要,即注釋掉配置檔案中預設的如下三行:

#save 900 1

#save 300 10

#save 60 10000

操作:

此例是在一台主機上啟動兩個redis執行個體(6379和6380),将6379上的資料遷到6380上;

在被遷移端(6379)如下操作:

[root@test2 ~]# cd /ane/redis

[root@test2 redis]# redis-cli -p 6379 keys \*

(empty list or set)

[root@test2 redis]# for i in `seq 1 100` ; do redis-cli -p 6379 set key$i value$i ; done  #(模拟産生資料)

……

[root@test2 redis]# redis-cli -p 6379

127.0.0.1:6379> keys *

127.0.0.1:6379> bgsave

Background saving started

127.0.0.1:6379> exit

在遷移端(6380)上操作:

[root@test2 redis]# redis-cli -p 6380

127.0.0.1:6380> keys *

127.0.0.1:6380> exit

[root@test2 redis]# vim redis_6380.conf

dbfilename dump_6380.rdb

dir /ane/redis/6380/

[root@test2 redis]# redis-cli -p 6380 shutdown

[root@test2 redis]# rm -f /ane/redis/6380/dump_6380.rdb

[root@test2 redis]# cp dump.rdb /ane/redis/6380/dump_6380.rdb  #(dump.rdb為6379上的持久化資料)

[root@test2 redis]# redis-server /ane/redis/6380/redis_6380.conf

  1)"key64"

  2)"key29"

  3)"key55"

  4)"key67"

  5)"key12"

  6)"key39"

  7)"key26"

  8)"key82"

  9)"key57"

 10)"key48"

[root@test2 redis]# vim /ane/redis/6380/redis_6380.conf

save 900 1

save 300 10

save 60 10000

  1)"key85"

  2)"key23"

  3)"key94"

  4)"key41"

  5)"key76"

  6)"key24"

  7)"key55"

  8)"key67"

  9)"key43"

 10)"key90"

 11)"key84"

 12)"key86"

方二:

用redis replication複制機制,用于兩主機在相同網段或兩主機可互通的情況下;

注意主從次序,主端資料被清空,若從仍開啟slaveof項時,從上資料也會被清空,兩端資料是實時同步的;

在遷移端(6380)操作:

[root@test2 redis]# pwd

/ane/redis

[root@test2 redis]# redis-cli -p 6380 shutdown  #(關閉從redis後改配置)

[root@test2 redis]#vim 6380/redis.conf   #(在遷移端即主從模式的從伺服器設定主的ip和port,也可在互動模式下配置>slaveof 192.168.23.130 6379)

# slaveof <masterip><masterport>

slaveof 192.168.23.130 6379

[root@test2 redis]# redis-server 6380/redis.conf   #(啟動從redis)

在被遷移端(6379)操作:

[root@test2 redis]# redis-cli -p 6379 flushall

OK

[root@test2 redis]# for i in `seq 100 1000`; do redis-cli -p 6379 set key$i value$i &> /dev/null ; done   #(模拟産生資料,到遷移端檢視是否有)

在遷移端(6380)上檢視是否有資料:

127.0.0.1:6380> exists key1000

(integer) 1

127.0.0.1:6380> exists key100

[root@test2 redis]# vim 6380/redis.conf   #(待資料傳完後,改配置,重新開機;或在指令行互動模式下執行>slave NO ONE,并改配置檔案)

#slaveof 192.168.23.1306379

[root@test2 redis]# redis-server 6380/redis.conf

2、redis 叢集資料遷到另一redis叢集:

使用redis-migrate-tool工具;

将test1主機redis叢集中的資料遷到test2主機;

适合兩台主機不在一個網段,網絡隔離情況;

test1和test2均需安裝redis-migrate-tool,利用此工具先将test1主機上的redis叢集中的資料導出為rdb檔案,再将rdb檔案上傳至test2并恢複到redis叢集中;

test1(被遷移端)上操作如下:

[root@test1 ~]# cd /ane

[root@test1 ane]# yum -y install automake libtool autoconf bzip2

[root@test1 ane]# unzip /usr/local/src/redis-migrate-tool-master.zip -d /ane

[root@test1 ane]# cd redis-migrate-tool-master

[root@test1 redis-migrate-tool-master]# autoreconf -fvi

[root@test1 redis-migrate-tool-master]# ./configure

[root@test1 redis-migrate-tool-master]# make

[root@test1 redis-migrate-tool-master]# vim /etc/profile.d/redis.sh

export PATH=$PATH:/ane/redis/bin:/ane/redis-migrate-tool-master/src

[root@test1 redis-migrate-tool-master]# ./etc/profile.d/redis.sh

[root@test1 redis-migrate-tool-master]# which redis-migrate-tool

/ane/redis-migrate-tool-master/src/redis-migrate-tool

[root@test1 redis-migrate-tool-master]# redis-migrate-tool -h

  -d,--daemonize        : run as a daemon

  -o,--output=S         : set logging file(default: stderr)

  -c,--conf-file=S      : set configurationfile (default: rmt.conf)

  -C,--command=S        : set command toexecute (default: redis_migrate)

[root@test1 redis-migrate-tool-master]# cd..

[root@test1 ane]# redis-cli -c -h 192.168.23.129 -p 6379 keys \*

[root@test1 ane]# for i in `seq 101 2000` ; do redis-cli -c -h 192.168.23.129 -p 6379 set key$i value$i &> /dev/null ; done   #(模拟往test1主機上的redis叢集中插入資料)

[root@test1 ane]# redis-cli -c -h 192.168.23.129 -p 6379

192.168.23.129:6379> exists key101

192.168.23.129:6379> exists key2000

-> Redirected to slot [9780] located at192.168.23.129:6380

192.168.23.129:6380> exit

[root@test1 ane]# cp redis-migrate-tool-master/rmt.conf redis-migrate-tool-master/rmt.conf.example

[root@test1 ane]# vim redis-migrate-tool-master/rmt.conf

[source]

type: redis cluster

servers:

 - 192.168.23.129:6379

[target]

type: rdb file

[common]

listen: 0.0.0.0:8888

[root@test1 ane]# redis-migrate-tool -c redis-migrate-tool-master/rmt.conf -o log.txt -d

[root@test1 ane]# tail -f log.txt   #(檢視日志是否報錯)

[root@test1 ane]# cat log.txt   #(日志中有詳細操作過程)

[root@test1 ane]# ll -h   #(在目前目錄下生成了三個rdb檔案(該叢集是6個節點,3主3從),将這三個檔案上傳到遷移端恢複即可)

total 60K

-rw-r--r--. 1 root root 4.2K Mar 17 01:26log.txt

-rw-r--r--. 1 root root  12K Mar 17 01:26 node192.168.23.129:6379-1489739168652097-11514.rdb

-rw-r--r--. 1 root root  12K Mar 17 01:26 node192.168.23.129:6380-1489739168552203-11514.rdb

-rw-r--r--. 1 root root  12K Mar 17 01:26 node192.168.23.129:6381-1489739168455476-11514.rdb

drwxr-xr-x. 9 root root 4.0K Mar  2 18:52 redis

drwxr-xr-x. 9 root root 4.0K Mar 17 01:23redis-migrate-tool-master

-rwxr-xr-x. 1 root root  163 Mar 3 00:32 shutdown_redis.sh

-rwxr-xr-x. 1 root root  140 Mar 3 00:34 startup_redis.sh

[root@test1 ane]# mv node192.168.23.129\:6379-1489739168652097-11514.rdb node129-6379.rdb   #(将生成的這三個檔案改名,防止特殊字元(如冒号等)影響操作)

[root@test1 ane]# mv node192.168.23.129\:6380-1489739168552203-11514.rdb node129-6380.rdb

[root@test1 ane]# mv node192.168.23.129\:6381-1489739168455476-11514.rdb node129-6381.rdb

[root@test1 ane]# scp node129-63*[email protected]:/ane   #(傳至遷移端)

[root@test1 ane]# redis-migrate-tool-h 127.0.0.1 -p 8888 shutdown   #(關閉redis-migrate-tool)

test2上操作如下:

安裝redis-migrate-tool;

[root@test2 ane]# redis-cli -c -h 192.168.23.130-p 6379

192.168.23.130:6379> keys *

192.168.23.130:6379> exit

[root@test2 ane]# vim redis-migrate-tool-master/rmt.conf

 - /ane/node129-6379.rdb

 - /ane/node129-6380.rdb

 - /ane/node129-6381.rdb

 - 192.168.23.130:6379

[root@test2 ane]# redis-migrate-tool -c redis-migrate-tool-master/rmt.conf -o log.txt -d

[root@test2 ane]# tail -f log.txt

[root@test2 ane]# redis-cli -c -h 192.168.23.130 -p 6379

192.168.23.130:6379> exists key101

192.168.23.130:6379> exists key2000

-> Redirected to slot [9780] located at192.168.23.130:6380

192.168.23.130:6380> keys *

192.168.23.130:6380> exit

[root@test2 ane]# redis-migrate-tool -h 127.0.0.1 -p 8888 shutdown  

适合兩台主機在一個網段,線上遷移:

確定兩台主機的redis叢集都在運作狀态;

兩個主機(被遷移端和遷移端)任意一個上安裝redis-migrate-tool即可,此例是在test2上安裝;

在遷移端test2上操作:

[root@test2 ~]# cd /ane

192.168.23.130:6379> flushall

- 192.168.23.129:6379

- 192.168.23.130:6379

[root@test2 ane]# tail -f log.txt   #(檢視是否有報錯)

[root@test2 ane]# redis-cli -c -h 192.168.23.130 -p 6379   #(檢視是否有資料)

[root@test2 ane]# redis-cli-h 127.0.0.1 -p 8888   #(連接配接redis-migrate-tool監控的端口)

127.0.0.1:8888> info

# Server

version:0.1.0

os:Linux 2.6.32-431.el6.x86_64 x86_64

multiplexing_api:epoll

gcc_version:4.4.7

process_id:25904

tcp_port:8888

uptime_in_seconds:196

uptime_in_days:0

config_file:/ane/redis-migrate-tool-master/rmt.conf

# Clients

connected_clients:1

max_clients_limit:100

total_connections_received:1

# Memory

mem_allocator:jemalloc-4.0.4

# Group

source_nodes_count:3

target_nodes_count:3

# Stats

all_rdb_received:1

all_rdb_parsed:1

all_aof_loaded:0

rdb_received_count:3

rdb_parsed_count:3

aof_loaded_count:0

total_msgs_recv:1901

total_msgs_sent:1901

total_net_input_bytes:35215

total_net_output_bytes:76137

total_net_input_bytes_human:34.39K

total_net_output_bytes_human:74.35K

total_mbufs_inqueue:0

total_msgs_outqueue:0

127.0.0.1:8888> exit

[root@test2 ane]# redis-migrate-tool-c redis-migrate-tool-master/rmt.conf -o log.txt -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 0.045s

[root@test2 ane]# redis-migrate-tool -h 127.0.0.1 -p 8888 shutdown

本文轉自 chaijowin 51CTO部落格,原文連結:http://blog.51cto.com/jowin/1945450,如需轉載請自行聯系原作者