主從復制
redis通過一主多從的形式,將數(shù)據備份到各個從節(jié)點上,當主節(jié)點master宕機或者故障時,通過哨兵模式從slave節(jié)點中選擇一個頂替master繼續(xù)工作,避免了數(shù)據丟失,實現(xiàn)了redis的高可用,主從復制使得redis具備了較高的可擴展性和容錯性的特點

作用
1、讀寫分離,分擔redis讀的壓力:主從復制中master端主要負責寫的操作,寫入客戶端輸入的數(shù)據,同時將寫入的數(shù)據同步到slave節(jié)點上,而slave節(jié)點主要負責讀操作,master將讀的流量分流到各個從節(jié)點上執(zhí)行讀操作,利用負載均衡的原理實現(xiàn)了redis分擔讀壓力的效果
2、避免單點故障:避免單機故障后數(shù)據的丟失,通過哨兵模式從從節(jié)點中選出新的主節(jié)點
3、數(shù)據備份:將數(shù)據備份到各個從節(jié)點上,實現(xiàn)了數(shù)據備份
主從復制的策略
主從復制的方式使用的是RDB,復制的策略有以下兩種
1、全量復制:
從節(jié)點初始化時,master通過bgsave的方式進行一次全量的復制操作形成一個RDB文件同時開啟一個復制緩沖區(qū)記錄從此時開始的所有寫命令(如果從節(jié)點花費時間過長,將導致緩沖區(qū)溢出,最后全量同步失?。琺aster將RDB文件和緩沖區(qū)數(shù)據傳輸?shù)絪lave節(jié)點上,slave節(jié)點先清空節(jié)點上的數(shù)據然后再進行數(shù)據加載,在此之后redis會進行增量同步的模式,如果期間嘗試增量失敗的時候,還會再進行全量的復制
2、增量復制
master節(jié)點每執(zhí)行一個寫命令都會向slave節(jié)點發(fā)送相同的命令,slave節(jié)點接收并執(zhí)行master的寫命令
主從復制的搭建演示
由于條件有限,只能在一個節(jié)點上的演示主從復制,不多BB開干就完事了
進入redis的安裝目錄拷貝一個redis.conf并改名

先配置master節(jié)點,master節(jié)點的配置文件是redis.conf,編輯這個文件
開啟守護進程,修改pid,日志文件名稱,rdb文件名稱,工作目錄




接下來是slave節(jié)點的配置
為了方便,還是從剛剛修改過的redis.conf的基礎上修改配置,

編輯redis6380.conf文件
修改端口、日志文件名稱、rdb文件名稱,主節(jié)點地址




啟動6379 master節(jié)點,啟動后查看6379端口redis是否啟動成功

進入命令執(zhí)行客戶端,執(zhí)行info查看6379的狀態(tài),我們看到這是個主節(jié)點


然后啟動slave節(jié)點,啟動后查看6380端口redis是否啟動成功

進入命令執(zhí)行客戶端,執(zhí)行info查看6380的狀態(tài),我們看到這是個主節(jié)點

我們看到這是個slave節(jié)點,并且master節(jié)點的ip端口是本機的6379,并且連接狀態(tài)是up表示主從連接得通

到處我們的主從配置是完成了,我們去看看怎么玩這個主從復制
我們看看master和slave的數(shù)據全是空的


那我們給 master節(jié)點添加一些數(shù)據

我們看看slave節(jié)點會不會有相同的同步數(shù)據,結果是數(shù)據是同步過來了

我們在slave上添加數(shù)據會報錯,證明了redis的從節(jié)點默認只能是有讀操作

我們進入工作目錄中可以看到生成的相應的log和rdb文件

我們看看這個6380.log的日志文件內容

從這個一段日志中我們可以看到了slave節(jié)點初始的過程,先是進行full resync全量的復制,然后flushing old data清理舊數(shù)據,loading db in memory加載數(shù)據 然后完成

如果redis的master節(jié)點掛了,如果沒有一些監(jiān)控切換master的腳本的程序的話我們就得需要手動去發(fā)現(xiàn)和切換master,而redis sentinel就是為了解決這種問題而生產的。
redis sentinel:哨兵模式
sentinel是redis高可用的實現(xiàn)方案。sentinel是一個redis的獨立進程,這個進程并不是用來存儲數(shù)據,而是用來監(jiān)控redis的各個主從節(jié)點并進行故障轉移,sentinel本身也存在著單點故障的問題,所以sentinel也是有多個節(jié)點的,節(jié)點之間能相互監(jiān)控和通信,當sentinel有發(fā)現(xiàn)redis宕機了,sentinel將會對master進行下線,從slave節(jié)點中選出一個master頂替
工作步驟:
一、監(jiān)控任務:
1、10秒任務:每個sentinel會對master和slave每10秒發(fā)送info命令收集redis主從節(jié)點運行信息,以確定redis的主從關系

