1. 程式人生 > >3、Redis 叢集特性之容錯、資料遷移

3、Redis 叢集特性之容錯、資料遷移

前言:

該篇中主要講解一下redis的容錯以及資料的遷移(橫向拓展)

redis 叢集資訊

在前面章節中講到將Node加入到cluster以後列印瞭如下日誌:

[[email protected] src]# ./redis-trib.rb create --replicas 1 192.168.1.103:7000 192.168.1.103:7001 192.168.1.103:7002 192.168.1.103:7003 192.168.1.103:7004 192.168.1.103:7005 
>>> Creating cluster
Connecting to node 192.168.1.103:7000: OK
Connecting to node 192.168.1.103:7001: OK
Connecting to node 192.168.1.103:7002: OK
Connecting to node 192.168.1.103:7003: OK
Connecting to node 192.168.1.103:7004: OK
Connecting to node 192.168.1.103:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.103:7000
192.168.1.103:7001
192.168.1.103:7002
Adding replica 192.168.1.103:7003 to 192.168.1.103:7000
Adding replica 192.168.1.103:7004 to 192.168.1.103:7001
Adding replica 192.168.1.103:7005 to 192.168.1.103:7002
M  4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000
   slots:0-5460(5461 slots) master 
M: f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001
   slots:5461-10922 (5462 slots) master
M: 7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002
   slots:10923-16383 (5461 slots) master
S: 778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003
   replicates 4bc092eb4731152d15172b065c74c7a795fe6304
S: 907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004
   replicates f37ec54101536425ce8798e041ad75a582d7e153
S: b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005
   replicates 7b0ca3978858454051ad572aa816eec450f31a53
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 192.168.1.103:7000)
M: 4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000
   slots:0-5460 (5461 slots) master
M: f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001
   slots:5461-10922 (5462 slots) master
M: 7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002
   slots:10923-16383 (5461 slots) master
M: 778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003
   slots: (0 slots) master
   replicates 4bc092eb4731152d15172b065c74c7a795fe6304
M: 907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004
   slots: (0 slots) master
   replicates f37ec54101536425ce8798e041ad75a582d7e153
M: b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005
   slots: (0 slots) master
   replicates 7b0ca3978858454051ad572aa816eec450f31a53
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可以得到如下資訊

節點名稱

7000

7001

7002

7003

7004

7005

NODEID

4bc092eb4731152d15172b065c74c7a795fe6304

f37ec54101536425ce8798e041ad75a582d7e153

7b0ca3978858454051ad572aa816eec450f31a53

778e649f47fa98f6d1f6b1f1043812c6685dc4a8

907feee1b665554cadc64921c7fcb8c05b8a5ab6

b2bea8ede402e2112cced7d7cea52127f18edef2

主從

master

master

master

slave

slave

slave

所屬mater節點

7000

7002

7001

slot

0-5460

5461-10922

10923-16383



redis叢集提供16384 slot,slot可以理解為儲存單元,在一個slot可存放多個key值,叢集環境下,16384個slot分配給master節點,這也解釋了為什麼在slave節點上不能進行寫操作。

連線到任意一個節點,查詢叢集相關資訊

192.168.1.103:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_sent:10436
cluster_stats_messages_received:10106

查詢叢集節點資訊
192.168.1.103:7001> cluster nodes
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 1439569459017 4 connected
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439569460528 3 connected 10923-16383
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439569461031 5 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master - 0 1439569460025 1 connected 0-5460
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439569459520 6 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 myself,master - 0 0 2 connected 5461-10922
192.168.1.103:7001> 

該命令能有效觀察叢集資訊!!!

叢集容錯:選舉

增加節點 node-7006

啟動該節點

[[email protected] my-redis-cluster]# ls
node-7000.conf  node-7001.conf  node-7002.conf  node-7003.conf  node-7004.conf  node-7005.conf  node-7006.conf
[[email protected] my-redis-cluster]# redis-server  node-7006.conf 
[[email protected] my-redis-cluster]# ps -ef | grep redis
root      2382     1  0 8月14 ?       00:00:05 redis-server *:7000 [cluster]
root      2394     1  0 8月14 ?       00:00:05 redis-server *:7001 [cluster]
root      2398     1  0 8月14 ?       00:00:05 redis-server *:7002 [cluster]
root      2402     1  0 8月14 ?       00:00:05 redis-server *:7003 [cluster]
root      2408     1  0 8月14 ?       00:00:05 redis-server *:7004 [cluster]
root      2414     1  0 8月14 ?       00:00:05 redis-server *:7005 [cluster]
root      2929     1  0 00:29 ?        00:00:00 redis-server *:7006 [cluster]
root      2933  2248  0 00:29 pts/0    00:00:00 grep --color=auto redis

