搭建redis-cluster環境

前提:以前由於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

wget  http://219.239.26.10/files/10300000079CAD74/120.52.72.46/download.redis.io/c3pr90ntcsf0/releases/redis-3.0.7.tar.gzide


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

 執行腳本啓動後以下展現

wKiom1bZThfBySM_AATuhKx2eJA978.png





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

wKiom1bZTQ6CD231AA33rCHw3D4348.jpg



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:查看集羣狀態等

wKiom1bZT2yD5wltAAdZZTdJZRk287.png


測試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 

wKioL1bmwBOi0cHmAAaJMn6bM4Y575.png


c. 分配數據

     redis-trib.rb reshard 10.1.3.191:9000

    輸入被分配的實例id:57e15ffc521a26e4c314447a31ba85afa8d87324

    而後被分配的slot個數:1000

    系統會打印出來須要轉移的slot跟你確認,輸入yes肯定

    go~~

    wKiom1bmwO-AZqJSAAE3CqiCuIo637.png

<2> 添加一個slave節點

./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000

<3> 移除一個節點

    ./redis-trib del-node 127.0.0.1:7000 57e15ffc521a26e4c314447a31ba85afa8d87324


<4> 遷移一個slave節點 

    進入某個slave節點,執行 CLUSTER REPLICATE  57e15ffc521a26e4c3144324 

    便可更換slave信息

相關文章
相關標籤/搜索