1.前言
Redis單節點存在單點故障,爲解決單點問題,須要對Redis節點配置從節點。使用哨兵來監聽主節點存活狀態,若主節點掛掉,從節點能繼續提供緩存功能。從節點怎樣和主節點間完成數據傳遞?就是Redis的主從複製。
2. 主從配置及做用
臨時配置:
redis-cli進入redis從節點後,使用 --slaveof [masterIP] [masterPort]
永久配置:
進入從節點的配置文件redis.conf,增長slaveof [masterIP] [masterPort]
做用:
1)主從配置結合哨兵模式能解決單點故障問題,提升redis可用性
2)從節點僅提升讀的操做,主節點提供寫操做。對於讀多寫少的情況,可給主節點配置多個從節點,從而提供響應效率
補充:
主從複製並非redis的橫向拓展,集羣模式纔是
3. 複製過程
1)從節點執行slaveof [masterIP] [masterPort],保存主節點信息
2)從節點中的定時任務發現主節點信息,創建和主節點的socket鏈接
3)從節點發送Ping信號,主節點返回Pong,兩邊能互相通訊
4)鏈接創建後,主節點將全部數據發送給從節點(數據同步)
5)主節點把當前的數據同步給從節點後,便完成了複製的創建流程。接下來,主節點就會持續的把寫命令發送給從節點,保證主從數據一致性
4. 數據同步
redis 2.8 以前使用sync [runId] [offset]同步命令,redis2.8以後使用psync [runId] [offset]命令。二者不一樣在於,sync命令僅支持全量複製過程,psync支持全量和部分複製;介紹同步以前先介紹幾個概念:
runId:每一個redis節點啓動都會生成惟一的runId,每次redis重啓後,runId也會發生變化
offset:主節點和從節點都各自維護本身的主從複製偏移量offset,當主節點有寫入命令時,offset=offset+命令的字節長度。從節點在收到主節點發送的命令後,也會增長本身的offset,並把本身的offset發送給主節點。這樣,主節點同時保存本身的offset,從節點的offset,經過對比offset來判斷主從節點數據是否一致
repl_backlog_size:保存在主節點上的一個固定長度的先進先出隊列,默認大小爲1MB
1)主節點發送數據給從節點過程當中,主節點還會進行一些寫操做,這時候的數據存儲在複製緩衝區。從節點同步主節點數據完成後,主節點將緩衝區的數據繼續發送給從節點,用於部分複製;
2)主節點(master)響應寫命令時,不但會把命名發送給從節點,還會寫入複製積壓緩衝區,用於複製命令丟失的數據補救;
psync執行流程
從節點發送psync [runId] [offset]命令,主節點有以下響應
全量複製流程
1)從節點發送psync ? -1命令,由於第一次發送,不知道主節點的runId,因此爲?,由於是第一次複製,因此offset = -1。
2)主節點發現從節點是第一次複製,變返回FULLRESYNC {runId} {offset},runId是主節點的runId,offset是主節點目前的offset。
4)主節點在發送FULLRESYNC後,啓動bgsave命令,生成RDB文件(數據持久化)。
5)6)主節點發送RDB文件給從節點。到從節點加載數據完成這段期間主節點的寫命令放入緩衝區。
8)從節點加載RDB文件,將數據保存的本身的數據庫中。
9)若是從節點開啓了AOF(另外一種持久化方案),從節點會異步重寫aof文件。
部分複製流程
1)部分複製主要是Redis針對全量複製的太高開銷作出的一種優化措施,使用psync {runId}{offset}命令實現。當從節點(slave)正在複製主節點(master)時,若是出現網絡閃斷或者命令丟失等異常狀況時,從節點會向主節點要求補發丟失的命令數據,若是主節點的複製積壓緩衝區內存將這部分數據則直接發送給從節點,這樣就能夠保持主從節點複製的一致性。補發的這部分數據通常遠遠小於全量數據。
2)主從鏈接中斷期間主節點依然響應命令,但因複製鏈接中斷命令沒法發送給從節點,不過主節點內部存在的複製積壓緩衝區,依然能夠保存最近一段時間的寫命令數據,默認最大緩存1MB。當從節點網絡恢復後,從節點會再次連上主節點。
3)當主從鏈接恢復後,因爲從節點以前保存了自身已複製的偏移量和主節點的運行ID。所以會把它們當作psync參數發送個主節點,要求進行部分複製操做。
4)主節點接到psync命令後首先覈對參數runId是否與自身一致,若是一致,說明以前複製的是當前主節點;以後根據參數offset在自身複製積壓緩衝區查找,若是偏移量以後的數據存在緩衝區中,則對從節點發送+COUTINUE響應,表示能夠進行部分複製。由於緩衝區大小固定,若發生緩存溢出,則要進行全量複製。
5)主節點根據偏移量把複製積壓緩衝區裏的數據發送給從節點,保證主從複製進入正常狀態。
5. 補充
Redis故障處理
若主節點掛掉後,再次重啓,runid的值會變。此時從節點的發送psync命令,會提示找不到原runid,則會再進行一次全量複製。爲避免這種情況,使用Redis故障轉移機制,主節點掛掉後,從節點升級爲主節點。如哨兵模式。
最後
歡迎你們關注個人公衆號【程序員追風】,文章都會在裏面更新,整理的資料也會放在裏面。