Redis學習筆記(十三) 複製(下)

来源:https://www.cnblogs.com/xtt321/archive/2020/05/22/12934441.html
-Advertisement-
Play Games

上一篇寫了Redis複製功能的簡單應用,下麵我們看下Redis複製功能的實現過程。下麵基本上是理論部分,枯燥乏味,但希望大家能看看,畢竟知識不都是感興趣的.耐得住寂寞,經得起誘惑,方能守得住繁華 ~.~舊版複製功能的實現 Redis的複製功能分為同步和命令傳播兩個操作: 1、同步操作用於將從伺服器的 ...


上一篇寫了Redis複製功能的簡單應用,下麵我們看下Redis複製功能的實現過程。下麵基本上是理論部分,枯燥乏味,但希望大家能看看,畢竟知識不都是感興趣的.
耐得住寂寞,經得起誘惑,方能守得住繁華 ~.~
舊版複製功能的實現

Redis的複製功能分為同步和命令傳播兩個操作:

1、同步操作用於將從伺服器的資料庫狀態更新至主伺服器當前所處的資料庫狀態。

2、命令傳播操作則用於在主伺服器 的資料庫狀態被修改,導致從伺服器的資料庫狀態出現不一致時,讓主伺服器的資料庫重新回到一致狀態。

從伺服器對主伺服器的同步操作需要通過向主服務發送sync命令來完成,以下是sync命令的執行步驟:

(1)從伺服器向主伺服器發送SYNC命令

(2)收到SYNC命令的主伺服器執行BGSAVE命令,在後臺生成一個RDB文件,並使用一個緩衝區記錄現在開始執行的所有寫命令。

(3)當主伺服器的BGSAVE命令執行完畢時,主伺服器會BGSAVE命令生成的RDB文件發送給從伺服器,從伺服器接收並載入這個RDB文件,將自己的資料庫狀態更新至主伺服器執行BGSAVE命令時的資料庫狀態。

(4)主伺服器將記錄在緩衝區的所有寫命令發送給從伺服器,從伺服器執行這些寫命令,將自己的資料庫狀態更新至主伺服器資料庫當前所處的狀態。

命令傳播:當主伺服器執行客戶端寫命令時,主伺服器的資料庫就有可能被修改,並導致主從不一致。此時主伺服器會將自己執行的寫命令發送給從伺服器執行,當從伺服器執行了相同的寫命令後,主從伺服器再次回到一致狀態。

缺陷

1、初始複製從伺服器從來沒有複製過任何主伺服器或者從伺服器當前要複製的主伺服器和上次複製的主伺服器不同。

2、斷線後重覆制:處於命令傳播階段的主從伺服器因為網路原因而中斷了複製,但從伺服器通過自動連接從新連上主伺服器,並繼續複製。


新版複製功能的實現(PSYNC代替SYNC)

PSYNC命令具有完整重同步和部分重同步兩種模式:

(1)完整重同步用於處理初次複製功能,與SYNC功能基本一致;

(2)部分重同步用於處理斷線後重覆值的情況,解決舊版效率低的問題。

 

部分重同步的實現:

(1)主伺服器與從伺服器都會維護一個複製偏移量

(2)複製積壓緩衝區是由主伺服器維護的一個固定長度先進先出的隊列預設(1MB),發生斷線從連時,但從伺服器重連上主伺服器,從伺服器會通過PSYNC命令將自己的複製偏移量offset發送給主伺服器,主伺服器根據這個複製偏移量來決定對從伺服器執行何種同步操作:如果offset偏移量之後的數據仍然存在於複製積壓緩衝區裡面,那麼主伺服器將對從伺服器執行部分重同步,反之,執行完整重同步操作。除了複製偏移量和複製積壓緩衝之外,實現部分重同步還需要用到伺服器運行ID:每個Redis伺服器都有自己啟動時生成的由40個隨機16進位字元組成的運行ID。當伺服器對主伺服器進行初次複製時,主伺服器會將自己的運行ID傳送給從伺服器,而從伺服器則會將這個運行ID保存起來。當伺服器斷線重連時,從伺服器向主伺服器發送保存的運行ID,如果ID一樣,則主伺服器嘗試部分重同步操作,如果不同,則執行完整重同步操作。

PSYNC命令的實現

PSYNC命令的實現方法有兩種:

1)如果從伺服器以前沒有複製過任何主伺服器,或者之前執行過SLAVEOF no one命令,那麼從伺服器在開始新的複製時將向主伺服器發送PSYNC? -1 命令,主動請求進行完整重同步。

(2)如果之前複製過某個主伺服器,那麼從服務在開始一次新的複製時向主伺服器發送PSYNC <runid> <offset>。由主伺服器來判斷該用那種方式同步。

(3)如果主伺服器返回+FULLRESYNC回覆,則表示主伺服器將與從伺服器執行完整重同步。

(4)如果主伺服器返回+CONTINUE回覆,則表示部分重同步,從伺服器只需等待接收數據即可。

(5)主伺服器返回-ERR回覆,則表示主伺服器版本低於2.8不識別PSYNC命令從伺服器將向主伺服器發送SYNC命令完成同步操作。

複製的實現

1、執行SLAVEOF ip port命令,此時從伺服器首先將ip與埠保存到伺服器狀態的masterhost屬性與masterport屬性裡面,並向客戶端返回“OK”,表示命令已經被接收。

2、建立套接字連接

從伺服器根據ip與埠創建連向主伺服器的套接字,如果套接字連接到主伺服器,那麼從伺服器將為這個套接字關聯一個 專門用於處理複製工作的文件事件處理器,這個事件處理器負責執行後續複製工作。主伺服器在接受從伺服器的套接字連接後,將為該套接字創建相應的客戶端狀態,並將從伺服器看作一個連接到主伺服器的客戶端對待,

