標籤:
公司的很多項目在使用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.啟動叢集
[[email protected] 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:6379192.168.11.13:6379192.168.11.12:6379Adding replica 192.168.11.13:6380 to 192.168.11.14:6379Adding replica 192.168.11.14:6380 to 192.168.11.13:6379Adding replica 192.168.11.12:6380 to 192.168.11.12:6379M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379 slots:10923-16383 (5461 slots) masterS: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380 replicates c776fbe75505f6cc5c452cea363626804d675433M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379 slots:5461-10922 (5462 slots) masterS: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380 replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379 slots:0-5460 (5461 slots) masterS: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380 replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0Can 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 clusterWaiting 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) masterM: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380 slots: (0 slots) master replicates c776fbe75505f6cc5c452cea363626804d675433M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379 slots:5461-10922 (5462 slots) masterM: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380 slots: (0 slots) master replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379 slots:0-5460 (5461 slots) masterM: 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 945d62135ac298c06e56ea5d3da0bdf4eda86eb0M: 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 ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8M: 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>
[[email protected] ~]# /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6380192.168.11.12:6380> get aa-> Redirected to slot [1180] located at 192.168.11.14:6379"123"192.168.11.14:6379>
測試刪除:
[[email protected] 10.19.166.212 /usr/local/src ]
/usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6379 shutdown
[[email protected] 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 ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8S: 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 down192.168.11.14:6379> get bb(error) CLUSTERDOWN The cluster is down192.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”
安裝到此結束
?
redis cluster 安裝指南