1. 程式人生 > >redis cluster 的手工配置

redis cluster 的手工配置

前言

     自己摸索的redis cluster 手工配置的方法, 方便沒有ruby環境的情況下進行配置,同時也方便了解redis cluster的大體結構。

一 編譯

官方網站  http://redis.io/

下載最新版後,複製到linux主機的某個目錄,該目錄當前使用者有rwx許可權。

redis依賴比較少,一般按照如下命令就可以編譯完成,如果出錯,需要根據錯誤安裝對應的依賴包。

tar zxvf redis-x.x.x.tar.gz
cd redis-x.x.x
make


如上完成之後,會在src目錄下生成5個可執行檔案。

分別是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,

它們的作用如下:

redis-server:Redis伺服器的daemon啟動程式

redis-cli:Redis命令列操作工具。當然,你也可以用telnet根據其純文字協議來操作

redis-benchmark:Redis效能測試工具,測試Redis在你的系統及你的配置下的讀寫效能

redis-check-aof:更新日誌檢查

redis-check-dump:用於本地資料庫檢查

我們只需要 redis-server 和 redis-cli就可以了。

chmod +x redis-server
chmod +x redis-cli


加上執行許可權。

然後可以在其它位置建一個新目錄,然後把這2個檔案複製過去就可以了。

例如 /home/redis/redis_node

給redis指定一個配置檔案,預設是 redis.conf

cd /home/redis/redis_node
vim redis.conf


只需要最小的配置內容就可以,按以下配置為純記憶體方式。

 

其中可以看到第三行是配置 cluster的配置檔案為 nodes.conf,這個檔案不用自己建立,一會建立cluster的時候,會自動根據配置生成。

儲存 redis.conf之後,使用  ./redis-server redis.conf  & 起來就可以了。

如果一臺機器配多個例項,那麼就複製一份 redis_node 出來,

cp -rf redis_node redis_node1

然後改一下 redis.conf裡面的埠就行。

這樣,redis例項就啟動了。

二 叢集的配置

2.1 官方推薦配置(推薦)

         redis是ruby社群裡面流行起來的,所以官方網站上也是主要也是用ruby做了一些工具提供給使用者使用。

如果部署的環境ruby環境安裝比較全面,可以使用官方的redis cluster建立工具。

        在第一章中編譯的src目錄下有一個  redis-trib.rb 檔案。這個就是官方用來配置cluster的工具。

比如你在本機啟動了6個例項,埠分別是 7000 - 7005 。那麼直接使用:

./redis-trib.rb create --replicas 1127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004127.0.0.1:7005

命令就可以把叢集建立完畢。

其中的create --replicas 代表為每臺master建立一個slave,保證高可用。

那麼上面的命令就是建立 3個master 和 3個slave的叢集。

所以至少要6個例項才可以建立成功,如果少於6個例項,執行工具會進行錯誤提示。

具體操作可以自己驗證。

http://redis.io/topics/cluster-tutorial#creating-the-cluster

2.2 手工進行配置

   有時候由於部署環境的限制,無法提供可用的ruby環境,而且用redis-trib.rb不利於瞭解cluster之間的連線機制,出問題了也不好定位,所以最好是能手工進行配置。

    rediscluster有一個設計邏輯,就是給每個redis例項分配一定數量的slots,slot可以理解為存放資料的一個個桶。它定義了一個數量16384  也就是 2的14次方。

    rediscluster定義“叢集當前可用”的狀態就是:這16384個slots(序號是0-16383)都分配到各個例項了,並且例項之前能夠進行通訊。

    例如上面說的3個master的叢集,可以0-5000的 slots放在 master 1 上,5001-10000放到了master 2 上,10001-16383放到了master 3 上面,同時它們倆倆通訊都是通的。那麼叢集就是可用的,可以看到,叢集是否可用,和slave沒有關係。

    slave是在master掛掉的時候,可以及時頂上master的位置。由於rediscluster的設計機制,slave會非同步的複製master上面的slots。所以當master掛了,slave頂替了master的位置,這時候16384個slots依然是完整的,所以整個叢集依然是可用的。

所以手工建立redis cluster簡化為4個步驟:

1. 將16384個slots儘量均勻的分配給各個master例項

2. 建立各個例項(包含master與slave)倆倆之間的通訊聯絡

3. 給每個master至少一個slave,保證高可用

4. 驗證cluster是否可用

第一章中說到redis-cli這個執行檔案,就是用來和redis的例項進行互動的,redis定義了各種命令和例項進行互動。

命令清單參考官方地址

http://redis.io/commands

2.2.1 分配slots

比如有有4臺機器,埠都是6379

10.139.106.208

10.139.99.220

10.139.99.214

10.139.97.158

那麼就是把16384切分為較為均勻的4段。

使用的是cluster addslots 的命令,由於不支援批量新增操作,所以需要使用shell指令碼進行新增。

for i in{0..4095}; do ./redis-cli -h 10.139.106.208 -p 6379 cluster addslots $i; done
 
for i in{4096..8191}; do ./redis-cli -h 10.139.99.220 -p 6379 cluster addslots $i; done
 
for i in{8192..12287}; do ./redis-cli -h 10.139.99.214  -p 6379 clusteraddslots $i; done
 
for i in{12288..16383}; do ./redis-cli -h 10.139.97.158   -p 6379 clusteraddslots $i; done

把每一行儲存為一個sh檔案,然後chmod +x賦予可執行許可權。

這樣就把16384個slots完整的分配給4個master了。

2.2.2 建立各個例項之間的通訊

比如每臺機器都在 6381埠也起了一個redis例項作為slave。

那麼這個叢集應該總共有8個例項,其中4個master和4個slave。

那麼就是建立這8個例項之間的倆倆通訊。

進入某個redis_node目錄,然後執行  ./redis-cli -h 10.139.106.208 -p 6379進入

10.139.106.208:6379這個例項的命令列。

那麼使用cluster meet命令建立通訊:

10.139.106.208:6379> cluster meet 10.139.106.208 6381
 
192.168.180.88:6379> cluster meet 10.139.99.220 6379


類似的把其他7個例項都建立通訊就可以了。

只需要在一臺機器上進行操作就可以,其他機器會自動新增通訊的配置。

例如上面208:6379 使用 cluster meet 分別添加了  208:6381 和 220:6379 這兩個例項,那麼  208:6381 和 220:6379也自動建立了通訊。

2.2.3 給master配置slave

./redis-cli -h 10.139.106.208 -p 6379 進入某個例項的命令列。

10.139.106.208:6379>cluster nodes

會顯示出每個nodeid


把這些複製到文字檔案中,為下一步使用。

接下來退出 ./redis-cli ( ctrl + c) 。

    然後分別登入到各個候選的slave上面 。比如 208:6381 要做 158:6379的slave。

可以看到 158:6379 的id是 be315a2d2a392dd57dc3a07c58d4f2a73a42ce00

./redis-cli -h 10.139.106.208 -p 6381


這樣就把slave加上了。

其他的slave也按照這個方法加到master上面。

2.2.4 驗證叢集是否可用

進入 redis-cli 然後使用cluster info 命令。如果提示

 

這3行顯示出來,叢集就是正常的。