005.Redis 主從復制架構

主從復制概念與原理

核心概念

主節點(Master):唯一接受寫操作的節點,數據修改后異步復制到從節點。
從節點(Replica):復制主節點數據的節點,默認只讀(可配置為可寫但不推薦)。

所以,主從復制,是指將一臺Redis服務器的數據,復制到其他的Redis服務器。前者稱為主節點(master),后者稱為從節點(slave);數據的復制是單向的,只能由主節點到從節點。

主要價值

主從復制主要有能實現如下價值:

數據冗余:主從復制實現了數據的熱備份,是持久化之外的一種數據冗余方式。
故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗余。
負載均衡:在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis數據時應用連接主節點,讀Redis數據時應用連接從節點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis服務器的并發量。
高可用基石:除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎。

主從庫之間采用的是讀寫分離的方式,即:
讀操作:主庫、從庫都可以接收;
寫操作:首先到主庫執行,然后,主庫將寫操作同步給從庫

在這里插入圖片描述

復制流程

  1. 從節點連接主節點發送 PSYNC 命令
  2. 主節點執行 BGSAVE 生成 RDB 快照
  3. RDB 文件傳輸到從節點
  4. 從節點加載 RDB 文件
  5. 主節點將期間的寫命令發送到從節點
  6. 持續增量同步
    在這里插入圖片描述

關鍵特性:
異步復制:主節點不等待從節點確認
全量復制:首次連接或復制中斷時間過長時觸發
部分復制:基于復制偏移量(offset)的增量同步
級聯復制:從節點可以作為其他節點的主節點

復制原理

  1. 確立主從關系
    如有 redis01 (172.24.8.11)實例和 redis02 (172.24.8.12),在 redis02 上執行以下這個命令后,redis02 就變成了 redis01 的從庫,并從 redis01 上復制數據。
replicaof 172.24.8.11 6379
  1. 全量復制階段
    在這里插入圖片描述

第一階段:主從庫間建立連接、協商同步的過程,主要是為全量復制做準備。在這一步,從庫和主庫建立起連接,并告訴主庫即將進行同步,主庫確認回復后,主從庫間就可以開始同步了。
具體來說,從庫給主庫發送 psync 命令,表示要進行數據同步,主庫根據這個命令的參數來啟動復制。
psync 命令包含了主庫的 runID 和復制進度 offset 兩個參數。
runID 是每個 Redis 實例啟動時都會自動生成的一個隨機 ID,用來唯一標記這個實例。
當從庫和主庫第一次復制時,因為不知道主庫的 runID,所以將 runID 設為“?”。
offset,此時設為 -1,表示第一次復制。
主庫收到 psync 命令后,會用 FULLRESYNC 響應命令帶上兩個參數:主庫 runID 和主庫目前的復制進度 offset,返回給從庫。
從庫收到響應后,會記錄下這兩個參數。這里有個地方需要注意,FULLRESYNC 響應表示第一次復制采用的全量復制,也就是說,主庫會把當前所有的數據都復制給從庫。

第二階段,主庫將所有數據同步給從庫。從庫收到數據后,在本地完成數據加載。這個過程依賴于內存快照生成的 RDB 文件。
具體來說,主庫執行 bgsave 命令,生成 RDB 文件,接著將文件發給從庫。從庫接收到 RDB 文件后,會先清空當前數據庫,然后加載 RDB 文件。
這是因為從庫在通過 replicaof 命令開始和主庫同步前,可能保存了其他數據。
為了避免之前數據的影響,從庫需要先把當前數據庫清空。
在主庫將數據同步給從庫的過程中,主庫不會被阻塞,仍然可以正常接收請求。否則,Redis 的服務就被中斷了。
但是,這些請求中的寫操作并沒有記錄到剛剛生成的 RDB 文件中。為了保證主從庫的數據一致性,主庫會在內存中用專門的 replication buffer,記錄 RDB 文件生成后收到的所有寫操作。

第三個階段,主庫會把第二階段執行過程中新收到的寫命令,再發送給從庫。
具體的操作是,當主庫完成 RDB 文件發送后,就會把此時 replication buffer 中的修改操作發給從庫,從庫再重新執行這些操作。這樣一來,主從庫就實現同步了。

  1. 增量復制

