公司的很多項目在使用redis主從。由于coder的各種毀滅性操作,迫切需要一個能帶故障恢復的架構。因此新版的cluster,開始了測試。
一、Cluster 理論基礎
Cluster介紹
Redis集群是一個提供在多個Redis間節點間共享數據的程序集。
Redis集群并不支持處理多個keys的命令,因為這需要在不同的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的情況下可能會導致不可預料的錯誤。
Redis 集群通過分區來提供一定程度的可用性,在實際環境中當某個節點宕機或者不可達的情況下繼續處理命令。
Redis 集群的優勢:
-
自動分割數據到不同的節點上。
-
整個集群的部分節點失敗或者不可達的情況下能夠繼續處理命令。
Redis 一致性保證
Redis 并不能保證數據的強一致性. 這意味這在實際中集群在特定的條件下可能會丟失寫操作. 第一個原因是因為集群是用了異步復制. 寫操作過程:
客戶端向主節點B寫入一條命令。
主節點B向客戶端回復命令狀態。
主節點將寫操作復制給他得從節點 B1, B2 和 B3。
主節點對命令的復制工作發生在返回命令回復之后, 因為如果每次處理命令請求都需要等待復制操作完成的話, 那么主節點處理命令請求的速度將極大地降低 —— 我們必須在性能和一致性之間做出權衡。
Redis 集群另外一種可能會丟失命令的情況是集群出現了網絡分區, 并且一個客戶端與至少包括一個主節點在內的少數實例被孤立。. 舉個例子 假設集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個節點, 其中 A 、B 、C 為主節點, A1 、B1 、C1 為A,B,C的從節點, 還有一個客戶端 Z1 假設集群中發生網絡分區,那么集群可能會分為兩方,大部分的一方包含節點 A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節點 B 和客戶端 Z1 。 Z1仍然能夠向主節點B中寫入, 如果網絡分區發生時間較短,那么集群將會繼續正常運作,如果分區的時間足夠讓大部分的一方將B1選舉為新的master,那么Z1寫入B中得數據便丟失了。
Cluster 架構
1、redis-cluster架構圖
架構細節:
-
所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
-
節點的fail是通過集群中超過半數的節點檢測失效時才生效。
-
客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可。
-
redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value。
2、redis-cluster選舉:容錯
-
領著選舉過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉。
-
什么時候整個集群不可用(cluster_state:fail),當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤。
-
如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成進群的slot映射[0-16383]不完成時進入fail狀態。
-
如果進群超過半數以上master掛掉,無論是否有slave集群進入fail狀態。
安裝 Cluster
所需軟件: redis-3.0.6.tar.gz
tcl8.6.1-src.tar.gz rubygems-2.4.2.tgz redis-3.0.0.gem
注意,由于官網,建議6個臺服務器,本人筆記本就啟動三個VM湊合。
192.168.11.12:6379/6380
192.168.11.13:6379/6380
192.168.11.14:6379/6380
1.安裝redis(只演示一臺)
mkdir -pv /usr/local/redis6379/{etc,log,var,data} cd redis-3.0.6 make make PREFIX=/usr/local/redis6379 install
2.配置文件(僅測試,為最少選項):
cat /usr/local/redis6379/etc/redis6379.conf daemonize yes port 6379 appendonly yes appendfilename "appendonly-6379.aof" cluster-enabled yes cluster-config-file /opt/nodes-6379.conf cluster-node-timeout 5000
cluster-enabled 選項用于開實例的集群模式 cluster-config-file 定了保存節點配置文件的路徑, 默認值為 nodes.conf.節點配置文件無須人為修改, 它由 Redis 集群在啟動時創建, 并在有需要時自動進行更新。
3.啟動redis
/usr/local/redis6379/bin/redis-server /usr/local/redis6379/etc/redis6379.conf # ps aux | grep redis root 14968 0.1 0.9 137444 9616 ? Ssl 20:23 0:11 /usr/local/redis6379/bin/redis-server *:6379 [cluster] root 15002 0.1 0.7 137444 7520 ? Ssl 20:23 0:11 /usr/local/redis6380/bin/redis-server *:6380 [cluster]
4.啟動集群
[root@12 10.19.166.212 /usr/local/src/redis-3.0.6/src ] \#/usr/local/src/redis-3.0.6/src/redis-trib.rb create --replicas 1 192.168.11.12:6379 192.168.11.12:6380 192.168.11.13:6379 192.168.11.13:6380 192.168.11.14:6379 192.168.11.14:6380 /usr/bin/env: ruby: 沒有那個文件或目錄
報錯找不到ruby
因為我們還沒有安裝
5.安裝ruby以及ruby依賴
yum -y install ruby ruby-rdoc
注意這時候還缺少依賴,直接開始構建集群的話還會報錯:
\#/usr/local/src/redis-3.0.6/src/redis-trib.rb create --replicas 1 192.168.11.12:6379 192.168.11.12:6380 192.168.11.13:6379 192.168.11.13:6380 192.168.11.14:6379 192.168.11.14:6380 /usr/local/src/redis-3.0.6/src/redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError) from /usr/local/src/redis-3.0.6/src/redis-trib.rb:24
繼續安裝rubygem
tar zxmf rubygems-2.4.2.tgz ruby setup.rb cp bin/gem /usr/local/bin/ gem install -l redis-3.0.0.gem
6.構建集群
/usr/local/src/redis-3.0.6/src/redis-trib.rb create --replicas 1 192.168.11.12:6379 192.168.11.12:6380 192.168.11.13:6379 192.168.11.13:6380 192.168.11.14:6379 192.168.11.14:6380 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.11.14:6379 192.168.11.13:6379 192.168.11.12:6379 Adding replica 192.168.11.13:6380 to 192.168.11.14:6379 Adding replica 192.168.11.14:6380 to 192.168.11.13:6379 Adding replica 192.168.11.12:6380 to 192.168.11.12:6379 M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379 slots:10923-16383 (5461 slots) master S: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380 replicates c776fbe75505f6cc5c452cea363626804d675433 M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379 slots:5461-10922 (5462 slots) master S: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380 replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379 slots:0-5460 (5461 slots) master S: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380 replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 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.11.12:6379) M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379 slots:10923-16383 (5461 slots) master M: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380 slots: (0 slots) master replicates c776fbe75505f6cc5c452cea363626804d675433 M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379 slots:5461-10922 (5462 slots) master M: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380 slots: (0 slots) master replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379 slots:0-5460 (5461 slots) master M: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380 slots: (0 slots) master replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
好了安裝完成了
注:
redis-trib.rb 這個命令在這里用于創建一個新的集群, 選項–replicas 1 表示我們希望為集群中的每個主節點創建一個從節點。
之后跟著的其他參數則是這個集群實例的地址列表,3個master3個slave。
在這里可以 :/usr/local/src/redis-3.0.6/src/redis-trib.rb create –replicas 0 192.168.11.12:6379 192.168.11.13:6379 192.168.11.14:6379 表示不做slave
之后在redis-trib.rb add-node 192.168.11.12:6380 192.168.11.13:6380 添加節點
下面檢查一下節點:
/usr/local/src/redis-3.0.6/src/redis-trib.rb check 192.168.11.12:6379 >>> Performing Cluster Check (using node 192.168.11.12:6379) M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380 slots: (0 slots) slave replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380 slots: (0 slots) slave replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380 slots: (0 slots) slave replicates c776fbe75505f6cc5c452cea363626804d675433 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
7.測試寫入:
/usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6379 192.168.11.12:6379> set aa 123 -> Redirected to slot [1180] located at 192.168.11.14:6379 OK 192.168.11.14:6379> [root@13 ~]# /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6380 192.168.11.12:6380> get aa -> Redirected to slot [1180] located at 192.168.11.14:6379 "123" 192.168.11.14:6379>
測試刪除:
[root@12 10.19.166.212 /usr/local/src ] /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6379 shutdown [root@12 10.19.166.212 /usr/local/src ] /usr/local/src/redis-3.0.6/src/redis-trib.rb check 192.168.11.13:6379 >>> Performing Cluster Check (using node 192.168.11.13:6379) M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380 slots:10923-16383 (5461 slots) master 0 additional replica(s) S: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380 slots: (0 slots) slave replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 S: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380 slots: (0 slots) slave replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6380 shutdown /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.14 -p 6379 192.168.11.14:6379> get aa (error) CLUSTERDOWN The cluster is down 192.168.11.14:6379> get bb (error) CLUSTERDOWN The cluster is down 192.168.11.14:6379> quit
/usr/local/redis6379/bin/redis-cli -c -h 192.168.11.14 -p 6379
192.168.11.14:6379> get aa "123" 192.168.11.14:6379> get bb -> Redirected to slot [8620] located at 192.168.11.13:6379 "234"
安裝到此結束
原創文章,作者:可樂,如若轉載,請注明出處:http://www.www58058.com/10841
內容豐滿,標題欠缺專業