公司的不少項目在使用redis主從。因爲coder的各類毀滅性操做,迫切須要一個能帶故障恢復的架構。所以新版的cluster,開始了測試。vue
Redis集羣是一個提供在多個Redis間節點間共享數據的程序集。node
Redis集羣並不支持處理多個keys的命令,由於這須要在不一樣的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的狀況下可能會致使不可預料的錯誤。redis
Redis 集羣經過分區來提供必定程度的可用性,在實際環境中當某個節點宕機或者不可達的狀況下繼續處理命令。ruby
Redis 集羣的優點:服務器
Redis 並不能保證數據的強一致性. 這意味這在實際中集羣在特定的條件下可能會丟失寫操做.
第一個緣由是由於集羣是用了異步複製. 寫操做過程:
客戶端向主節點B寫入一條命令。
主節點B向客戶端回覆命令狀態。
主節點將寫操做複製給他得從節點 B1, B2 和 B3。
主節點對命令的複製工做發生在返回命令回覆以後, 由於若是每次處理命令請求都須要等待複製操做完成的話, 那麼主節點處理命令請求的速度將極大地下降 —— 咱們必須在性能和一致性之間作出權衡。 markdown
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中得數據便丟失了。網絡
一、redis-cluster架構圖架構
架構細節:app
二、redis-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」
安裝到此結束