Redis的主從複製

来源:https://www.cnblogs.com/jian0110/archive/2019/07/04/10442367.html
-Advertisement-
Play Games

前言 關係資料庫通常會使用一個主伺服器向多個從伺服器發送更新,並使用從伺服器來處理所有的讀請求,Redis採用了同樣方法來實現自己的複製特性。 簡單總結起來就是:在接收到主伺服器發送的數據初始副本之後,客戶端每次主伺服器進行寫命令時,從伺服器都會實時地得到更新。部署好主從伺服器之後,客戶端可以向任意 ...


前言

  關係資料庫通常會使用一個主伺服器向多個從伺服器發送更新,並使用從伺服器來處理所有的讀請求,Redis採用了同樣方法來實現自己的複製特性。

  簡單總結起來就是:在接收到主伺服器發送的數據初始副本之後,客戶端每次主伺服器進行寫命令時,從伺服器都會實時地得到更新。部署好主從伺服器之後,客戶端可以向任意的從伺服器發送讀請求。

  本文主要介紹Redis實現數據同步複製簡單過程、新舊版本之間的對比、以及一些需要註意的細節,主要參考資料《Redis實戰》與《Redis設計與實現》(有需要的同學可以私信或者評論)

 

一、舊版複製功能

  Redis 2.8以前採用的複製都為舊版複製,主要使用SYNC命令同步複製,SYNC存在很大的缺陷嚴重消耗主伺服器的資源以及大量的網路連接資源。Redis 2.8之後採用PSYNC命令替代SYNC,解決完善這些缺陷,但在介紹新版複製功能之前,必須先介紹舊版複製過程,這樣才能更好地形成對比。

  1、複製功能的兩種模式

    同時複製過程分為同步sync與命令傳播(command propagate),兩個過程配合執行才能實現Redis複製。

    1)同步操作:

    通過從伺服器發送到SYNC命令給主伺服器-------->主伺服器生成RDB文件併發送給從伺服器,同時發送保存所有寫命令給從伺服器------>從伺服器清空之前數據並執行解釋RDB文件------->保持數據一致(還需要命令傳播過程才能保持一致)

                  

         2)命令傳播操作

    主伺服器的資料庫狀態被修改(主伺服器執行寫命令,修改資料庫),導致主從伺服器資料庫不一致時,通過發送讓主從伺服器不一致的命令(主伺服器接收到的新寫命令)給從伺服器並執行,讓主從伺服器的資料庫重新回到一致狀態。

    比如初次同步完成後,主從伺服器資料庫中都已經存在k1-k5的鍵,處於數據一致的狀態

            

    之後,主伺服器客戶端發送DEL刪除命令,刪除k3鍵,導致主從伺服器數據不一致

 

        

    為了讓主從伺服器數據再次回到一致狀態,主伺服器向從伺服器發送DEL命令,緊接著從伺服器接收並執行。即可回到一致狀態

            

 

      

  2、配置選項前提

 

    1)主從複製的前提不用多說,就是先正確配置redis主從伺服器,主要通過slaveof ip port選項配置或者SLAVEOF 命令。

    2)保證主伺服器的RDB+AOF配置正確,特別是RDB中dbfilename選項與AOF中的dir選項,兩個文件路徑對於Redis是可寫的

 

  3、主從複製過程

              

    文字簡單總結描述:

      1)slave會建立和master的連接,然後發送sync命令;

    2)master都會啟動一個後臺進程執行BGSAVE命令,將數據快快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存起來;

    3)後臺進程完成寫文件後,master發送文件給slave,slave將文件保存到磁碟上,然後載入到記憶體恢複數據庫快照到slave上。

    4)緊接著master就會把緩存命令轉發給slave,後續的master收到的寫命令也通過跟slave連接發送給slave;

              5)如果master同時接收到多個slave發來的同步連接請求,只會啟動一個進程來寫資料庫鏡像,然後發送給所有slave。

    也可以參考以下表,其中步驟1-4可以認為是sync同步操作,而步驟5即為命令傳播模式  

    

        

  註意事項

    1)從伺服器在同步時,會清空所有數據,伺服器在與主伺服器進行初連接時,資料庫中的所有數據都將丟失,替換成主伺服器發送的數據。

    2)Redis不支持主主複製

    3)主從複製不會阻塞master(不會阻塞master處理客戶端請求),相反slave在初次同步數據時會阻塞不能處理客戶端請求。

    4)當多個從伺服器嘗試連接同一個主伺服器的時候,就會出現以下兩種情況:

                  一是:步驟3還未執行,所有從伺服器都會接收到相同的快照文件和相同緩衝區寫命令。

                  二是:步驟3正在執行或者已經執行完畢,當主伺服器與較早的從伺服器完成以上全部步驟之後,主伺服器會新連接的從伺服器重新依次執行1-5步驟。

                 在大部分情況下,Redis會儘可能去減少複製所需要的工作,但是從伺服器連接的時機不湊巧的話,只好多做一些外額外工作。

    5)多個從伺服器連接主伺服器時候,同步數據可能會占用很大一部分的帶寬,可能會導致其他請求難以到達主伺服器。

 

  4、SYNC命令的缺陷

    主要是主從伺服器斷線後重覆制,即處於命令傳播階段的主從伺服器由於網路斷開,從伺服器一直嘗試連接主伺服器連接成功後,繼續複製主伺服器。如下過程在主從伺服器斷開後重新連接期間,主伺服器繼續執行三個SET命令,導致從伺服器連接後發送L SYNC命令,重新進行了“全量”複製過程,RDB文件中包含k1-k10089全部的鍵。

         

 

    其中可以明顯看出重新連接主伺服器之後,SYNC命令創建包含k1-k10089的RDB文件。而事實上只需要再同步斷線後的k10087-k10089即可。SYNC的“全同步”對於從服務來說是不必要的。

               SYNC命令非常消耗資源,原因有三點:

    1)主伺服器執行BGSAVE命令生成RDB文件,這個生成過程會大量消耗主伺服器資源(CPU、記憶體和磁碟I/O資源)

    2)主伺服器需要將自己生成的RBD發送給從從伺服器,這個發送操作會消耗主從伺服器大量的網路資源(帶寬與流量)

    3)接收到RDB文件你的從伺服器需要載入RDB文件,載入期間從伺服器會因為阻塞而導致沒辦法處理命令請求。

    