3、發送PING命令

作用:

(1)雖然與主伺服器建立套接字連接,但雙方並未使用該套接字進行任何通信,檢查套接字讀寫是否正常。

(2)檢查主伺服器是否能夠正常處理命令請求。

發送命令後可能遇到的三種情況:

(1)超時,在規定的時間限制內從伺服器未收到回覆內容,此時從伺服器斷線重連。

(2)如果主伺服器向從伺服器回覆一個錯誤,表示主伺服器暫時無法處理從伺服器的命令請求,從伺服器斷線重連。

(3)收到正常回覆內容,則可以進行下一步操作。

4、身份驗證(如果從伺服器設置了masterauth選項)

從伺服器向主伺服器發送一條AUTH命令,此時從伺服器可能遇到的情況有:

(1)主伺服器沒有設置requirepass選項,並且從伺服器沒有設置master選項,那麼從伺服器將繼續執行從服務發送的命令,複製操作繼續。

(2)如果從伺服器通過AUTH命令發送的密碼與主伺服器requirepass設置的密碼相同,那麼主伺服器將繼續執行從伺服器發送的命令,如果不同則主伺服器返回一個invalid password錯誤。

(3)如果主伺服器設置了requirepass選項,但從伺服器沒有設置masterauth選項,那麼主伺服器將返回一個NOAUTH選項。另一方面如果主伺服器沒有設置requirepass選項,但伺服器設置了masterauth選項,那麼主伺服器將返回一個no password is set 錯誤。

5、發送埠信息,從伺服器將執行REPLCONF listening-port port命令,向主伺服器發送從伺服器的監聽埠號,主伺服器將埠號保存在對應的客戶端狀態slave_listening_port屬性中。

6、同步

 

7、命令傳播

主伺服器將自己執行的寫命令發送給從伺服器,從伺服器只要一直執行主伺服器發來的命令即可。

 

心跳檢測

在命令傳播階段,從伺服器預設以每秒一次的頻率向主伺服器發送命令:

REPLCONF ACK <replication_offset>

作用:檢測主伺服器的網路連接狀態;輔助實現min-slaves選項;檢測命令丟失。

Redis的min-slaves-to-write和min-slaves-max-lag兩個選項防止主伺服器在不安全的情況下執行寫命令。

當從伺服器小於min-slaves-to-write或者min-slaves-to-write個數量的伺服器延遲lag值都大於等於min-slaves-max-lag時,主伺服器將拒絕執行寫命令。

如果因為網路故障,主伺服器傳播給從伺服器的寫命令半路丟失,那麼當從伺服器向主伺服器發送REPLCONF ACK命令時,主伺服器將發覺從伺服器當前的複製偏移量少於自己的偏移量,主伺服器就會根據從伺服器提交的複製偏移量,在複製積壓緩衝區裡面找到從伺服器缺少的數據,並將這些數據重新發送給從伺服器。

 


 

 

每天學一點,總會有收穫。

 

下一步我們看下Redis的Sentinel(哨兵)

 

說明:尊重作者知識產權,文中內容參考《Redis設計與實現》,僅在此做學習與大家分享。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0. 前言 在上一篇基本講完了EF Core的入門級教程。從這一篇開始,我們試著去探索一下 .net core平臺上更多的ORM框架。那麼,這一篇開始我們就來試試NHibernate。 1. NHibernate 介紹 NHibernate是Hibernate的C 版,眾所周知Hibernate是J ...
  • [toc] ifconfig命令 功能說明:顯示或設置網路設備 用法 ifconfig [interface] [up|down] ifconfig interface options | address ... 選項 | 選項 | 說明 | | | | | a | 顯示所有介面的狀態,包括未激活的 ...
  • 1. -O (name) :指定文件名下載 wget -O test.png http://httpbin.org/image/png 2.--limite-rate :指定速度下載目標文件 wget --limite-rate=1k http://httpbin.org/image/png 3. ...
  • Nginx 處理一個 HTTP 請求的全過程 前面給大家講了 "Nginx 是如何處理 HTTP請求頭部的" ,接下來就到了真正處理 HTTP 請求的階段了。先看下麵這張圖,這張圖是 Nginx 處理 HTTP 請求的示意圖,雖然簡單,但是卻很好的說明瞭整個過程。 1. Read Request H ...
  • 這世界有10種人,一種人懂二進位,另一種人不懂二進位。 ——魯迅 大家好,我是良許。 二進位文件是我們幾乎每天都需要打交道的文件類型,但很少人知道他們的工作原理。這裡所講的二進位文件,是指一些可執行文件,包括你天天要使用的 Linux 命令,也是二進位文件的一種。 Linux 系統給我們提供了非常多 ...
  • 我們知道Windows系統有回收站的功能,正確設置後,當用戶刪除文件或文件夾時,操作系統會將這些“刪除”的文件或文件夾放到回收站中,而並沒有真正意義上的刪除文件。其實Linux系統中也可以模擬這樣的功能。下麵介紹一下GitHub上的一個非常有意思的項目,裡面有個腳本Saferm.sh可以模擬這種功能... ...
  • 常用命令 文件操作 命令 | 說明 | 例子 | | cd | 打開目錄 | cd program pwd | 列出當前路徑名稱 | ls | 列出當前目錄 | ls la 顯示目錄詳細內容 mkdir | 創建目錄 | mkdir dir_name touch file.format | 創建指定 ...
  • 1、首先查看VMware虛擬機網路配置 2、ip addr 查看虛擬機ip地址 3、輸入dhclient獲取動態ip地址,將ip地址記錄下拉 4、進入vi /etc/sysconfig/network-scripts/ifcfg-ens33 5、將bootproto改為static,將onboot改 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...