一诉稍、Redis集群簡介
目前redis的集群有3種搭建方式:
1)keepalived:通過 keepalived 的虛擬 IP杂数,提供主從的統(tǒng)一訪問锌介,在主出現(xiàn)問題時, 通過 keepalived 運行腳本將從提升為主管嬉,待主恢復后先同步后自動變?yōu)橹髦此恚摲桨傅暮锰幨侵鲝那袚Q后肆糕,應(yīng)用程序不需要知道(因為訪問的虛擬 IP 不變)态鳖,壞處是引入 keepalived 增加部署復雜性,在有些情況下會導致數(shù)據(jù)丟失
2)redis-trib:ruby提供的串聯(lián)插件
3)Sentinel:官方提供的方式震贵,在2.4版本以后才出來的方式利赋,在2.4版本前都會選擇前面兩種方式。
我們將采用第三種方式進行集群搭建猩系。
二媚送、Redis集群原理
1):Master的狀態(tài)檢測?
2):如果Master異常,則會進行Master-Slave切換寇甸,將其中一個Slave作為Master塘偎,將 之前的Master作為Slave
3):Master-Slave切換后,master_redis.conf拿霉、slave_redis.conf和sentinel.conf的內(nèi)容都 會發(fā)生改變吟秩,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監(jiān)控目標 會隨之調(diào)換
三绽淘、Redis集群工作方式
1):每個Sentinel以每秒鐘一次的頻率向它所知的Master涵防,Slave以及其他 Sentinel 實 例發(fā)送一個PING命令
2):如果一個實例(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線沪铭。
3):如果一個Master被標記為主觀下線壮池,則正在監(jiān)視這個Master的所有 Sentinel 要以 每秒一次的頻率確認Master的確進入了主觀下線狀態(tài)。
?4):當有足夠數(shù)量的 Sentinel(大于等于配置文件指定的值)在指定的時間范圍內(nèi)確認 Master的確進入了主觀下線狀態(tài)杀怠, 則Master會被標記為客觀下線
?5):在一般情況下椰憋, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Slave發(fā) 送INFO命令
6):當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發(fā)送INFO命令的頻率會從 10 秒一次改為每秒一次
?7):若沒有足夠數(shù)量的 Sentinel 同意 Master 已經(jīng)下線赔退, Master 的客觀下線狀態(tài)就會 被移除橙依。 若Master重新向 Sentinel 的 PING 命令返回有效回復证舟, Master 的主觀下線狀態(tài)就 會被移除。
四窗骑、Sentinel環(huán)境搭建
環(huán)境準備:
我們目前需要3個全新的redis女责,我這里有3個虛擬機分別為192.168.159.128、192.168.159.129慧域、192.168.159.130鲤竹。
保證3個redis分別都能正常使用。
修改192.168.159.129和192.168.159.130 中redis.conf文件信息昔榴,增加
masterauth "123456"
slaveof 192.168.159.128 6379
修改192.168.159.128中redis.conf文件信息,增加
masterauth "123456"
此時分別啟動三個系統(tǒng)中的redis
cd /usr/local
./src/redis-server /usr/local/redis-3.2.1/redis.conf &
數(shù)據(jù)正常同步碘橘,此時是一個標準的主從關(guān)系
修改三個系統(tǒng)中的sentinel.conf
port 26379
daemonize yes
sentinel monitor mymaster 192.168.159.128 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
sentinel auth-pass mymaster 123456
protected-mode no
logfile "/usr/local/redis-3.2.1/sentinel.log"
#上面配置文件說明如下:
#第一行指定sentinel端口號
#第二行指定sentinel為后臺啟動
#第三行指定Sentinel去監(jiān)視一個名為 mymaster 的Master互订,Master的IP地址為192.168.159.128,端口號為6379痘拆,最后的2表示當有2個Sentinel檢測到Master異常時才會判定其失效仰禽,即只有當2個Sentinel都判定Master失效了才會自動遷移,如果Sentinel的數(shù)量不達標纺蛆,則不會執(zhí)行自動故障遷移吐葵。
#第四行指定Sentinel判定Master斷線的時間。(單位為毫秒桥氏,判定為主觀下線SDOWN)
#第五行指定在執(zhí)行故障轉(zhuǎn)移時温峭,最多可以有多少個Slave同時對新的Master進行同步。這個數(shù)字設(shè)置為1字支,雖然完成故障轉(zhuǎn)移所需的時間會變長凤藏,但是可以保證每有1個Slave處于不能處理命令請求的狀態(tài)
分別啟動三個系統(tǒng)中的哨兵
cd /usr/local
./src/redis-sentinel /usr/local/redis-3.2.1/sentinel.conf &
查看哨兵日志文件,發(fā)現(xiàn)主節(jié)點為192.168.159.128
停止主節(jié)點
查看日志發(fā)現(xiàn)主節(jié)點變?yōu)?92.168.159.130
插入數(shù)據(jù)
查看數(shù)據(jù)堕伪,發(fā)下數(shù)據(jù)在192.168.159.130和192.168.159.129中正常同步
此時再啟動192.168.159.128
查看192.168.159.128中的數(shù)據(jù)揖庄,發(fā)現(xiàn)及時同步了