此時該節點不在當前的叢集中,將該節點加入到叢集,使用 cluster meet ip port,注意是在客戶端執行該命令哦~~
192.168.1.103:7001> cluster meet 192.168.1.103 7006
OK

重新查詢叢集資訊

192.168.1.103:7001> cluster nodes
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 1439570083805 4 connected
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439570085318 3 connected 10923-16383
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439570085822 5 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master - 0 1439570085822 1 connected 0-5460
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439570084814 6 connected
c75edec9024b2ef4397b70fde2d5227aa9135900 192.168.1.103:7006 master - 0 1439570084309 0 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 myself,master - 0 0 2 connected 5461-10922
預設加入的節點為master,由於該master沒有分配任何的slot,可以講該節點掛在其他的master下,作為master下的slave。

接下來看下如何將7006掛到7000下

切換到7006客戶端

mac:bin lkl$ ./redis-cli -c -h 192.168.1.103 -p 7006
執行 cluster  replicate master-node-id
192.168.1.103:7006> cluster replicate 4bc092eb4731152d15172b065c74c7a795fe6304
OK

再次查詢cluster nodes
192.168.1.103:7006> cluster nodes 
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439570605532 2 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master - 0 1439570604025 1 connected 0-5460
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 1439570603524 1 connected
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439570604528 3 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 master - 0 1439570603524 2 connected 5461-10922
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439570604025 3 connected 10923-16383
c75edec9024b2ef4397b70fde2d5227aa9135900 192.168.1.103:7006 myself,slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 0 0 connected

redis 叢集中提高容錯,在master宕機後,會在master下的slave下自主選舉, 當選的slave會升級為mater,同時接管master中的資料。

接下來帶大家看下redis的選舉

在生產環境中,一般都建議將節點數目設定為奇數,enhance容錯能力。

7000下現在有兩個slave 7003 、7006,這裡再增加一個7007掛在7000下,操作類似前面,不再廢話,直接把結果展現出來

[[email protected] redis-3.0.3]# cd my-redis-cluster/
[[email protected] my-redis-cluster]# ls
node-7000.conf  node-7001.conf  node-7002.conf  node-7003.conf  node-7004.conf  node-7005.conf  node-7006.conf  node-7007.conf
[[email protected] my-redis-cluster]# redis-server node-7007.conf 
[[email protected] my-redis-cluster]# ps -ef | grep redis
root      2382     1  0 8月14 ?       00:00:07 redis-server *:7000 [cluster]
root      2394     1  0 8月14 ?       00:00:07 redis-server *:7001 [cluster]
root      2398     1  0 8月14 ?       00:00:07 redis-server *:7002 [cluster]
root      2402     1  0 8月14 ?       00:00:07 redis-server *:7003 [cluster]
root      2408     1  0 8月14 ?       00:00:07 redis-server *:7004 [cluster]
root      2414     1  0 8月14 ?       00:00:07 redis-server *:7005 [cluster]
root      2929     1  0 00:29 ?        00:00:01 redis-server *:7006 [cluster]
root      3128     1  0 00:47 ?        00:00:00 redis-server *:7007 [cluster]
root      3132  2248  0 00:48 pts/0    00:00:00 grep --color=auto redis

192.168.1.103:7006> cluster meet 192.168.1.103 7007
OK
192.168.1.103:7006> cluster nodes
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439571019922 2 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master - 0 1439571020927 1 connected 0-5460
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 1439571020424 1 connected
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439571020927 3 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 master - 0 1439571019416 2 connected 5461-10922
054b9e2efd44f8704d1aa6851f75f316911b7b4d 192.168.1.103:7007 master - 0 1439571019214 0 connected
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439571020927 3 connected 10923-16383
c75edec9024b2ef4397b70fde2d5227aa9135900 192.168.1.103:7006 myself,slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 0 0 connected

mac:bin lkl$ ./redis-cli -c -h 192.168.1.103 -p 7007 
192.168.1.103:7007> cluster replicate 4bc092eb4731152d15172b065c74c7a795fe6304
OK
192.168.1.103:7007> cluster nodes
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439571183241 3 connected
054b9e2efd44f8704d1aa6851f75f316911b7b4d 192.168.1.103:7007 myself,slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 0 0 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master - 0 1439571182232 1 connected 0-5460
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439571183241 3 connected 10923-16383
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439571182736 2 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 master - 0 1439571184249 2 connected 5461-10922
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 1439571182736 1 connected
c75edec9024b2ef4397b70fde2d5227aa9135900 192.168.1.103:7006 slave 4bc092eb4731152d15172b065c74c7a795fe6304 0 1439571183745 1 connected

