主Redis寫入數據時,從Redis會經過Redis Sync機制,同步數據,確保數據一致。而且Redis有哨兵(Sentinel)機制,Redis主掛掉會自動幫咱們提高從爲主,不過哨兵我發現只適用一主多從,不太適合級聯模式。redis
級聯複製vim
爲避免主Redis同時讀寫壓力過大,三個包括以上節點的Redis,能夠配置爲級聯複製,以下圖所示,節點4能夠同步節點3數據,也能夠同步節點2數據。安全
一主多從服務器
須要兩個以及以上節點。由於Redis是異步同步數據,數據寫入主節點並返回客戶端,並不表明從節點也已經寫入數據,而從節點同步的結果也並不會返回給主節點,而是會直接丟棄。因此(上圖)級聯複製從節點3同步從節點2數據,就又多了一層丟數據的風險,具體採用哪一種方式看本身狀況。架構
哨兵機制異步
有了主從,那咱們須要對其進行監控,Sentinel會不斷地檢查你的主服務器和從服務器是否運做正常。某個節點故障後,Sentinel 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣能夠使用新主服務器代替失效服務器。Redis Sentinel 是一個分佈式系統, 你能夠在一個架構中運行多個 Sentinel 進程(Progress), 這些進程使用流言協議(Gossip Protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(Agreement Protocols)來決定是否執行自動故障遷移, 以及選擇哪一個從服務器做爲新的主服務器。雖然 Redis Sentinel 釋出爲一個單獨的可執行文件 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 服務器。分佈式
系統環境 Debian,一主一從配置。ui
主節點IP:192.168.198.131spa
從節點IP:192.168.198.132日誌
端口使用默認6379
節點1 節點2 所有執行如下命令,不一樣的地方有標註。
cd /data/ #我習慣把Redis 放在data目錄下
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -xf redis-3.2.9.tar.gz
mv redis-3.2.9 redis
cd redis/
make && make install
cp src/redis-server /usr/bin/redis-server
cp src/redis-cli /usr/bin/redis-cli
mv redis.conf redis.conf~
cat redis.conf~ | grep -Ev "^$|^#" > redis.conf
vim redis.conf #修改如下內容,不是必須的
bind 192.168.198.131 #兩臺主機分別改成本身的IP
logfile "/data/redis/logs/redis.log"
daemonize yes #啓用守護模式
slave-read-only yes #slave 默認就是隻讀的,這裏不用管。
protected-mode no #protected-mode 是3.2 以後加入的新特性,爲了禁止公網訪問redis cache,增強redis安全的。根據本身須要配置,它啓用的條件,有兩個,沒有bind IP 以及沒有設置訪問密碼。
requirepass "admin.123" #設置redis登陸密碼
masterauth "admin.123" #主從認證密碼,不然主從不能同步
啓用主從模式只有Redis Slave 添加一行,啓動服務主從就配置好了。
slaveof 192.168.198.131 6379
檢查主從狀態
~]# redis-cli -c -h 192.168.198.131 -p 6379
192.168.198.131:6379> info
.......
# Replication #中間省略了內容,本身能夠看看,主要是找到這一段,看主從狀態。
role:master
connected_slaves:1
slave0:ip=192.168.198.132,port=6379,state=online,offset=5700675,lag=0
master_repl_offset:5700675
repl_backlog_active:1
repl_backlog_size:10000000
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5707674
.......
vim sentinel.conf #在redis的跟目錄下
port 26379
daemonize yes
protected-mode no #保護模式若是開啓只接受迴環地址的ipv4和ipv6地址連接,拒絕外部連接,並且正常應該配置多個哨兵,避免一個哨兵出現獨裁狀況,若是配置多個哨兵那若是開啓也會拒絕其餘sentinel的鏈接。致使哨兵配置沒法生效。
logfile "/data/redis/logs/sentinel.log" #指明日誌文件
dir "/data/redis/sentinel"
sentinel monitor mymaster 192.168.198.131 6379 1 #哨兵監控的master。
sentinel down-after-milliseconds mymaster 5000 #master或者slave多少時間(默認30秒)不能使用標記爲down狀態。
sentinel failover-timeout mymaster 9000 #若哨兵在配置值內未能完成故障轉移操做,則任務本次故障轉移失敗。sentinel auth-pass mymaster redispass #若是redis配置了密碼,那這裏必須配置認證,不然不能自動切換
/data/redis/src/redis-sentinel /data/redis/sentinel.conf #啓動服務
若是有下面報錯 啓動命令後面要加上 --sentinel
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 6
>>> 'sentinel monitor mymaster 192.168.198.131 6379 1'
sentinel directive while not in sentinel mode
多個哨兵配置文件同樣,正常狀況下要配置奇數哨兵,避免切換時候票數相同,出現競爭,影響線上業務。