您好,登錄后才能下訂單哦!
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]命令,主節點有如下響應
FULLRESYNC:第一次連接,進行全量復制
CONTINUE:進行部分復制
ERR:不支持psync命令,進行全量復制
全量復制流程
1)從節點發送psync ? -1命令,因為第一次發送,不知道主節點的runId,所以為?,因為是第一次復制,所以offset = -1。
2)主節點發現從節點是第一次復制,變返回FULLRESYNC {runId} {offset},runId是主節點的runId,offset是主節點目前的offset。
3)從節點接收主節點信息后,保存到info中。
4)主節點在發送FULLRESYNC后,啟動bgsave命令,生成RDB文件(數據持久化)。
5)6)主節點發送RDB文件給從節點。到從節點加載數據完成這段期間主節點的寫命令放入緩沖區。
7)從節點清理自己的數據庫數據。
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故障轉移機制,主節點掛掉后,從節點升級為主節點。如哨兵模式。
最后
歡迎大家一起交流,喜歡文章記得點個贊喲,感謝支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。