二、新版複製功能

  為瞭解決舊版本中斷線情況下SYNC低效問題,在Redis 2.8之後使用PSYNC命令代替SYNC命令執行複製同步操作,自然PSYNC具備完整重同步和部分重同步模式

       1)完整重同步:跟舊版複製基本是一致的,可以理解為“全量”複製。

       2)部分重同步:在命令傳播階段,斷線重覆制只需要發送主伺服器在斷開期間執行的寫命給從伺服器即可,可以理解為“增量”複製。

  斷開連接後發送+CONTINUE回覆,表示使用PSYNC部分重同步,只需要同步k10087-10089即可,不需要生成RDB文件

        

  相關流程圖如下:

          

 

 

 

 

 

 

 

 

  


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

-Advertisement-
Play Games
更多相關文章
  • 使用 row_number() over (partition by 要去重的欄位 order by 排序欄位) 資料庫表結構 學生成績表 UserGrade Id int Checked 主鍵IdName varchar(50) Checked 學生名Course varchar(50) Chec ...
  • 兩種用法 一樣, 查詢欄位類型需要一致 union 會自動去重 union all 不會去重 ...
  • 在實際的生產中,考慮的實際情況,我們會調整一些預設配置,例如,數據目錄。InfluxDB修改預設的Data目錄後,因許可權問題,服務無法正常運行。以下是具體的分析測試過程。 配置文件為 /etc/influxdb/influxdb.conf,關於數據存放的預設配置如下: 調整後的配置: 啟動influ ...
  • Oracle 資料庫表中已有重覆數據添加唯一鍵(唯一約束) 問題描述 以 demo 舉例,模擬真實場景。 表 TEST_TABLE 有如下欄位和數據:id 是主鍵,code 沒有設置鍵和索引 ID | CODE | 1 | code1 2 | code2 3 | code2 4 | code2 5 ...
  • https://juejin.im/post/5c91ac636fb9a071012a0c28 詳述MySQL主從複製原理及配置主從的完整步驟 innodb引擎的4大特性 事物的4種隔離級別 sql語句分類 事務是如何通過日誌來實現的 MySQL資料庫幾個基本的索引類型:普通索引、唯一索引、主鍵索引 ...
  • 學習筆記:非原著 ...
  • select語法: select [distinct|all] 列名 from 表名 [where] [group by] [having] [order by] ps:[] 表示可以省略 舉幾個慄子: select * from emp; ps:* 表示所有欄位即把要查詢的表的所有欄位都顯示出來, ...
  • 前言: 在實際工作中,我們可能會遇到需要操作其他資料庫實例的部分表,但又不想系統連接多庫。此時我們就需要用到數據表映射。如同Oracle中的DBlink一般,使用過Oracle DBlink資料庫鏈接的人都知道可以跨實例來進行數據查詢,同樣的,Mysql自帶的FEDERATED引擎完美的幫我們解決了 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...