加載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,如需轉載請自行聯系原作者