目前redis支持的cluster特性node
1):節點自動發現redis
2):slave->master 選舉,集羣容錯centos
3):Hot resharding:在線分片ruby
4):進羣管理:cluster xxxbash
5):基於配置(nodes-port.conf)的集羣管理服務器
6):ASK 轉向/MOVED 轉向機制.架構
(1)全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.app
(2)節點的fail是經過集羣中超過半數的節點檢測失效時才生效.工具
(3)客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可優化
(4)redis-cluster把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
redis-cluster選舉:容錯、
(1)領着選舉過程是集羣中全部master參與,若是半數以上master節點與master節點通訊超過(cluster-node-timeout),認爲當前master節點掛掉.
(2):何時整個集羣不可用(cluster_state:fail),當集羣不可用時,全部對集羣的操做作都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
a:若是集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也能夠理解成進羣的slot映射[0-16383]不完成時進入fail狀態.
b:若是進羣超過半數以上master掛掉,不管是否有slave集羣進入fail狀態.
Linux系統版本:
centos 6.5 2.6.32-431.el6.x86_64
Redis-3.0.7
ruby
Centos01:192.168.161.233 從
Centos02:192.168.161.234 從
Centos03:192.168.161.235 從
Centos04:192.168.161.236 主
Centos05:192.168.161.237 主
Centos06:192.168.161.238 主
6臺機器分別安裝 redis-3.0.7 #yum –y install gcc make tcl 安裝軟件依賴包 #cp redis-3.0.7.tar.gz /opt 將安裝包拷貝至opt目錄 #cd /opt 進入opt目錄 #tar –xvf redis-3.0.7.tar.gz 解壓 #cd redis-3.0.7 #make 編譯 安裝redis #make test
daemonize yes //後臺運行開啓 pidfile /bestpayserver/redis-3.0-data/redis.pid //pid文件 port 6380 //reids提供服務端口 logfile "/bestpayserver/redis-3.0-log/redis.log" //日誌文件配置 dir /bestpayserver/redis-3.0-data/ //數據存放路徑 cluster-enabled yes //打開redis集羣 cluster-config-file nodes-6380.conf //cluster集羣配置文件(啓動自動生成) cluster-node-timeout 15000 //節點互鏈超時閥值 appendonly yes
也能夠寫成腳本用salt跑 -------------------------------------------------------------------------華麗的分割線--------------------------------------------------------------------------- #!/usr/bin/bash yum -y install gcc make tcl; cp redis-3.0.7.tar.gz /opt; cd /opt; tar -xvf redis-3.0.7.tar.gz; cd redis-3.0.7; make make test; sed -i 's/daemonize no/daemonize yes/' /opt/redis-3.0.7/redis.conf; sed -i 's/pidfile \/var\/run\/redis.pid/pidfile \/bestpayserver\/redis-3.0-data\/redis.pid/' /opt/redis-3.0.7/redis.conf; sed -i 's/port 6379/port 6380/' /opt/redis-3.0.7/redis.conf; sed -i 's/logfile ""/logfile "\/bestpayserver\/redis-3.0-log\/redis.log"/' /opt/redis-3.0.7/redis.conf; sed -i 's/dir .\//dir \/bestpayserver\/redis-3.0-data\//' /opt/redis-3.0.7/redis.conf; sed -i 's/# cluster-enabled yes/cluster-enabled yes/' /opt/redis-3.0.7/redis.conf; sed -i 's/# cluster-node-timeout 15000/cluster-node-timeout 15000/' /opt/redis-3.0.7/redis.conf; sed -i 's/appendonly no/appendonly yes/' /opt/redis-3.0.7/redis.conf; mkdir -p /bestpayserver/redis-3.0-log/; mkdir -p /bestpayserver/redis-3.0-data/; /opt/redis-3.0.7/src/redis-server /opt/redis-3.0.7/redis.conf &; -------------------------------------------------------------------------更華麗的分割線---------------------------------------------------------------------------
salt安裝
Salt傳輸文件到各服務器 salt 'centos*' cp.get_file salt://redis-3.0.7.tar.gz /home/redis-3.0.7.tar.gz salt 'centos*' cp.get_file salt://sed.sh /home/redis3install.sh salt 'centos*' cmd.run 'sh /home/redis3insatl.sh 查看進程 salt '*' cmd.run 'ps -ef |grep redis'
Reids.trib.rb 是redis集羣命令行工具,是一個ruby程序因此咱們須要ruby環境才能啓動它
隨意挑選兩臺機器安裝ruby
# yum -y install ruby ruby-devel rubygems rpm-build # gem install redis
# /opt/redis-3.0.7/src/redis-trib.rb create --replicas 1 192.168.161.233:6380 192.168.161.234:6380 192.168.161.235:6380 192.168.161.236:6380 192.168.161.237:6380 192.168.161.238:6380
[OK] All 16384 slots covered 則集羣建立成功。
# /opt/redis-3.0.7/src/redis-cli -c -p 6380 //進入redis客戶端 127.0.0.1:6380> cluster info //查看集羣信息
127.0.0.1:6380> cluster nodes //查詢集羣節點
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 槽中的鍵。