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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...