redis cluster 安裝指南

公司的不少項目在使用redis主從。因爲coder的各類毀滅性操做,迫切須要一個能帶故障恢復的架構。所以新版的cluster,開始了測試。vue

1、Cluster 理論基礎

Cluster介紹

Redis集羣是一個提供在多個Redis間節點間共享數據的程序集。node

Redis集羣並不支持處理多個keys的命令,由於這須要在不一樣的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的狀況下可能會致使不可預料的錯誤。redis

Redis 集羣經過分區來提供必定程度的可用性,在實際環境中當某個節點宕機或者不可達的狀況下繼續處理命令。ruby

Redis 集羣的優點:服務器

  • 自動分割數據到不一樣的節點上。
  • 整個集羣的部分節點失敗或者不可達的狀況下可以繼續處理命令。

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中得數據便丟失了。網絡

Cluster 架構

一、redis-cluster架構圖架構

架構細節:app

  • 全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
  • 節點的fail是經過集羣中超過半數的節點檢測失效時才生效。
  • 客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。
  • redis-cluster把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value。

二、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」

安裝到此結束

相關文章
相關標籤/搜索