redis cluster 安裝指南

來源:互聯網
上載者:User

標籤:

公司的很多項目在使用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 安裝指南

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.