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

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

上一篇寫了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設計與實現》,僅在此做學習與大家分享。

 

 


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

更多相關文章
  • 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改 ...
一周排行
  • 一:背景 1. 講故事 曾今在項目中發現有同事自定義結構體的時候,居然沒有重寫Equals方法,比如下麵這段代碼: static void Main(string[] args) { var list = Enumerable.Range(0, 1000).Select(m => new Point ...
  • 最近一個朋友有個關於素數的小東西要寫一下,素數是什麼呢?除了1和他本身不能被其他數整除,那麼這個數就是素數,1除外哦。我們知道概念那就很簡單了,直接代碼擼起。 ...
  • 前言 在開發編程中,我們經常會遇到功能非常相似的功能模塊,只是他們的處理的數據不一樣,所以我們會分別採用多個方法來處理不同的數據類型。但是這個時候,我們就會想一個問題,有沒有辦法實現利用同一個方法來傳遞不同種類型的參數呢? 這個時候,泛型也就因運而生,專門來解決這個問題的。 泛型是在C 2.0就推出 ...
  • 本文章主要用於介紹在Asp.Net Mvc(C#)中使用Fleck製作一個Html5的即時聊天室,含有完整代碼和演示Demo。 ...
  • 出庫單的功能。能學習了出庫單管理之後,WMS的 主體功能算是完成了。當然一個成熟的WMS還包括了盤點,報表,策略規則,移庫功能及與其他系統(ERP、TMS等)的介面,實現無縫集成,打破信息孤島,讓數據實時、準確和同步。 ...
  • Data StructureThere're two types of variables in C#, reference type and value type.Enum:enum Color{Red=0,Green=1}//equals to enum Color{Red,//start fr... ...
  • 0. 前言 該項目使用Maven進行管理和構建,所以需要預先配置好Maven。嗯,在這個系列里就不做過多的介紹了。 1. 創建項目 先創建一個pom.xml 文件,添加以下內容: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: ...
  • API 概述 API(Application Programming Interface),應用程式編程介面。 Java API是一本程式員的 字典 ,是JDK中提供給我們使用的類的說明文檔。 這些類將底層的代碼實現封裝了起來,我們不需要關心這些類是如何實現的,只需要學習這些類如何使用即可。 所以我 ...
  • 女程式員是這麼徵婚的: SELECT * FROM 男人們 WHERE 未婚=true and 同性戀=false and 有房=true and 有車=true and 條件 in (帥氣,紳士,大度,氣質,智慧,溫柔,體貼,會浪漫,活潑,可愛,最好還能帶孩子) and 年齡 between(24 ...
  • 有很多剛學習軟體測試的小伙伴,都會在網路上找尋各種學習資料,去提升自己的專業技能水平。因此,我決定定期分享我整理收集的一些軟體測試的測試工具下載、面試寶典、視頻教學合集。都整理好了,有需要的可以關註我(獲取方式在文末) 軟體測試的學習,不止是基礎理論,還需要學習測試工具的用法,如介面工具Postma ...