看過 高性能網站架構之緩存篇--Redis安裝配置和高性能網站架構之緩存篇--Redis使用配置端口轉發 這兩篇文章的,相信你已經對redis有一定的了解,并能夠安裝上,進行簡單的使用了,但是在咱們的實際應用中,使用redis肯定不會使用單機版,不光是redis不能使用單機版,其他的也不會使用,是以今天我們來說一下redis cluster的安裝。
1. Redis Cluster的架構圖。
(1)所有的redis節點彼此互聯(PING-PONG機制),内部使用二進制協定優化傳輸速度和帶寬.
(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
(3)用戶端與redis節點直連,不需要中間proxy層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。
(4)redis-cluster把所有的實體節點映射到[0-16383]slot上(哈希槽),cluster 負責維護
Redis 叢集中内置了 16384 個哈希槽,當需要在Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編号在 0-16383 之間的哈希槽,redis 會根據節點數量大緻均等的将哈希槽映射到不同的節點。
2. redis-cluster投票:容錯
(1)領着投票過程是叢集中所有master參與,如果半數以上master節點與其中一個master節點通信逾時(cluster-node-timeout),認為目前master節點挂掉.
(2):什麼時候整個叢集不可用(cluster_state:fail)?
a:如果叢集任意master挂掉,且目前master沒有slave.叢集進入fail狀态,也可以了解成叢集的slot映射[0-16383]不完成時進入fail狀态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,預設關閉,打開叢集相容部分失敗.
b:如果叢集超過半數以上master挂掉,無論是否有slave叢集進入fail狀态.
ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤。
3. 安裝環境
Redis Cluster的安裝需要的環境我們需要準備好,最重要的最難解決的就是ruby環境,在這裡,給大家一個連接配接,如至直接安裝ruby,安裝不上的話,大家可以參考這篇文章RubyGems鏡像,淘寶的ruby鏡像。他是沒15分鐘更新一次,是以跟國外的基本一樣。
4. 叢集搭建
本次為實驗教程,是以在一台虛拟機中進行搭建,跟在多台真機上搭建其實沒有什麼差別,隻要保證網絡通信ok就可以了!
我們在幾台機器上通過端口号的不同,搭建一個僞叢集。在一個伺服器上建立多個redis執行個體。端口号如下所示
主節點:127.0.0.1:7001 127.0.0.1:7002127.0.0.1:7003
從節點:127.0.0.1:7004127.0.0.1:7005127.0.0.1:7006
在/usr/local下建立redis-cluster目錄,其下建立redis01、redis02。。redis06目錄,如下:
然後我們将redis 安裝到redis01中,安裝完以後我們在将Redis編譯目錄中的redis。Conf檔案複制到redis01目錄下,就會看到在redis01目錄下會有如下的檔案。

然後我們将redis01檔案夾的檔案分别複制到redis02……redis06檔案夾中。同時将redis源碼目錄src下的redis-trib.rb拷貝到redis-cluster目錄下。
修改每個檔案夾下的配置檔案,有三點需要修改,每個配置檔案都要配置自己的端口号,不能重複。
準備好以上工作以後,我們分别啟動每個redis進行的執行個體。如果麻煩的話,可以自己寫一個執行腳本。啟動完畢以後我們輸入指令ps ax|grep redis ,檢視執行個體是否啟動,出現如下是以圖檔,表示所有的執行個體都啟動了。
執行個體啟動完以後,我們要開始建立叢集,在redis-cluter檔案夾下執行如下指令。
./redis-trib.rbcreate --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004127.0.0.1:7005 127.0.0.1:7006。
>>> Creating cluster
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
Connecting to node 127.0.0.1:7006: OK
>>> Performing hash slotsallocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: 5a8523db7e12ca600dc82901ced06741b3010076127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 2a61b87b49e5b1c84092918fa2467dd70fec115f127.0.0.1:7004
replicates 5a8523db7e12ca600dc82901ced06741b3010076
S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65127.0.0.1:7005
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632127.0.0.1:7006
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
Can I set the above configuration? (type'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different configepoch to each node
>>> Sending CLUSTER MEET messagesto join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check(using node 127.0.0.1:7001)
M: 2a61b87b49e5b1c84092918fa2467dd70fec115f127.0.0.1:7004
slots: (0 slots) master
M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65127.0.0.1:7005
M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632127.0.0.1:7006
[OK] All nodes agree about slotsconfiguration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
複制代碼
這樣就表示我們的叢集建立成功了!
5. 叢集測試
我們輸入redis01/redis-cli -h 127.0.0.1 -p 7002–c指令後,切忌要加入-c,否則我們進入的不是叢集環境。進入用戶端以後,我們輸入set a 100 發現他會進行跳轉,這就是因為他經過計算以後,要存儲100的hash槽在7003 執行個體上。這樣就表示我們的叢集成功了!
關閉redis叢集不能直接kill掉程序,或者關機,我們要通過指令redis01/redis-cli -p 7001 shutdown進行關閉,這樣在關閉之前,資料才能夠進行儲存。
本文作者:berqilee
本文來自雲栖社群合作夥伴rediscn,了解相關資訊可以關注redis.cn網站。