如果主從庫在命令傳播時出現了網絡閃斷,那么,從庫就會和主庫重新進行一次全量復制,開銷非常大。因此如果出現類似異常之后,主從庫會采用增量復制的方式繼續同步。

提示:在進行主從復制設置時,強烈建議在主服務器上開啟持久化,主要是避免出現如下風險:

假設設置節點A為主服務器,關閉持久化,節點B和C從節點A復制數據。
這時出現了一個崩潰,但Redis具有自動重啟系統,重啟了進程,因為關閉了持久化,節點重啟后只有一個空的數據集。
節點B和C從節點A進行復制,現在節點A是空的,所以節點B和C上的復制數據也會被刪除。

讀寫分離概念與原理

讀寫分離說明

讀寫分離是在主從復制基礎上實現的,可以實現Redis的讀負載均衡:由主節點提供寫服務,由一個或多個從節點提供讀服務(多個從節點既可以提高數據冗余程度,也可以最大化讀負載能力);在讀負載較大的應用場景下,可以大大提高Redis服務器的并發量。

讀寫分離關注點

  • 延遲與不一致問題

由于主從復制的命令傳播是異步的,延遲與數據的不一致不可避免。如果應用對數據不一致的接受程度程度較低,可能的優化措施包括:優化主從節點之間的網絡環境(如在同機房部署);監控主從節點延遲(通過offset)判斷,如果從節點延遲過大,通知應用不再通過該從節點讀取數據;使用集群同時擴展寫負載和讀負載等。

  • 數據過期問題

在單機版Redis中,存在兩種刪除策略:
+ 惰性刪除:服務器不會主動刪除數據,只有當客戶端查詢某個數據時,服務器判斷該數據是否過期,如果過期則刪除。
+ 定期刪除:服務器執行定時任務刪除過期數據,但是考慮到內存和CPU的折中(刪除會釋放內存,但是頻繁的刪除操作對CPU不友好),該刪除的頻率和執行時間都受到了限制。
在主從復制場景下,為了主從節點的數據一致性,從節點不會主動刪除數據,而是由主節點控制從節點中過期數據的刪除。由于主節點的惰性刪除和定期刪除策略,都不能保證主節點及時對過期數據執行刪除操作,因此,當客戶端通過Redis從節點讀取數據時,很容易讀取到已經過期的數據。

提示:在Redis 3.2后,從節點在讀取數據時,增加了對數據是否過期的判斷:如果該數據已過期,則不返回給客戶端。

  • 故障切換問題

在沒有使用哨兵的讀寫分離場景下,應用針對讀和寫分別連接不同的Redis節點;當主節點或從節點出現問題而發生更改時,需要及時修改應用程序讀寫Redis數據的連接;連接的切換可以手動進行,或者自己寫監控程序進行切換,但前者響應慢、容易出錯,后者實現復雜,成本較高。

  • 總結

在使用讀寫分離之前,可以考慮其他方法增加Redis的讀負載能力:如盡量優化主節點(減少慢查詢、減少持久化等其他情況帶來的阻塞等)提高負載能力;使用Redis集群同時提高讀負載能力和寫負載能力等。如果使用讀寫分離,可以使用哨兵,使主從節點的故障切換盡可能自動化,并減少對應用程序的侵入。

參考: Redis進階 - 高可用:主從復制詳解

主從復制架構實踐

安全預設

根據實際情況,關閉防火墻和SELinux。

[root@redis01 ~]# systemctl disable firewalld --now
[root@redis01 ~]# sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

注意:以上操作在所有Slave主機上也需要執行。

時鐘服務

主從架構建議保證時鐘服務正確,具體時鐘配置參考:NTP服務器

001.Chrony時間服務器

  • ntpd服務查看
[root@redis01 ~]# ntpq -npremote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*116.62.13.223   100.100.61.92    2 u   28   64  377   34.750   24.098   4.261
+203.107.6.88    100.107.25.114   2 u   13   64  377   47.745   18.287   8.121
  • chrony服務查看