經過以上操作,7007將掛在7000下。

模擬7000宕機,直接kill process

[[email protected] my-redis-cluster]# ps -ef | grep redis
root      2382     1  0 8月14 ?       00:00:07 redis-server *:7000 [cluster]
root      2394     1  0 8月14 ?       00:00:07 redis-server *:7001 [cluster]
root      2398     1  0 8月14 ?       00:00:07 redis-server *:7002 [cluster]
root      2402     1  0 8月14 ?       00:00:07 redis-server *:7003 [cluster]
root      2408     1  0 8月14 ?       00:00:07 redis-server *:7004 [cluster]
root      2414     1  0 8月14 ?       00:00:07 redis-server *:7005 [cluster]
root      2929     1  0 00:29 ?        00:00:01 redis-server *:7006 [cluster]
root      3128     1  0 00:47 ?        00:00:00 redis-server *:7007 [cluster]
root      3132  2248  0 00:48 pts/0    00:00:00 grep --color=auto redis
[[email protected] my-redis-cluster]# kill -9 2382
等待一段時間以後,通過客戶端連線上任意一個節點,查詢叢集情況
mac:bin lkl$ ./redis-cli -c -h 192.168.1.103 -p 7003
192.168.1.103:7003> cluster nodes
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439571326184 3 connected 10923-16383
054b9e2efd44f8704d1aa6851f75f316911b7b4d 192.168.1.103:7007 slave c75edec9024b2ef4397b70fde2d5227aa9135900 0 1439571324671 7 connected
c75edec9024b2ef4397b70fde2d5227aa9135900 192.168.1.103:7006 master - 0 1439571324671 7 connected 0-5460
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 myself,slave c75edec9024b2ef4397b70fde2d5227aa9135900 0 0 4 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 master - 0 1439571324671 2 connected 5461-10922
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439571325177 6 connected
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439571326183 5 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master,fail - 1439571226713 1439571225807 1 disconnected


 可以看到 slave通過自主選舉功能,7006接替了7000的工作,分配了0-5460slot

資料遷移:slot的變遷

隨著業務的發展,redis的節點承載的壓力也會增大,redis的叢集可通過水平橫向的拓展,在叢集中加入新的master-slave去分擔叢集中其他節點的壓力。由於redis cluster中資料存放在slot中,可以將線上的reids資料

slot遷移到新加入的master-slave。接下來講述下如何操作slot。

將指定的slot遷移到指定節點id的master上

192.168.1.103:7006> cluster setslot  6 node  7b0ca3978858454051ad572aa816eec450f31a53
OK
192.168.1.103:7006> cluster nodes
907feee1b665554cadc64921c7fcb8c05b8a5ab6 192.168.1.103:7004 slave f37ec54101536425ce8798e041ad75a582d7e153 0 1439574079852 2 connected
4bc092eb4731152d15172b065c74c7a795fe6304 192.168.1.103:7000 master,fail - 1439571226672 1439571224258 1 disconnected
778e649f47fa98f6d1f6b1f1043812c6685dc4a8 192.168.1.103:7003 slave c75edec9024b2ef4397b70fde2d5227aa9135900 0 1439574077836 7 connected
b2bea8ede402e2112cced7d7cea52127f18edef2 192.168.1.103:7005 slave 7b0ca3978858454051ad572aa816eec450f31a53 0 1439574078342 3 connected
f37ec54101536425ce8798e041ad75a582d7e153 192.168.1.103:7001 master - 0 1439574079852 2 connected 5461-10922
054b9e2efd44f8704d1aa6851f75f316911b7b4d 192.168.1.103:7007 slave c75edec9024b2ef4397b70fde2d5227aa9135900 0 1439574078342 7 connected
7b0ca3978858454051ad572aa816eec450f31a53 192.168.1.103:7002 master - 0 1439574078342 3 connected 6 10923-16383
c75edec9024b2ef4397b70fde2d5227aa9135900 192.168.1.103:7006 myself,master - 0 0 7 connected 0-5 7-5460

這裡只是舉個例子,遷移還有很多的其他的操作,大家可以自行搜尋。


轉載請註明
http://blog.csdn.net/liaokailin/article/details/47670895


歡迎關注,您的肯定是對我最大的支援