Redis主從原理及哨兵模式


1.Redis主從搭建

主從的搭建很簡單,主節點設置連接密碼,從節點的配置上主節點的ip和端口,以及密碼,一般從節點我們都設置只讀模式。

主節點配置:

  主節點密碼:

  requirepass xxx

從節點中配置:

  #主節點

  replicaof 192.168.0.67 6379

  #從節點只讀

  replica-read-only yes

  #主節點連接密碼

  masterauth root

使用對應的配置文件啟動master和slave服務即可。

如果不使用密碼來連接可能出現,從節點能識別主節點,但是卻無法連接到主上面去,如下主從信息如下情況:

 

 

 

 

 

這樣的Redis主從只是一個數據的備份關系,如果master掛了,需要手動去講salve切換成master並且將客戶端連接切換到新的master上面去。

 

同時還可以搭建多級結構,也就是說slave-A也可以成為別的slave-B的master。

 

使用主從結構一來是備份數據,二來也可以實現讀寫分離作用,master寫數據,salve讀數據

 

 

2.主從復制原理

 

全量復制:

如果為master配置了一個slave,不管這個slave是否是第一次連接上Master,它都會發送一個SYNC命 令給master請求復制數據。 master收到SYNC命令后,會在后台進行數據持久化通過bgsave生成最新的rdb快照文件,持久化期間, master會繼續接收客戶端的請求,它會把這些可能修改數據集的請求緩存在內存中。當持久化進行完畢以 后,master會把這份rdb文件數據集發送給slave,slave會把接收到的數據進行持久化生成rdb,然后再加載到內存中。然后,master再將之前緩存在內存中的命令發送給slave。 當master與slave之間的連接由於某些原因而斷開時,slave能夠自動重連Master,如果master收到了多 個slave並發連接請求,它只會進行一次持久化,而不是一個連接一次,然后再把這一份持久化的數據發送給多個並發連接的slave。 當master和slave斷開重連后,一般都會對整份數據進行復制。

 

 

 

增量復制:

2.8版本開始,slave與master能夠在網絡連接斷開重連后只進行部分數據復制。 master會在其內存中創建一個復制數據用的緩存隊列buffer,緩存最近一段時間的數據,默認大小1m,如果超過這個大小就會清理掉,但是這些數據是在AOF或者RDB快照中的,master和它所有的 slave都維護了復制的數據下標offset和master的進程id,因此,當網絡連接斷開后,slave會請求master 繼續進行未完成的復制,從所記錄的數據下標開始。如果master進程id變化了,或者從節點數據下標 offset太舊,已經不在master的緩存隊列里了,那么將會進行一次全量數據的復制。從2.8版本開始,redis改用可以支持部分數據復制的命令PSYNC去master同步數據

 

3.哨兵模式(sentinel

 

前面說到主從模式其實是一種數據的備份方式,如果master宕機了,需要手動切換,並且還要切換客戶端的連接數據源。這就無法達到高可用。哨兵模式就可以解決這一問題。

 

哨兵是特殊的redis服務,不提供讀寫服務,主要用來監控redis實例節點。 哨兵架構下client端第一次從哨兵找出redis的主節點,后續就直接訪問redis的主節點,不會每次都通過 sentinel代理訪問redis的主節點,當redis的主節點發生變化,哨兵會第一時間感知到,並且哨兵會早主從模式的從節點中重新選出來一個新的master,並且將新的master信息通知給client端。這里面redisclient端一般都實現了訂閱功能,訂閱sentinel發布的節點變動消息。Redis服務是通過配置文件啟動的,比如上面的從節點設置了只讀模式,它被選舉成了master之后就是可讀寫的了,感覺很奇怪,后來看了下重新選舉之后的各redis服務的配置文件,發現文件里面的內容會被哨兵修改。要想真的高可用,我們的哨兵也要集群模式。

 

 

 

4.哨兵模式搭建

 

修改哨兵的配置文件sentinel.conf,配置監聽主從的master節點

 

  sentinel monitor <master‐name> <ip> <redis‐port> <quorum>

 

  master‐name:集群名字,隨意,客戶端連接需要用到

 

  quorum:指明哨兵集群中多少個sentinel認為master失效才真的失效,一般配節點數/2+1,也就是說大於半數,比如我三個哨兵節點組成的哨兵集群,那么我就配置2,如下:

 

  sentinel monitor mymaster 192.168.0.67 6379 2

 

因為上面我的主從master是設置了密碼的,所以還需要配置:

 

  sentinel auth-pass mymaster xxx

 

由於master掛了之后,會進行哨兵會進行重新的選舉,如果slave也配置了連接密碼,那么最好在其他的節點都配置上

 

  masterauth xxx,保證掛了的服務重啟之后能正常加入主從中去。

 

使用指定的哨兵配置文件啟動哨兵

 

  src/redis‐sentinel sentinel.conf

 

連接哨兵:src/redis-cli -p 26379

 

查看信息:info

 

 

 

 再使用同樣的配置文件,啟動另外兩個哨兵,在查看信息之后會發現哨兵數量變成3

 

 

 可以試試把master節點干掉之后,過一會哨兵重新選舉新的master之后,再將原來的master節點啟動,它會作為一個slave加入到主從結構中去,如果去查看redis服務的配置文件,會發現配置文件里面的一些內容是被修改了的

java客戶端連接哨兵模式,只需要配置哨兵節點即可。

#哨兵模式
spring.redis.sentinel.master=mymaster  #哨兵配置中集群名字
spring.redis.sentinel.nodes=哨兵ip1:哨兵端口1,哨兵ip2:哨兵端口2,哨兵ip3:哨兵端口3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM