redis主從複製初識

来源:https://www.cnblogs.com/dwvfw855/archive/2019/05/17/10882757.html
-Advertisement-
Play Games

一、作用 slave會通過被覆制同步master上面的數據,形成數據副本 當master節點宕機時,slave可以升級為master節點承擔寫操作。 允許有一主多從,slave可以承擔讀操作,提高讀性能,master承擔寫操作。即達到讀寫分離 slave會通過被覆制同步master上面的數據,形成數 ...


一、作用

  • slave會通過被覆制同步master上面的數據,形成數據副本

  • 當master節點宕機時,slave可以升級為master節點承擔寫操作。

  • 允許有一主多從,slave可以承擔讀操作,提高讀性能,master承擔寫操作。即達到讀寫分離

二、簡單性質

  • 一個master可以有多個slave

  • 每個slave只能有一個master

  • 每個slave也可以有自己的多個slave

  • 數據流是單向的,從master到slave

三、創建主從的方式

1.slaveof命令

#在希望成為slave的節點中執行以下命令
slaveof ${masterIP} ${masterPort}

此過程會非同步地將master節點中的數據全量地複製到當前節點中

2.通過配置實現

配置項含義
salveof ${masterIP} ${masterPort} 設置當前節點作為其他節點的slave節點
slave-read-only yes 設置當前slave節點是只讀的,不會執行寫操作

 

3.取消主從的方式

#在不希望作為slave的節點中執行以下命令
salveof no one

執行完成之後,該節點的數據不會被清除。而是不會再同步master中的數據

4.查看當前節點是否主從

info replication

 

 

run_id與偏移量

1.run_id

run_id是Redis 伺服器的隨機標識符,用於 Sentinel 和集群,服務重啟後就會改變;

當slave節點複製時發現和之前的 run_id 不同時,將會對數據進行全量同步。

查看runid

redis-cli -p 6379 info server | grep run
run_id:345dda992e5064bc80e01f96ea90f729b722b2ea

2.偏移量

通過對比主從節點的複製偏移量,可以判斷主從節點數據是否一致。

  • 參與複製的主從節點都會維護自身的複製偏移量。主節點(master)在處理完寫命令後,會把命令的位元組長度做累加記錄,統計信息在info replication中的master_repl_offset指標中。

  • 從節點每秒上報自身的複製偏移量給主節點,因此主節點也會保存從節點的複製偏移量

  • 從節點在接收到主節點發送的命令後,也會累加記錄自身的偏移量。統計在info replication中的slave_repl_offset指標中

 

 

全量複製

一、全量複製流程

1.slave -> master : psync ? -1

  • ? 代表當前slave節點不知道master節點的runid

  • -1代表當前slave節點的偏移量為-1

2.master -> slave : +FULLRESYNC runId offset

  • master通知slave節點需要進行全量複製

  • runId:master發送自身節點的runId給slave節點

  • offset:master發送自身節點的offset給slave節點

3.slave : save masterInfo

  • slave節點保存master節點的相關信息(runId與偏移量)

4.master : bgsave

  • master節點通過bgsave命令進行RDB操作

###5.master -> slave : send RDB

  • master將bgsave完的RDB結果發送給slave節點

6.master -> slave : send buffer

  • master在執行寫操作時,會將寫命令寫入repl_back_buffer中

  • 為了維護bgsave過程中執行的寫操作命令,並同步給slave,master將期間的buffer發送給slave。

7.slave : flush old data

  • slave節點將之前的數據全部清空

8.load RDB

  • slave節點載入RDB

 

 

二、全量複製的開銷

  • bgsave時間

  • RDB文件網路傳輸時間

  • slave節點清空數據時間

  • slave節點載入RDB的時間

  • 可能的AOF重寫時間,當載入完RDB之後,如果開啟了AOF重寫,需要重寫AOF,以保證AOF最新

三、全量複製的高版本優化

在redis4.0中,優化了psync,簡稱psync2,實現了即使redis實例重啟的情況下也能實現部分同步

 

 

部分複製

一、部分複製流程

1.slave -> master : Connection lost

  • 由於網路抖動等原因,slave對master的網路連接發生中斷

2.slave -> master : Connection to master

  • slave重新建立與master節點的連接

3.slave -> master : psync runId offset

  • slave節點發送master節點的runId以及自身的offset

4.master -> slave :CONTINUE

  • 在第③步中,master節點校驗offset,在當前buffer的範圍中,則將反饋從節點CONTINUE表示部分複製。

  • 如果offset不在當前buffer的範圍中,則將反饋從節點FULLRESYNC表示需要全量複製

  • buffer的大小預設為1MB,由repl_back_buffer維護

5.master -> slave : send partial data

  • 發送部分數據給slave節點讓slave節點完成部分複製

 

 

故障處理

一、slave宕機故障

  • 會影響redis服務的整體讀性能,對系統可用性沒有影響,將slave節點重新啟動並執行slaveof即可。

  •  

二、master宕機故障

  • redis將無法執行寫請求,只有slave節點能執行讀請求,影響了系統的可用性

  • 方法1:

    • 隨機找一個節點,執行slaveof no one,使其成為master節點

    • 然後對其他slave節點執行slaveof newMatserIp newMasterPort

  • 方法2:

    • 馬上重啟master節點,它將會重新成為master

 

 

開發與運維中的問題

一、讀寫分離

  • 含義:master只承擔寫請求,讀請求分攤到slave節點執行

  • 可能遇到的問題

    • 複製數據延遲

      • 當寫操作從master同步到slave的時候,會有很短的延遲

      • 當網路原因或者slave阻塞時,會有比較長的延遲

      • 在這種情況下,可以通過配置一個事務中的讀寫都在主庫得已實現

      • 可以通過偏移量對這類問題進行監控

    • 讀到過期數據(在v3.2中已經解決)

      • 刪除過期數據的策略1:操作key的時候校驗該key是否過期,如果已經過期,則刪除

      • 刪除過期數據的策略2:redis內部有一個定時任務定時檢查key有沒有過期,如果採樣的速度比不上過期數據的產生速度,會導致很多過期數據沒有被刪除。

      • 在redis集群中,有一個約定,slave節點只能讀取數據,而不能操作數據

    • 從節點故障

二、配置不一致

  • maxmemory不一致:可能會丟失數據

    • 例如master配置為4G,從節點配置為2G。

  • 數據結構優化參數(例如hash-max-ziplist-entries):導致記憶體不一致

三、規避全量複製

  • 第一次全量複製

    • 第一次不可避免

    • 小主節點(數據分片),低峰處理(夜間)

  • 節點運行ID不匹配

    • 主節點重啟(運行ID變化)

    • 可以使用故障轉移進行處理,例如哨兵或集群。

  • 複製積壓緩衝區不足

    • 如果offset在緩衝區之內,則可以完成部分複製,否則需要全量複製

    • 可以增大複製緩衝區的大小:rel_backlog_size,預設1M,可以提升為10MB

四、規避複製風暴

1.單主節點複製風暴

  • 問題:主節點重啟,多從節點複製

  • 解決:更換複製拓撲,由(m-s1,s2,s3)的模式改成(m-s1-s1a,s1b)的模式,可以減輕master的壓力

       

 

2.單機器複製風暴

  • 如下圖:機器宕機後,大量全量複製

  • 解決:主節點分散多機器

  •  

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、當前目錄下打開CMD控制台視窗,執行如下bat命令: 2、如下圖例操作步驟: 打開CMD視窗 輸入命令 生成文件 結果截圖 ...
  • 有網友問及,看到Insus.NET幫他解決問題分享的截屏時,發現代碼中有顯示行號。而他的沒有。 Step1: Go to Tools > Options Step2: In the Options dialog box navigate to Text Editor > All Languages> ...
  • 1 許可權管理 如何創建一個用戶並授予一定許可權? 1 --創建用戶 2 create user test01 identified by 123 3 4 -- 查看是否創建成功 5 select * from dba_users 6 where username = 'TEST01'; 7 8 -- ...
  • 說明1:監控MySQL伺服器資源不止一種方式,這種nmon監控圖形化、歷史記錄查詢筆記方便,便於MySQL優化後,對比其效率不同,資源利用率不同。 說明2:摘抄自https://www.cnblogs.com/wnfindbug/p/5719181.html 對奉獻著予以感謝! 一、檢查安裝環境 # ...
  • 剛有網友提問,只有一張表,其中有子鍵與父鍵關聯,怎樣根擾子鍵查詢到父鍵記錄的數據? Insus.NET嘗試寫了一個簡單的例子,希望能看得懂。 CREATE TABLE [dbo].[tempTable] ( [id] INT , [parent_id] INT NULL, [itemName] NV ...
  • 第一步:首先通過cmd進入mysql 在命令視窗 輸入:mysql -u root -p; 第二步:更改加密方式 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; Query OK ...
  • 本文主要記錄關於Oracle在本地連接中出現與監聽有關的問題以及相應的解決方法,如有不足或者錯誤,歡迎指正! ...
  • SQL語言共分為四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。1. 數據查詢語言DQL數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊:SELECT <欄位名錶>FROM <表或視圖名>WHERE <查詢條件>2 .數 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...