[root@redis01 ~]# chronyc sources -v

Redis 安裝

略,參考《001.Redis 簡介及安裝》。

提示:主從節點都需要安裝Redis。

Redis 主節點配置

[root@redis01 ~]# mkdir -p /var/lib/redis/redis01/ /var/log/redis/      #創建Redis RDB持久化文件保存路徑[root@redis01 ~]# vim /etc/redis/redis01_6379.conf
#……
# 核心配置項:
bind 0.0.0.0 -::1                       # 允許所有IP連接
protected-mode no                       # 關閉保護模式
port 6379
daemonize yes
logfile /var/log/redis/redis01.log
dir /var/lib/redis/redis01# 主從復制相關
repl-backlog-size 64mb                  # 復制積壓緩沖區大小(建議1-2倍內存)
repl-backlog-ttl 3600                   # 緩沖區保留時間(秒)
repl-diskless-sync yes                  # 啟用無盤復制(推薦)
repl-diskless-sync-delay 5              # 等待更多從節點加入(秒)
#requirepass "StrongPassword123!" [root@redis01 ~]# systemctl restart redis-server

Redis 從節點配置

[root@redis02 ~]# mkdir -p /var/lib/redis/redis01/ /var/log/redis/      #創建Redis RDB持久化文件保存路徑[root@redis02 ~]# vim /etc/redis/redis01_6379.conf
#……
# 核心配置項:
bind 0.0.0.0 -::1                       # 允許所有IP連接
protected-mode no                       # 關閉保護模式
port 6379
daemonize yes
logfile /var/log/redis/redis01.log
dir /var/lib/redis/redis01# 主從復制配置
replicaof 172.24.8.11 6379              # 關鍵配置:指定主節點
replica-read-only yes                   # 默認,從節點只讀(推薦)
repl-diskless-load disabled             # 默認,從節點禁用無盤加載(避免風險)
#masterauth "StrongPassword123!"        # 如果主節點有密碼需配置[root@redis02 ~]# systemctl restart redis-server

主從復制驗證

  • 狀態驗證

在主從節點上查看兩個節點的狀態。

[root@redisclient ~]# redis-cli -h redis01 -p 6379
redis01:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.24.8.12,port=6379,state=online,offset=306,lag=0
master_failover_state:no-failover
master_replid:a8f80c6ab90acb062021f2f0e589191c165022c1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:306
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:67108864
repl_backlog_first_byte_offset:223
repl_backlog_histlen:84
redis01:6379> exit[root@redisclient ~]# redis-cli -h redis02 -p 6379
redis02:6379> INFO replication
# Replication
role:slave
master_host:172.24.8.11
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_read_repl_offset:320
slave_repl_offset:320
replica_full_sync_buffer_size:0
replica_full_sync_buffer_peak:0
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a8f80c6ab90acb062021f2f0e589191c165022c1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:320
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:237
repl_backlog_histlen:84
  • 數據驗證
[root@redisclient ~]# redis-cli -h redis01 -p 6379
redis01:6379> SET master_key "value_from_master"
OK
redis01:6379> exit[root@redisclient ~]# redis-cli -h redis02 -p 6379
redis02:6379> GET master_key
"value_from_master"
redis02:6379> exit

模擬宕機

在這里插入圖片描述

  • 停止主節點
[root@redis01 ~]# systemctl stop redis-server
  • 2從節點查看狀態
[root@redisclient ~]# redis-cli -h redis02 -p 6379
redis02:6379> INFO replication
master_link_status:down                     # 顯示連接斷開
  • 提升從節點為主節點(臨時方案)
[root@redisclient ~]# redis-cli -h redis02 -p 6379
redis02:6379> REPLICAOF NO ONE  # 取消復制關系

節點切換后,對應的應用程序也需要修改數據庫IP。

提示;主從復制本身不提供自動故障切換,需要手動執行切換,然后程序需要手動重新指定IP。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93906.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio 模擬器 “******“ has terminated 問題

