前提:以前由於redis-cluster沒有php客戶端+小白鼠,因此直接一票否決,當前狀況下使用的redis高可用是經過哨兵+腳本vip切換,但目前redis支持了php客戶端,我準備測試下redis cluster.php
參考官網文檔:http://redis.io/topics/cluster-tutorialnode
使用版本:3.0.7 下載地址:http://redis.io/downloadweb
server環境:10.1.3.191 redis
目的:構建一個6個master、6個slave的集羣環境ruby
1. 下載bash
cd /opt/soft/app
2. 解壓安裝
測試
tar -zxf redis-3.0.7.tar.gz spa
cd redis-3.0.7
make && make install
3. 統一配置文件
cd /opt/soft/redis-3.0.7/
cp redis.conf redis.conf_bak
重點參數以下:
maxmemory 5Gb port 7000 cluster-enabled yes pidfile /var/run/redis_7000.pid cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes dir /u01/redis-cluster-test/7000/data/ logfile "/u01/redis-cluster-test/log/redis_7000.log"
4. 系統配置
echo 512 >/proc/sys/net/core/somaxconn sysctl vm.overcommit_memory=1 echo never > /sys/kernel/mm/transparent_hugepage/enabled yum install ruby rubygems -y gem install redis
5. 統一腳本配置
function create_dir { #建立數據文件和配置文件目錄 port="7001 7002 7003 7004 7005 8000 8001 8002 8003 8004 8005" for i in $port; do mkdir -p /etc/redis/$i/ mkdir -p /u01/redis-cluster-test/$i/data/ done mkdir -p /u01/redis-cluster-test/log } function conf { # 修改配置文件 port="7001 7002 7003 7004 7005 8000 8001 8002 8003 8004 8005 " for i in $port; do cp /etc/redis/7000/redis.conf /etc/redis/$i/ #copy redis.conf cd /etc/redis/$i/ sed -i "s/7000/$i/g" redis.conf done } function start_redis { /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7000/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7001/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7002/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7003/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7004/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7005/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8000/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8001/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8002/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8003/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8004/redis.conf & /opt/soft/redis-3.0.7/src/redis-server /etc/redis/8005/redis.conf & } create_dir conf start_redis
執行腳本啓動後以下展現
6. 建立集羣
#創建12個實例的集羣
/opt/soft/redis-3.0.7/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:8000 127.0.0.1:8001 \ 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005
7. 集羣管理命令
集羣 CLUSTER INFO 打印集羣的信息 CLUSTER NODES 列出集羣當前已知的全部節點(node),以及這些節點的相關信息。 節點 CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點添加到集羣當中,讓它成爲集羣的一份子。 CLUSTER FORGET <node_id> 從集羣中移除 node_id 指定的節點。 CLUSTER REPLICATE <node_id> 將當前節點設置爲 node_id 指定的節點的從節點。 CLUSTER SAVECONFIG 將節點的配置文件保存到硬盤裏面。 槽(slot) CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。 CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。 CLUSTER FLUSHSLOTS 移除指派給當前節點的全部槽,讓當前節點變成一個沒有指派任何槽的節點。 CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,若是槽已經指派給另外一個節點,那麼先讓另外一個節點刪除該槽>,而後再進行指派。 CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。 CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。 鍵 CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪一個槽上。 CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
8. 集羣簡單測試
測試1:查看集羣狀態等
測試2:模擬宕機切換
注意一點集羣客戶端鏈接方式須要用:redis-cli -c -p 7000 登錄,不然在執行寫入的時候會報錯
附: -c Enable cluster mode (follow -ASK and -MOVED redirections)
127.0.0.1:7000> set tiger bear
(error) MOVED 2772 127.0.0.1:7001
127.0.0.1:7000> get tiger
(error) MOVED 2772 127.0.0.1:7001
redis-cli -c -p 7000
127.0.0.1:7000> set tiger bear
-> Redirected to slot [2772] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get tiger
"bear"
127.0.0.1:7001>
高可用測試1:模擬轉存的實例宕機
上述說明在7000實例插入的key備份在了7001實例上,經過其餘節點來訪問key(tiger)的時候,也都是提示分發到7001端口。
# redis-cli -c -p 7001 127.0.0.1:7001> SHUTDOWN not connected> # redis-cli -c -p 7004 127.0.0.1:7004> get tiger -> Redirected to slot [2772] located at 127.0.0.1:8001 "bear"
說明:主動shutdown7001端口後,再去其餘節點訪問key(tiger),會轉發的8001(7001的slave)
這裏的slave並不一樣於slaveof中的slave概念,是集羣給實例的定位,做爲M的備切點,因此實際使用的時候,做爲‘主備’的實例不要放在一個機器上。
好,咱們再啓動7001實例,又會怎麼樣的?
# /opt/soft/redis-3.0.7/src/redis-server /etc/redis/7001/redis.conf &
結果是再次訪問仍是會訪問8001實例,咱們把8001下掉,以下是測試結果
# redis-cli -c -p 7004 127.0.0.1:7004> get tiger -> Redirected to slot [2772] located at 127.0.0.1:8001 "bear" # redis-cli -c -p 8001 127.0.0.1:8001> SHUTDOWN not connected> # redis-cli -c -p 7004 127.0.0.1:7004> get tiger (error) CLUSTERDOWN The cluster is down 127.0.0.1:7004> get tiger -> Redirected to slot [2772] located at 127.0.0.1:7001 "bear"
當8001下掉的時候,立馬訪問會提示集羣宕機,是由於集羣切換也須要時間,短暫不能用,很快切換後又回到7001節點。
今天先寫到這,後續繼續添加內容.....
繼續以前:
<1> 添加新的master節點;
a. 新啓動一個實例9000 ok (do it yourself)
b. redis-trib.rb add-node 10.1.3.191:9000 10.1.3.191:7000
c. 分配數據
redis-trib.rb reshard 10.1.3.191:9000
輸入被分配的實例id:57e15ffc521a26e4c314447a31ba85afa8d87324
而後被分配的slot個數:1000
系統會打印出來須要轉移的slot跟你確認,輸入yes肯定
go~~
<2> 添加一個slave節點
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
./redis-trib del-node 127.0.0.1:7000 57e15ffc521a26e4c314447a31ba85afa8d87324
<4> 遷移一個slave節點
進入某個slave節點,執行 CLUSTER REPLICATE 57e15ffc521a26e4c3144324
便可更換slave信息