講到redis的遷移,通常會使用rdb或者aof在主庫作自動重載到目標庫方法。但該方法有個問題就是沒法保證源節點數據和目標節點數據保持一致,通常線上環境也不容許源庫停機,因此要在遷移過程後還要實現同步達到數據的一致性。公司線上環境使用的是redis本身的cluster,每一個節點都擁有多個rdb和aof文件,使用原始方法無疑是難上加難。本文主要討論兩種方法來實現不停機源庫前提下,實現源庫(redis cluster)到目標庫(cluster或者單實例)的遷移:
- 採用redis replication實現
- 使用開源同步開源工具
方法一:經過redis複製機制,將目標節點做爲源節點的從節點,而後關閉源節點,進行主從自動fail over,最後再關閉並刪除源節點實例
1.運行環境:
源節點實例:127.0.0.1:12000/127.0.0.1:12001/127.0.0.1:12002
[root@10_86_30_37_10.86.30.37 mycluster_export1]# redis-cli -p 12000 cluster nodes
e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea 127.0.0.1:12000 myself,master - 0 0 1 connected 0-5000
f63f0d52372ad8b5c414c47e9318717b6aa113cc 127.0.0.1:12001 master - 0 1463025774035 2 connected 5001-10000
fdeb68f696290a91f08a5da3b8a3c585aaa35856 127.0.0.1:12002 master - 0 1463025775037 0 connected 10001-16383
遷移目標節點實例:
127.0.0.1:13000/127.0.0.1:13001/127.0.0.1:13002
2.遷移過程
redis-server redis13000.conf
redis-server redis13001.conf
redis-server redis13002.conf
redis-cli -p 13000 cluster meet 127.0.0.1 12000
redis-cli -p 13000 cluster replicate e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p 13001 cluster meet 127.0.0.1 12001
redis-cli -p 13001 cluster replicate f63f0d52372ad8b5c414c47e9318717b6aa113cc
redis-cli -p 13002 cluster meet 127.0.0.1 12002
redis-cli -p 13002 cluster replicate fdeb68f696290a91f08a5da3b8a3c585aaa35856
redis-cli -p 13002 cluster slots
1) 1) (integer) 5001
2) (integer) 10000
3) 1) "127.0.0.1"
2) (integer) 12001
4) 1) "127.0.0.1"
2) (integer) 13001
2) 1) (integer) 10001
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 12002
4) 1) "127.0.0.1"
2) (integer) 13002
3) 1) (integer) 0
2) (integer) 5000
3) 1) "127.0.0.1"
2) (integer) 12000
4) 1) "127.0.0.1"
2) (integer) 13000
redis-cli -p 12000 shutdown
redis-cli -p 13000 cluster nodes
fdeb68f696290a91f08a5da3b8a3c585aaa35856 127.0.0.1:12002 master - 0 1463042318423 0 connected 10001-16383
f63f0d52372ad8b5c414c47e9318717b6aa113cc 127.0.0.1:12001 master - 0 1463042319426 2 connected 5001-10000
e39a73c30dfff3139242e66f8e0a41178b39e280 127.0.0.1:13000 myself,master - 0 0 6 connected 0-5000
1f552bdea453caeaa64b4b33a05e4eedeb3f3dd2 127.0.0.1:13001 slave f63f0d52372ad8b5c414c47e9318717b6aa113cc 0 1463042317421 4 connected
6a70a82c6f07dc4e61a97b6aee7a2994365642cc 127.0.0.1:13002 slave fdeb68f696290a91f08a5da3b8a3c585aaa35856 0 1463042320429 5 connected
e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea 127.0.0.1:12000 master,fail - 1463042217663 1463042214056 1 disconnected
- 刪除已經下線的主節點,一個一個操做,操做中間檢查操做是否成功,由於留言協議和failover須要一段時間
redis-cli -p 13000 cluster forget e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p 13001 cluster forget e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p 13002 cluster forget e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p 13000 cluster nodes
fdeb68f696290a91f08a5da3b8a3c585aaa35856 127.0.0.1:12002 master - 0 1463043284365 0 connected 10001-16383
f63f0d52372ad8b5c414c47e9318717b6aa113cc 127.0.0.1:12001 master - 0 1463043283364 2 connected 5001-10000
e39a73c30dfff3139242e66f8e0a41178b39e280 127.0.0.1:13000 myself,master - 0 0 6 connected 0-5000
1f552bdea453caeaa64b4b33a05e4eedeb3f3dd2 127.0.0.1:13001 slave f63f0d52372ad8b5c414c47e9318717b6aa113cc 0 1463043286369 4 connected
6a70a82c6f07dc4e61a97b6aee7a2994365642cc 127.0.0.1:13002 slave fdeb68f696290a91f08a5da3b8a3c585aaa35856 0 1463043285368 5 connected
redis-cli -p 13000 cluster nodes
e39a73c30dfff3139242e66f8e0a41178b39e280 127.0.0.1:13000 myself,master - 0 0 6 connected 0-5000
1f552bdea453caeaa64b4b33a05e4eedeb3f3dd2 127.0.0.1:13001 slave - 0 1463043457854 4 connected
6a70a82c6f07dc4e61a97b6aee7a2994365642cc 127.0.0.1:13002 slave - 0 1463043458857 5 connected
3.重點細節:
- 刪除的主節點,若是從新啓動,他自身會從新加載集羣配置文件,形成集羣混亂,建議若是想重啓該實例,刪掉集羣配置文件,進行從新配置。
- 必須先關閉master節點後,再刪除。一次不能將全部實例都關閉,逐個操做,不然會形成整個集羣down掉
- 刪除forget節點時,要在全部其餘節點上執行cluster forget 命令,貌似這個命令不會經過留言協議傳播到全部節點