建議前面文章沒看過的同窗先看下前面的文章:html
「老司機帶你玩轉面試(1):緩存中間件 Redis 基礎知識以及數據持久化」面試
「老司機帶你玩轉面試(2):Redis 過時策略以及緩存雪崩、擊穿、穿透」redis
在生產環境使用 Redis ,徹底禁止使用單機模式,單機模式風險過高,一臺機器出於某些緣由掛掉,就會致使整個緩存服務死掉,因此,咱們須要使用多臺機器來保證 Redis 的高可用,同時也順便提高了併發性。緩存
對於 Redis 緩存而言,更常見的應用場景是支持讀高併發,而寫高併發的場景相對比較少(不能說沒有,只能說相對讀高併發比較少)。服務器
所以,使用主從模式,一主多從,主負責寫,而且將數據複製到其它的 slave 節點,從節點負責讀。全部的讀請求所有走從節點。這樣也能夠很輕鬆實現水平擴容,支撐讀高併發。架構
經典的主從模式架構圖以下:併發
master 和 slave 剛剛鏈接的時候,進行全量同步。全量同步結束後,進行增量同步。less
固然,若是有須要,slave 在任什麼時候候均可以發起全量同步。redis 策略是,不管如何,首先會嘗試進行增量同步,如不成功,要求從機進行全量同步。異步
master 執行 BGSAVE 命令,生成一個 RDB 文件, 發送給 slave , slave 加載 RDB 文件達到與 master 維持一致。高併發
Redis 增量複製是指 slave 初始化後開始正常工做時 master 發生的寫操做同步到 slave 的過程。
增量複製的過程主要是 master 每執行一個寫命令就會向 slave 發送相同的寫命令,從服務器接收並執行收到的寫命令。
主從節點互相都會發送心跳信息。
master 默認每隔 10 秒發送一次心跳信息,slave 每隔 1 秒發送一個心跳信息。
master 節點能夠在內存中直接建立 RDB 文件,而後將 RDB 文件直接發送給 salve 節點,不在本身本地落地到磁盤,這個操做只須要在配置文件中開啓 repl-diskless-sync yes
。
可是這樣作的風險會比較高,所以,強烈建議在 master 上開啓持久化服務。
若是必定要在 master 節點上設置不開啓持久化,請在確保 Redis 實例不會自動重啓。
爲啥要確保實例不會自動重啓?
下面給你們分享一個案例,這是生產環境真實發生過的事情,都是血的教訓。
一個主從結構的 Redis 集羣,當 master 沒有配置開啓數據持久化,某個時間,忽然 master 節點宕機,而後自動重啓,當 master 節點自動重啓後,因爲沒有開啓數據持久化,這時的 master 節點中是無數據的,當 salve 節點進行數據同步的時候,會把 salve 節點的數據也作清空操做。這時,整個主從結構的 Redis 集羣全都沒有數據,大量的請求過來發現 Redis 沒有數據,致使請求落到了 DB 上,結果是毀滅性的。
主從模式存在的問題是,它僅僅只作到了讀高可用,若是一旦 master 節點掛掉了,就沒辦法寫數據了,只剩下 slave 節點還能讀數據,可是數據同步也沒有了,只能靠人工干預進行恢復,這並非咱們想要的高可用。
咱們還須要寫高可用,這就引出了 Redis 的高可用架構:哨兵模式。
簡單來說,哨兵模式就是在 master 節點不可用後,能夠自發的進行主備切換,或者叫作故障轉移。
master 節點在發生故障後,整個集羣能夠自動檢測,將某個 salve 自動切換成 master 節點,這種模式纔算是實現了 Redis 真正意義上的高可用。