Redis集羣部署文檔(centos6系統)
(要讓集羣正常工作至少需要3個主節點,在這裏我們要創建6個redis節點,其中三個爲主節點,三個爲從節點,對應的redis節點的ip和端口對應關係如下)
127.0.0.1:7000{192.168.0.170}
127.0.0.1:7001
127.0.0.1:7002
192.168.0.69:7000
192.168.0.69:7001
192.168.0.69:7002
1:下載redis。官網下載3.0.0版本,之前2.幾的版本不支持集羣模式
下載地址:https://github.com/antirez/redis/archive/3.0.0-rc2.tar.gz
2:上傳服務器,解壓,編譯{192.168.0.170服務器}
[root@mysql ~]# wget https://github.com/antirez/redis/archive/3.0.0-rc2.tar.gz
[root@mysql ~]# tar zxvf redis-3.0.0-rc2.tar.gz
[root@mysql ~]#cd redis-3.0.0-rc2.tar.gz
[root@mysql ~]# make
[root@mysql ~]#make install
3:創建集羣需要的目錄
[root@mysql ~]#mkdir /data/redis-clu/{7001,7002,7000} -pv
4:修改配置文件{分別如下}
[root@mysql ~]# cp /root/redis-3.0.0-rc2/redis.conf /data/redis-clu/
[root@mysql ~]# cp /root/redis-3.0.0-rc2/src/redis-server /data/redis-clu/
[root@mysql ~]# vim /data/redis-clu/redis.conf
pid /var/run/redis7000.pid
port 7000
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes7000.conf
cluster-node-timeout 5000
appendonly yes
cluster-require-full-coverage yes
[root@mysql ~]# cp /data/redis-clu/7000/redis.conf
[root@mysql ~]# vim /data/redis-clu/redis.conf
pid /var/run/redis7001.pid
port 7001
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes7001.conf
cluster-node-timeout 5000
appendonly yes
cluster-require-full-coverage yes
[root@mysql ~]# cp /data/redis-clu/7001/redis.conf
[root@mysql ~]# vim /data/redis-clu/redis.conf
pid /var/run/redis7002.pid
port 7002
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes7002.conf
cluster-node-timeout 5000
appendonly yes
cluster-require-full-coverage yes
[root@mysql ~]# cp /data/redis-clu/7002/redis.conf
5:把配置好的文件copy到192.168.0.69服務器上面一份:
[root@mysql ~]# scp -r /data/redis-clu/* 192.168.0.69:/data/redis-clu/
6:在分別在192.168.0.170和192.168.0.69服務器上啓動redis-server服務
[root@mysql redis-clu]# ls
7000 7002 dump.rdb nodes-7001.conf redis.conf
7001 appendonly.aof nodes-7000.conf nodes-7002.conf redis-server
[root@mysql redis-clu]# pwd
/data/redis-clu
[root@mysql redis-clu]# #./redis-server 7000/redis.conf
[root@mysql redis-clu]# #./redis-server 7001/redis.conf
[root@mysql redis-clu]# #./redis-server 7002/redis.conf
[root@mysql redis-clu]# ss -tunl
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 *:69 *:*
tcp LISTEN 0 128 *:17000 *:*
tcp LISTEN 0 128 *:17001 *:*
tcp LISTEN 0 64 :::873 :::*
tcp LISTEN 0 128 *:17002 *:*
tcp LISTEN 0 128 :::22 :::*
tcp LISTEN 0 128 *:22 *:*
tcp LISTEN 0 128 *:7000 *:*
tcp LISTEN 0 128 *:7001 *:*
tcp LISTEN 0 10 127.0.0.1:25 *:*
tcp LISTEN 0 128 *:7002 *:*
[root@mysql redis-clu]# #表示服務啓動
8:在分別在192.168.0.170和192.168.0.69服務器上安裝:ruby和 rubygems和redis
[root@mysql redis-clu]#yum install -y ruby rubygems
[root@mysql redis-clu]#gem install redis
9:在192.168.0.170上啓動cluster
[root@mysql redis-clu]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 192.168.0.69:7000 192.168.0.69:7001 192.168.0.69:7002
發下如下錯誤:
就在相應的redis下執行
發現是沒有meet到各個服務、;
於是就執行:
這個在查看服務端:
發現集羣做好了 :
剩下的你就可以做測試了:
redis-benchmark -h hostname -p port -s socket -c clients -n requests -d size -q 顯示每秒處理的結果
-l 永久測試 -t tests{方法}
例子:
redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100
set/get 100bytes 檢測host12.0.0.1:6379 的redis性能
redis-benchmark -h 127.0.0.1 -p 6379 -c 5000 -n 100000
5000個併發連接,100000個請求,檢測host爲127.0.0.1 端口爲6379的redis服務器性能
-c:併發數量
-n:請求數量
-t:調用的參數
-d:數據大小
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
100個併發連接,100000個請求,檢測host爲localhost 端口爲6379的redis服務器性能
redis-cli -h localhost -p 6380 monitor
Dump all the received requests in real time;
監控host爲localhost,端口爲6380,redis的連接及讀寫操作
redis-cli -h localhost -p 6380 info
Provide information and statistics about the server ;
提供host爲localhost,端口爲6380,redis服務的統計信息
redis cluster注意的問題 :
1. 'cluster-require-full-coverage'參數的設置。該參數是redis配置文件中cluster模式的一個參數,從字面上基本就能看出它的作用:需要全部覆蓋!
具體點是redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。
redis默認是‘yes’,即需要全覆蓋!建議設置成‘no’。
2. 阻塞命令產生failover。由於一些阻塞命令(flushall, del key1 key2 ...)會造成redis在‘cluster-node-timeout’時間內無法響應其他節點的ping請求,
從而導致其他節點都把該redis標記出了pfail狀態,進而產生failover。redis作者計劃使用lazy redis解決。
3. 連接建立。當redis cluster的節點數多了以後,client對每個節點建立一個tcp連接需要花比較多的時間。如果是長連接,用戶只需忍受一次連接建立的過程,
如果是短連接,那麼頻繁建立連接將會極大的降低效率。但即便是短連接,只要每次請求只涉及到一個key,有些客戶端可能只需要與一個節點建立連接。
4. Jedis。Jedis是redis最流行的Java客戶端,支持redis cluster。
‘MaxRedirectionsException’異常,出現該異常說明剛剛執行的那條命令經過多次重試,沒有執行成功,需要用戶再次執行。
在cluster擴容或者slot遷移的時候比較容易出現。建議捕獲該異常並採取相應重試工作。
Pipeline,Jedis目前不支持cluster模式的pipeline,建議採用多併發代替pipeline。
5. Multi-key。Redis cluster對多key操作有限,要求命令中所有的key都屬於一個slot,纔可以被執行。客戶端可以對multi-key命令進行拆分,再發給redis。
另外一個侷限是,在slot遷移過程中,multi-key命令特別容易報錯(CROSSSLOT Keys in request don't hash to the same slot)。建議不用multi-key命令。
6. 擴容速度慢。redis官方提供了redis cluster管理腳本redis-trib.rb。使用該腳本進行擴容cluster的時候,是串行的遷移slot中的每個key,這樣導致了
擴容的速度非常慢,百G的數據要數小時。擴容時間越長,越容易出現異常。