2、2秒任務:每個sentinel每兩秒會通過發(fā)布訂閱的方式在master內部名叫sentinel:hello的頻道發(fā)布消息,sentinel們在這個頻道發(fā)布自身的信息和自己的意見同時也獲取其他sentinel的信息和意見,這個頻道是sentinel信息交換的平臺,其中節(jié)點故障判斷、sentinel領導選舉都是在這里進行,并且每個新加入的sentinel都會去訂閱這個頻道以獲取其他sentinel的信息

3、1秒任務:每個sentinel會對其他的sentinel和每個redis節(jié)點進行ping,實際上就是一個心跳檢測,同時也是sentinel主觀下線的依據

二、主觀下線和客觀下線:
配置:
sentinel monitor mymaster 192.168.200.128 6379 2
sentinel down-after-milliseconds mymaster 3000
1、主觀下線:在每個sentinel每秒對master進行ping操作,如果在設置時間內沒有回應則被當前的sentinel認為是有問題的master,這只是某個sentinel對master的個人觀點,稱為主觀下線。例如我們使用上面的配置,設定了3000毫秒內沒有回應則認為此master故障了
2、客觀下線:當其他的sentinel也認為這個master有問題,并且超過設定的數(shù)量法定人數(shù)則會進行客觀下線。例如我們使用上面的配置,當?shù)竭_兩個sentinel都認為master有問題時,就會達成客觀下線。這里法定人數(shù)的配置最后使用:法定人數(shù)=sentinel節(jié)點數(shù)量/2+1(sentinel節(jié)點的數(shù)量最好配置成奇數(shù))
三、領導者選舉:
當sentinel們達成了客觀下線后就會進行投票,選舉出一個領導者對master進行故障轉移。當某個sentinel拿到了超過了半數(shù)的投票,將會成為領導者,如果有兩個sentinel拿到了同樣的票數(shù)都成為了領導者,將會進行重選

四、故障轉移:
在選舉出領導者的sentinel節(jié)點后,這個sentinel將會從slave中選擇一個合適的master節(jié)點,怎么才叫做合適呢主要有以下幾點:
1、 選擇slave-priority最高的slave節(jié)點(默認是相同)
2、選擇復制偏移量最大的節(jié)點。
3、如果以上兩個條件都不滿足,選runId最小的(啟動最早的)。
選出master節(jié)點后,sentinel會向剩余的slave節(jié)點發(fā)送命令讓slave節(jié)點去復制這個新master,然后在通知客戶端,master節(jié)點的改變,讓客戶端去連接新的master節(jié)點

sentinel搭建演示
(由于條件有限,搭建的sentinel和redis主從節(jié)點都是在同一臺機器上)
我們看看這個配置的解釋,這是我從網上找來的解釋的挺好的
port 26379 #端口
daemonize yes #守護進程
#pid
pidfile /var/run/redis-sentinel26379.pid
#工作目錄
dir /usr/local/redis-5.0.0/data
#日志文件
logfile "26379.log"
#sentinel主節(jié)點的名稱
#mymaster 主節(jié)點 127.0.0.1 6379,2個sentinel檢測到主節(jié)點有問題就進行故障轉移
sentinel monitor mymaster 127.0.0.1 6379 2
#30秒ping不同就認為主節(jié)點有問題
sentinel down-after-milliseconds mymaster 30000
#老的slave或者新的master進行復制,最多可以有多少個slave同時對新的master進行 同步,推薦1
sentinel parallel-syncs mymaster 1
#故障轉移時間
sentinel failover-timeout mymaster 180000
搭建基于我們已經搭建好的redis主從復制,master節(jié)點的端口是6379,slave的節(jié)點是6380和6381,創(chuàng)建兩個文件夾 sentinel-data和sentinel-conf

進redis的解壓目錄拷貝一個sentinel.conf 到redis的安裝目錄的sentinel-conf目錄中

進入sentinel-conf目錄中,拷貝并并改名sentinel.conf 分別為sentinel26379.conf sentinel26380.conf sentinel26381.conf

修改編輯各個sentinel的配置文件,以sentinel26379.conf為例,根據你的ip和端口把上面的配置配進去:




其他的sentinel的配置就按照這樣修改一下端口號和日志名稱即可
然后分別啟動sentinel,并查看sentinel是否啟動成功

這樣我們的sentinel算是安裝成功,我們進入命令客戶端看看sentinel的信息
sentinel 26379的發(fā)現(xiàn)了master的節(jié)點地址和數(shù)量,slave的數(shù)量和sentinel的數(shù)量

就此我們的redis高可用搭建就算完成了