問題:Android Studio 模擬器 "**" has terminated 問題設備信息:CPU:I5 7500U RAM:64GB System:Windows 10 64位解決: 網上所有辦法都嘗試后仍然不可行可嘗試如下辦法:1、此電腦→管理→設備管理→顯示適配器→右擊→…

uniapp 懶加載圖片

實現的功能 1.一次性獲取圖片。 2.按用戶視野范圍內看到的圖片滾動下來進行懶加載,提高瀏覽器性能。 3.不要一次性加載全部的圖片 1.給父組件綁定一個滾動監聽 1.頁面路徑:/pages/Home/index.vue 不在一個頁面的話用 EventBus去觸發。@scroll="handleScroll2" Ev…

Android - 資源類型 MINE Type

一、概念MINE(Multipurpose Internet Mail Extensions)最初是為了標識電子郵件附件的類型,在 HTML 中使用 content-type 屬性表示,描述了文件類型的互聯網標準。格式:媒體類型/子類型,可使用通配符*。如 au…

php8.+ 新函數總結

PHP系統函數是PHP核心提供的內置函數,用于執行常見任務,如字符串操作、數組處理、數學運算等。它們通過預定義代碼塊封裝了特定功能,開發者可直接調用而無需重復編寫代碼。 而 PHP 8.0以后又新增了一些實用函數,今天總結部分常見的…

Qt事件處理機制詳解

一、事件處理基本流程在Qt中,所有從QObject派生的類都能處理事件。事件處理的核心流程如下:事件入口函數:bool QObject::event(QEvent *e)參數e包含事件信息,通過e->type()獲取事件類型返回值true表示事件已被處理,…

Zynq中級開發七項必修課-第三課:S_AXI_GP0 主動訪問 PS 地址空間

Zynq中級開發七項必修課-第三課:S_AXI_GP0 主動訪問 PS 地址空間 目標1.0 編寫 AXI-Lite Master:按鍵計數 → 寫入 PS 內存1.1 PL 觸發中斷 → PS 響應并串口打印按鍵計數值BD圖axi_lite_master.v // // AXI4-Lite Simple Master (single-shot, non-pip…

CVPR | 2025 | MAP:通過掩碼自回歸預訓練釋放混合 Mamba - Transformer 視覺骨干網絡的潛力

文章目錄CVPR | 2025 | MAP:通過掩碼自回歸預訓練釋放混合 Mamba - Transformer 視覺骨干網絡的潛力創新點初步研究初步結論方法確定一個混合網絡方法掩碼機制掩碼比例MAP的transformer解碼器重建目標實驗ImageNet-1k 上的 2D 分類CVPR | 2025 | MAP:通過…

Spring Boot + Spring AI 最小可運行 Demo

一. 項目依賴&#xff08;pom.xml&#xff09;<project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/mav…

AI重塑校園教育:中小學AI智慧課堂定制方案+AI作業批改減負,告別一刀切學生進步快

家長們&#xff0c;你有沒有聽過孩子抱怨上學的煩惱&#xff1f;課堂上老師講的內容&#xff0c;有的同學覺得太簡單 “吃不飽”&#xff0c;有的卻跟不上 “聽不懂”&#xff1b;放學后作業堆成山&#xff0c;老師要熬夜批改到半夜&#xff0c;錯題反饋要等第二天才能拿到&…

舊物循環,交易新生——舊物回收二手交易小程序,引領綠色消費新風尚

在資源日益緊張、環境污染問題日益突出的今天&#xff0c;綠色消費已經成為時代發展的必然趨勢。舊物回收二手交易小程序&#xff0c;作為綠色消費的重要載體&#xff0c;正以其獨特的優勢和魅力&#xff0c;引領著一場關于舊物循環、交易新生的綠色革命。一、舊物循環&#xf…

刷機維修進階教程-----如何清除云賬號 修復wifi 指南針 相機 指紋等刷機故障

在刷機、系統升級或降級過程中,是否遇到過以下問題:WiFi無法開啟、相機無響應、指南針或陀螺儀失靈 指紋等故障?另外,云賬號是否仍會保留,即使通過9008模式刷機也無法徹底清除?那么這篇博文都可以找到答案。 通過博文了解?????? 1??????----云賬號信息分區如…

