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端。這里面redis的client端一般都實現了訂閱功能,訂閱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