搭建redis-cluster環境

前提:之前因爲redis-cluster沒有php客戶端+小白鼠,所以直接一票否決,當前情況下使用的redis高可用是通過哨兵+腳本vip切換,但目前redis支持了php客戶端,我準備測試下redis cluster.


參考官網文檔:http://redis.io/topics/cluster-tutorial

使用版本:3.0.7  下載地址:http://redis.io/download


server環境:10.1.3.191 

目的:構建一個6個master、6個slave的集羣環境


1. 下載

cd /opt/soft/

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


2. 解壓安裝


tar -zxf redis-3.0.7.tar.gz 

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信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章