Redis集羣搭建node
redis cluster介紹redis
節點自動發現、集羣容錯slave選舉、Cluster管理、集羣配置管理。vim
集羣中的每一個Redis節點須要2個TCP鏈接端口,如6379端口用於Client鏈接,16379端口用於集羣數據通訊ruby
集羣採用Hash Slot方案,而不是一致性哈希,共16384個Hashslot。若是有3臺機器,那麼NodeA在0-5500,NodeB 在5501-11000,NodeC在11001-16384.這種設計下,添加,刪除新Node比較方便。app
因爲HashSlot在節點間的遷移無需中止操做,集羣新增或者刪除節點,改變集羣內部節點佔用的Slot比例等均可在線完成。tcp
工做方式:ide
內部使用二進制協議優化傳輸速度和帶寬,全部的redis節點彼此互聯(PING-PONG機制)。優化
集羣中超過半數的節點檢測失效時集羣進入fail狀態。ui
客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可lua
狀態和選舉:
(1)領着選舉過程是集羣中全部master參與,若是半數以上master節點與master節點通訊超過(cluster-node-timeout),認爲當前master節點掛掉.
(2):何時整個集羣不可用(cluster_state:fail),當集羣不可用時,全部對集羣的操做作都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤
若是集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也能夠理解成進羣的slot映射[0-16383]不完成時進入fail狀態.
若是進羣超過半數以上master掛掉,不管是否有slave集羣進入fail狀態.
安裝
安裝依賴 ruby
yum install ruby rubygems
安裝redis cluster
tar zxvf redis-3.2.3.tar.gz
cd redis-3.2.3
make
cp redis-3.0.5/src/redis-trib.rb /bin/
cp redis-3.0.5/src/redis-server /bin/
cp redis-3.0.5/src/redis-cli /bin/
配置文件
vim /etc/redis_6380.conf
daemonize yes
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
maxmemory 10gb
databases 16
dir /data/redis/6380
slave-serve-stale-data yes
loglevel notice
logfile "/data/redis/6380/redis_6380.log"
#slave只讀
slave-read-only yes
#not use default
repl-disable-tcp-nodelay yes
slave-priority 100
appendonly yes
#打開aof持久化
appendfsync everysec
#每秒一次aof寫
no-appendfsync-on-rewrite yes
#關閉在aof rewrite的時候對新的寫操做進行fsync
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
cluster-enabled yes
#打開redis集羣
cluster-config-file /data/redis/6380/nodes-6380.conf
cluster-node-timeout 15000
#節點互連超時的閥值(單位毫秒)
cluster-migration-barrier 1
#一個主節點在擁有多少個好的從節點的時候就要割讓一個從節點出來給其餘沒有從節點或者從節點掛掉的主節點
cluster-require-full-coverage no
#若是某一些key space沒有被集羣中任何節點覆蓋,最多見的就是一個node掛掉,集羣將中止接受寫入
auto-aof-rewrite-percentage 80-100
#部署在同一機器的redis實例,把auto-aof-rewrite搓開,防止瞬間fork全部redis進程作rewrite,佔用大量內存
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
啓動服務
redis-server /etc/redis_6380.conf
redis-server /etc/redis_6381.conf
集羣配置參數
全部的集羣配置參數都存在於redis.conf中,主要幾個以下:
Cluster-enabled :是否開啓集羣模式
Cluster-config-file :集羣配置變動後會自動寫入改文件
Cluster-node-timeout :節點超時時間,超過該時間沒法鏈接主要Master節點後,會中止接受查詢服務
Cluster-slave-validity-factor :控制從節點FailOver相關的設置
設爲0,從節點會一直嘗試啓動FailOver.
設爲正數,失聯大於必定時間(factor*節點TimeOut),再也不進行FailOver
Cluster-migration-barrier :最小從節點鏈接數
Cluster-require-full-coverage :默認爲Yes,丟失必定比例Key後(可能Node沒法鏈接或者掛掉),集羣中止接受寫操做
設置爲No,集羣丟失Key的狀況下仍提供查詢服務
建立集羣
/usr/local/redis-3.2.3/bin/redis-trib.rbcreate --replicas 1 192.168.0.131:6380 192.168.0.132:6380 192.168.0.154:6380192.168.0.154:6381 192.168.0.132:6381 192.168.0.131:6381
輸入yes
查看集羣狀態
redis-trib.rb check192.168.0.131:6380 //集羣任一節點
其餘
添加節點
redis-trib.rb add-node 新節點 舊節點(集羣任意節點)
添加節點爲指點節點的從節點
redis-trib.rb add-node --slave--master-id '304f069a63299b……(master節點id)' 新節點 127.0.0.1:6380(集羣任意節點)
從新分配slot
redis-trib.rb reshard192.168.10.219:6378 //下面是主要過程
How many slots do you want to move(from 1 to 16384)? 1000 //設置slot數1000
What is the receiving node ID?03ccad2ba5dd1e062464bc7590400441fafb63f2 //新節點
node id Please enter all the sourcenode IDs.
Type 'all' to use all the nodes assource nodes for the hash slots.
Type 'done' once you entered all thesource nodes IDs.
Source node #1:all //表示所有節點從新洗牌
Do you want to proceed with the proposedreshard plan (yes/no)? yes //確認從新分
刪除節點
1,刪除從節點
# redis-trib.rb del-node 192.168.0.131:6381 '304f069a63299bf4b20d2f018a3b2c3bba650a53'
2,刪除主節點
若是主節點有從節點,將從節點轉移到其餘主節點
若是主節點有slot,去掉分配的slot,而後在刪除主節點
redis-trib.rb reshard192.168.0.131:6381 //取消分配的slot,下面是主要過程
How many slots do you want to move (from 1to 16384)? 1000 //被刪除master的全部slot數量
What is the receiving node ID?304f069a63299bf4b20d2f018a3b2c3bba650a53 //接收6381節點slot的master
Please enter all the source node IDs.
Type 'all' to use all the nodes as sourcenodes for the hash slots.
Type 'done' once you entered all the sourcenodes IDs.
Source node#1:304f069a63299bf4b20d2f018a3b2c3bba650a53 //被刪除master的node-id
Source node #2:done
Doyou want to proceed with the proposed reshard plan (yes/no)? yes //取消slot後,reshard
新增master節點後,也進行了這一步操做,當時是分配,如今去掉。反着的。
# redis-trib.rb del-node192.168.0.131:6381 '304f069a63299bf4b20d2f018a3b2c3bba650a53'