AI翻唱實戰:用[靈龍AI API]玩轉AI翻唱 – 第6篇

歷史文章 [靈龍AI API] 申請訪問令牌 - 第1篇 [靈龍AI API] AI生成視頻API&#xff1a;文生視頻 – 第2篇 圖生視頻實戰&#xff1a;用[靈龍AI API]玩轉AI生成視頻 – 第2篇&#xff0c;從靜圖到大片 單圖特效實戰&#xff1a;用[靈龍AI API]玩轉AI生成視頻 – 第3篇&#…

大模型0基礎開發入門與實踐:第11章 進階:LangChain與外部工具調用

第11章 進階&#xff1a;LangChain與外部工具調用 1. 引言 在上一章&#xff0c;我們成功地創造了我們的第一個“生命”——一個可以對話的機器人。我們為它的誕生而興奮&#xff0c;但很快我們就會發現它的局限性。它就像一個被囚禁在玻璃房中的天才大腦&#xff0c;擁有淵博…

SQL 日期處理:深入解析與高效實踐

SQL 日期處理&#xff1a;深入解析與高效實踐 引言 在數據庫管理中&#xff0c;日期和時間數據的處理是不可或缺的一部分。SQL&#xff08;結構化查詢語言&#xff09;提供了豐富的日期和時間函數&#xff0c;使得對日期的處理變得既靈活又高效。本文將深入探討SQL日期處理的相…

源代碼部署 LAMP 架構

源代碼部署 LAMP 架構 &#xff08;Linux Apache MySQL PHP&#xff09; 一、LAMP 架構概述 LAMP 是一套經典的開源 Web 服務架構&#xff0c;通過源代碼安裝可實現高度定制化&#xff0c;適用于對軟件版本、功能模塊有特定需求的場景。本指南基于 CentOS 7 系統&#xf…

GO環境變量中GO111MODULE到底是干啥的?

查看GO111MODULE變量GO111MODULE的作用GO111MODULE的案例演示 一&#xff0c;查看GO111MODULE變量 ]# go env GO111MODULE 或者 ]# go env | grep GO111MODULE二&#xff0c;GO111MODULE的作用 auto : 自動判斷機制 當項目位于 $GOPATH/src 目錄外且包含 go.mod 文件時&…

在線培訓機構如何降低培訓視頻被盜錄的風險

每一節精心錄制的培訓視頻&#xff0c;都凝聚著講師的心血與機構的巨大投入。然而&#xff0c;只需一個簡單的錄屏軟件&#xff0c;這一切都可能被輕易竊取。一旦被盜取&#xff0c;不但會損失經濟利益&#xff0c;還可能會影響機構的聲譽。那么&#xff0c;在線培訓機構如何降…

Docker:安裝配置

目錄一、卸載舊版本二、配置Docker的yum庫三、安裝Docker3.1 在線安裝方式3.2 離線安裝方式四、配置阿里云鏡像加速【選配】五、Docker服務相關命令六、導出和導入鏡像官網 一、卸載舊版本 首先如果系統中已經存在舊版本的Docker&#xff0c;則先卸載&#xff1a; yum remov…

RabbitMQ:SpringAMQP 入門案例

目錄一、概述二、基礎配置三、生產者四、消費者一、概述 這是一篇Java集成RabbitMQ的入門案例&#xff0c;在這里我們做一個小案例&#xff0c;來體會一下RabbitMQ的魅力。 首先我們要做的就是創建一個生產者一個消費者&#xff1a; 生產者直接向RabbitMQ的隊列&#xff08;Q…

Ubuntu 下面安裝搜狗輸入法debug記錄

目錄0. 整體安裝流程1. 在鍵盤輸入法系統中&#xff0c;沒有“fcitx”選項解決方法0. 整體安裝流程 詳細的Ubuntu搜狗輸入法安裝指南請參考官方教程&#xff1a;Ubuntu搜狗輸入法安裝指南 1. 在鍵盤輸入法系統中&#xff0c;沒有“fcitx”選項 即使是安裝完 fcitx&#xff0…