Redis-Cluster實戰--5.使用redis-cli安裝 html
轉載請註明出處哈:http://carlosfu.iteye.com/blog/2240426 node
安裝視頻:redis
8.2.2 redis-cluster安裝1shell
8.2.3 redis-cluster安裝2ruby
8.2.4 redis-cluster安裝糾正 app
1、目的工具
爲何官方提供了ruby構建集羣工具,還要實現一個redis-cli版的集羣構建?spa
答案很簡單:3d
1. 熟悉redis-cluster的集羣命令和協議(做者給的ruby工具都是在這些命令組合起來)視頻
2. 更好的理解redis-cluster
注意:
本文檔只爲了演示redis-cli搭建Redis-Cluster,實際大集羣仍是以工具(例如ruby, 其餘語言封裝的自動化安裝工具爲第一選擇)。
二、準備redis(下載、編譯、安裝、配置目錄、數據目錄)
1. 下載、編譯、安裝
Java代碼 
- cd /opt/soft
- wget http://download.redis.io/releases/redis-3.0.3.tar.gz
- tar xzf redis-3.0.3.tar.gz
- cd redis-3.0.3
- make
- make install
2. 配置目錄、數據目錄
Java代碼 
- cd /opt/soft/redis-3.0.3
- mkdir -p data
- mkdir -p conf
3.創建軟連接:
Java代碼 
- ln -s /opt/soft/redis-3.0.3 /opt/soft/redis
2、配置、啓動Redis節點(本例子以3主、3從組成Redis-Cluster)
實際中應該在多臺機器進行安裝,這裏爲了方便演示只用了一臺機器,ip=10.10.53.159。
1. 配置redis節點,在conf目錄下添加6個(8000-8005)redis-${port}.conf做爲6個節點的配置文件
其中8000-8005是六個端口號
Java代碼 
- port 8000
- cluster-enabled yes
- cluster-config-file nodes-8000.conf
- cluster-node-timeout 15000
- dir "/opt/soft/redis/data/"
- appendonly yes
- appendfilename "appendonly-8000.aof"
- logfile "8000.log"
- daemonize yes
- pidfile /var/run/redis-8000.pid
- dbfilename "dump-8000.rdb"
生成另外5個文件
Java代碼 
- sed 's/8000/8001/g' redis-8000.conf > redis-8001.conf
- sed 's/8000/8002/g' redis-8000.conf > redis-8002.conf
- sed 's/8000/8003/g' redis-8000.conf > redis-8003.conf
- sed 's/8000/8004/g' redis-8000.conf > redis-8004.conf
- sed 's/8000/8005/g' redis-8000.conf > redis-8005.conf
2. 啓動6個節點。
Java代碼 
- redis-server /opt/soft/redis/conf/redis-8000.conf
- redis-server /opt/soft/redis/conf/redis-8001.conf
- redis-server /opt/soft/redis/conf/redis-8002.conf
- redis-server /opt/soft/redis/conf/redis-8003.conf
- redis-server /opt/soft/redis/conf/redis-8004.conf
- redis-server /opt/soft/redis/conf/redis-8005.conf
3. 查看節點是否都已經啓動:
Java代碼 
- [@zw_53_162 conf]# ps -ef | grep redis
- root 26007 1 0 21:56 ? 00:00:00 redis-server *:8000 [cluster]
- root 26011 1 0 21:56 ? 00:00:00 redis-server *:8001 [cluster]
- root 26019 1 0 21:56 ? 00:00:00 redis-server *:8002 [cluster]
- root 26023 1 0 21:56 ? 00:00:00 redis-server *:8003 [cluster]
- root 26033 1 0 21:56 ? 00:00:00 redis-server *:8004 [cluster]
- root 26047 1 0 21:56 ? 00:00:00 redis-server *:8005 [cluster]
4. 查看單個節點:(此時六個節點是分散的,沒有造成集羣,全部cluster_state=fail)
Java代碼 
- [@zw_53_162 conf]# redis-cli -c -p 8000
- 127.0.0.1:8000> cluster info
- cluster_state:fail
- cluster_slots_assigned:0
- cluster_slots_ok:0
- cluster_slots_pfail:0
- cluster_slots_fail:0
- cluster_known_nodes:1
- cluster_size:0
- cluster_current_epoch:0
- cluster_my_epoch:0
- cluster_stats_messages_sent:0
- cluster_stats_messages_received:0
4、利用redis-cluster meet命令,實現節點握手,組成集羣:
cluster meet <ip> <port> 將 ip 和 port 所指定的節點添加到集羣當中,讓它成爲集羣的一份子。
1. 利用redis-cli鏈接到8000,而後meet 8001-8005
Java代碼 
- redis-cli -c -p 8000 cluster meet 10.10.53.159 8001
- redis-cli -c -p 8000 cluster meet 10.10.53.159 8002
- redis-cli -c -p 8000 cluster meet 10.10.53.159 8003
- redis-cli -c -p 8000 cluster meet 10.10.53.159 8004
- redis-cli -c -p 8000 cluster meet 10.10.53.159 8005
5、分配槽(slots)給節點:
1. 分派slots
cluster addslots <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。
redis-cli -c -p 8000 cluster addslots 0 1 2 ...
(redis-cli 未實現0-5462這樣的參數,必須一個個輸入。)
因此利用shell生成最終的命令addslots.sh:
Java代碼 
- start=$1
- end=$2
- port=$3
- for slot in `seq ${start} ${end}`
- do
- echo "slot:${slot}"
- redis-cli -c -p ${port} cluster addslots ${slot}
- done
執行:
sh addslots.sh 0 5460 8000
sh addslots.sh 5461 10922 8001
sh addslots.sh 10923 16383 8002
2. 確認cluster當前狀態 .
Java代碼 
- 127.0.0.1:8000> cluster info
- cluster_state:ok
- cluster_slots_assigned:16384
- cluster_slots_ok:16384
- cluster_slots_pfail:0
- cluster_slots_fail:0
- cluster_known_nodes:6
- cluster_size:3
- cluster_current_epoch:5
- cluster_my_epoch:1
- cluster_stats_messages_sent:1650
- cluster_stats_messages_received:1650
3. 確認分配槽狀態:
Java代碼 
- 127.0.0.1:8000> cluster nodes
- 6690722c4536210a231af4bdceb604e83d53403e 10.10.53.159:8001 master - 0 1440897737597 3 connected 5461-10922
- 4d2842d9f846481783eafbd9135df372e2153307 10.10.53.159:8000 myself,master - 0 0 1 connected 0-5460
- caefaab1e5d01d76a728c84cb1dc285a6aab15a6 10.10.53.159:8005 master - 0 1440897736092 4 connected
- ec403c50e59460bcb0b47906e567423b7d9aed50 10.10.53.159:8003 master - 0 1440897738097 0 connected
- a52b9d211ec06190bcc4ab36eecf643fa13aa215 10.10.53.159:8004 master - 0 1440897736594 5 connected
- c05ebacbeeb6cbcf52a6ac60384891586226f131 10.10.53.159:8002 master - 0 1440897737096 2 connected 10923-16383
-
- 127.0.0.1:8000> cluster slots
- 1) 1) (integer) 5461
- 2) (integer) 10922
- 3) 1) "10.10.53.159"
- 2) (integer) 8001
- 2) 1) (integer) 0
- 2) (integer) 5460
- 3) 1) "10.10.53.159"
- 2) (integer) 8000
- 3) 1) (integer) 10923
- 2) (integer) 16383
- 3) 1) "10.10.53.159"
- 2) (integer) 8002
6、配置主從關係(保證高可用):
cluster replicate <node_id> 將當前節點設置爲 node_id 指定的節點的從節點。
8003設置成8000的從
8004設置成8001的從
8005設置成8002的從
注意這裏的命令不是slaveof
<node_id>不是ip:port的形式,須要查詢cluster nodes查找本身的node_id(myself)
Java代碼 
- redis-cli -c -p 8003 cluster replicate `redis-cli -c -p 8003 cluster nodes | grep 8000 | awk '{print $1}'`
- redis-cli -c -p 8004 cluster replicate `redis-cli -c -p 8003 cluster nodes | grep 8001 | awk '{print $1}'`
- redis-cli -c -p 8005 cluster replicate `redis-cli -c -p 8003 cluster nodes | grep 8002 | awk '{print $1}'`
7、最終確認集羣狀態、節點狀態、分配槽狀態:
Java代碼 
- 集羣狀態:
- 127.0.0.1:8000> cluster info
- cluster_state:ok
- cluster_slots_assigned:16384
- cluster_slots_ok:16384
- cluster_slots_pfail:0
- cluster_slots_fail:0
- cluster_known_nodes:6
- cluster_size:3
- cluster_current_epoch:5
- cluster_my_epoch:1
- cluster_stats_messages_sent:2963
- cluster_stats_messages_received:2963
-
- 三主三從
- 127.0.0.1:8000> cluster nodes
- 6690722c4536210a231af4bdceb604e83d53403e 10.10.53.159:8001 master - 0 1440897872917 3 connected 5461-10922
- 4d2842d9f846481783eafbd9135df372e2153307 10.10.53.159:8000 myself,master - 0 0 1 connected 0-5460
- caefaab1e5d01d76a728c84cb1dc285a6aab15a6 10.10.53.159:8005 slave c05ebacbeeb6cbcf52a6ac60384891586226f131 0 1440897874922 4 connected
- ec403c50e59460bcb0b47906e567423b7d9aed50 10.10.53.159:8003 slave 4d2842d9f846481783eafbd9135df372e2153307 0 1440897874922 1 connected
- a52b9d211ec06190bcc4ab36eecf643fa13aa215 10.10.53.159:8004 slave 6690722c4536210a231af4bdceb604e83d53403e 0 1440897874421 5 connected
- c05ebacbeeb6cbcf52a6ac60384891586226f131 10.10.53.159:8002 master - 0 1440897873920 2 connected 10923-16383
-
- 分配槽狀態:
- 127.0.0.1:8000> cluster slots
- 1) 1) (integer) 10923
- 2) (integer) 16383
- 3) 1) "10.10.53.159"
- 2) (integer) 8002
- 4) 1) "10.10.53.159"
- 2) (integer) 8005
- 2) 1) (integer) 5461
- 2) (integer) 10922
- 3) 1) "10.10.53.159"
- 2) (integer) 8001
- 4) 1) "10.10.53.159"
- 2) (integer) 8004
- 3) 1) (integer) 0
- 2) (integer) 5460
- 3) 1) "10.10.53.159"
- 2) (integer) 8000
- 4) 1) "10.10.53.159"
- 2) (integer) 8003