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
會顯示出每個node的id。
把這些複製到文字檔案中,為下一步使用。
接下來退出 ./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行顯示出來,叢集就是正常的。