MySQL篇(五)MySQL主從同步原理深度剖析

MySQL篇(五)MySQL主從同步原理深度剖析

  • MySQL篇(五)MySQL主從同步原理深度剖析
    • 一、引言
    • 二、MySQL主從同步基礎概念
      • 主庫(Master)
      • 從庫(Slave)
      • 二進制日志(Binary Log)
      • 中繼日志(Relay Log)
    • 三、MySQL主從同步的具體流程
      • 主庫操作記錄階段
      • 從庫連接與獲取日志階段
      • 從庫重放執行階段
    • 四、關鍵線程與日志的協同工作
      • I/O線程的作用與工作細節
      • SQL線程的作用與工作細節
      • 二進制日志與中繼日志的關聯
    • 五、MySQL主從同步的幾種模式
      • 基于語句的復制(Statement - Based Replication,SBR)
      • 基于行的復制(Row - Based Replication,RBR)
      • 混合模式的復制(Mixed - Based Replication,MBR)
    • 六、主從同步中的常見問題與解決思路
      • 主從數據延遲問題
      • 主從同步中斷問題
      • 數據一致性問題
    • 七、總結

MySQL篇(五)MySQL主從同步原理深度剖析

一、引言

在當今數據驅動的時代,數據庫的高可用性和性能擴展至關重要。MySQL主從同步作為一種廣泛應用的技術手段,能夠有效地實現數據冗余備份、讀寫分離以提升系統整體性能等功能。深入理解MySQL主從同步原理,對于數據庫管理員進行系統架構設計、故障排查以及性能優化都有著不可忽視的意義。接下來,我們將逐步揭開MySQL主從同步原理的神秘面紗。

二、MySQL主從同步基礎概念

主庫(Master)

主庫是數據寫入的源頭,負責處理客戶端的寫操作請求,如INSERT、UPDATE、DELETE等語句。在主從同步架構中,主庫將自身執行的寫操作記錄下來,以便后續能傳遞給從庫,確保從庫的數據與主庫保持一致。

從庫(Slave)

從庫主要承擔數據讀取的任務,它通過與主庫建立連接,接收主庫發送過來的寫操作記錄,并在本地進行重放執行,從而實現與主庫數據的同步。從庫可以有多個,它們可以分擔主庫的讀壓力,提高整個系統的并發讀取能力。

二進制日志(Binary Log)

二進制日志是MySQL主庫中非常關鍵的一個組件,它記錄了主庫上所有的寫操作事件。這些事件按照時間順序依次記錄,包括操作的類型(如插入、更新、刪除)、涉及的表、具體的操作數據等信息。二進制日志是主從同步過程中主庫向從庫傳遞數據變更信息的核心載體。

中繼日志(Relay Log)

中繼日志是從庫特有的日志文件。從庫在接收到主庫發送過來的二進制日志內容后,會先將其寫入到中繼日志中。中繼日志起到一個緩沖和中轉的作用,從庫的SQL線程會從中繼日志中讀取事件并在本地執行,進而完成數據的同步。

三、MySQL主從同步的具體流程

主庫操作記錄階段

當客戶端向主庫發起寫操作請求時,主庫會在內存中對數據進行相應的修改,并將該寫操作以事件的形式記錄到二進制日志中。例如,當執行一條INSERT語句向某張表中插入一條記錄時,主庫首先會在內存的相關數據結構中完成數據插入操作,同時生成一個對應的二進制日志事件,該事件包含了INSERT操作的具體信息,如插入的表名、字段值等。主庫會按照事務提交的順序,將這些寫操作事件依次追加到二進制日志文件中。

從庫連接與獲取日志階段

  1. 建立連接
    從庫通過配置的主庫連接信息(包括主庫的IP地址、端口、用戶名、密碼等),使用MySQL的復制協議與主庫建立連接。連接建立成功后,從庫會向主庫發送請求,獲取主庫當前二進制日志的文件名和位置信息(即File和Position),這些信息將作為從庫后續讀取主庫二進制日志的起始點。
  2. 啟動I/O線程
    從庫會啟動一個I/O線程,該線程負責與主庫進行通信,從主庫的二進制日志中讀取寫操作事件。I/O線程根據之前獲取到的二進制日志文件名和位置信息,向主庫發送讀取請求,主庫接收到請求后,會從對應的位置開始,將二進制日志中的事件發送給從庫的I/O線程。I/O線程接收到這些事件后,會將其寫入到從庫的中繼日志中。在這個過程中,I/O線程會持續不斷地與主庫進行交互,只要主庫有新的寫操作記錄到二進制日志中,I/O線程就會及時獲取并寫入中繼日志。

從庫重放執行階段

從庫在將主庫的寫操作事件寫入中繼日志后,會啟動另一個重要的線程——SQL線程。SQL線程負責從中繼日志中讀取事件,并按照事件在中繼日志中的順序,在從庫本地進行重放執行。例如,對于從主庫接收到的INSERT事件,SQL線程會在從庫對應的表中執行相同的INSERT操作,將數據插入到表中。通過這種方式,從庫能夠逐步將主庫上的寫操作在本地進行復制,從而實現與主庫數據的同步。SQL線程在執行過程中,會嚴格遵循事務的順序,確保數據同步的準確性和一致性。

四、關鍵線程與日志的協同工作

I/O線程的作用與工作細節

I/O線程在MySQL主從同步過程中扮演著數據傳輸橋梁的角色。它與主庫保持著持續的連接,不斷監聽主庫二進制日志的變化。在獲取二進制日志事件時,I/O線程需要處理網絡傳輸、數據緩沖等一系列問題。為了保證數據傳輸的穩定性和高效性,I/O線程會采用一些優化策略,如批量讀取二進制日志事件,減少網絡傳輸的次數。同時,I/O線程還需要處理可能出現的網絡故障、主庫連接中斷等異常情況,當遇到這些問題時,它會嘗試進行重連和恢復數據傳輸,以確保從庫能夠持續獲取主庫的寫操作記錄。

SQL線程的作用與工作細節

SQL線程專注于在從庫本地執行中繼日志中的事件。它需要對中繼日志中的各種操作事件進行解析和執行。在執行過程中,SQL線程要保證操作的順序性和準確性,避免因為并發執行或者執行順序錯誤而導致數據不一致。對于一些復雜的操作,如涉及到事務、外鍵約束等情況,SQL線程需要嚴格按照MySQL的事務處理規則和約束機制進行處理。此外,SQL線程還會對執行結果進行記錄和校驗,確保操作成功執行并且數據同步準確。

二進制日志與中繼日志的關聯

二進制日志是主庫寫操作的原始記錄,而中繼日志則是從庫接收主庫數據變更信息的中間存儲。從庫的I/O線程將二進制日志中的內容復制到中繼日志中,中繼日志成為了從庫SQL線程執行操作的數據源。兩者之間的關聯確保了主庫的寫操作能夠準確無誤地傳遞到從庫并得到執行,是MySQL主從同步實現數據一致性的關鍵環節。

五、MySQL主從同步的幾種模式

基于語句的復制(Statement - Based Replication,SBR)

在這種模式下,主庫將執行的SQL語句記錄到二進制日志中,從庫在重放時直接執行這些SQL語句。例如,主庫執行了一條簡單的UPDATE語句“UPDATE users SET age = age + 1 WHERE id = 1;”,主庫會將這條語句記錄到二進制日志中,從庫的SQL線程從中繼日志中讀取到這條語句后,會在本地執行相同的UPDATE操作。這種模式的優點是二進制日志文件相對較小,因為它只記錄SQL語句,而不是實際的數據變更,能夠節省磁盤空間和網絡傳輸帶寬。然而,它也存在一些局限性,比如對于一些具有不確定性的函數(如NOW()、RAND()等),在主從庫上執行可能會得到不同的結果,導致數據不一致。

基于行的復制(Row - Based Replication,RBR)

基于行的復制模式下,主庫會記錄每一行數據的實際變更情況到二進制日志中。當主庫對某一行數據進行修改時,二進制日志會記錄修改前和修改后該行數據的具體內容。例如,對于上述UPDATE操作,二進制日志會記錄users表中id為1的這一行數據修改前的age值和修改后的age值。從庫在重放時,會根據這些具體的數據變更信息進行操作。這種模式的優點是能夠保證主從庫數據的高度一致性,避免了基于語句復制中因函數不確定性等問題導致的數據不一致情況。但缺點是二進制日志文件會相對較大,因為它記錄了每一行數據的詳細變更,會占用更多的磁盤空間和網絡帶寬。

混合模式的復制(Mixed - Based Replication,MBR)

混合模式結合了基于語句的復制和基于行的復制的優點。在這種模式下,MySQL會根據具體的操作情況自動選擇合適的復制方式。一般情況下,對于普通的、確定性的SQL語句,會采用基于語句的復制方式;而對于可能導致數據不一致的操作(如涉及不確定性函數的操作),則會自動切換為基于行的復制方式。這種模式在一定程度上平衡了日志文件大小和數據一致性之間的關系,是MySQL較為常用的一種主從同步復制模式。

六、主從同步中的常見問題與解決思路

主從數據延遲問題

  1. 原因分析
    主從數據延遲是指從庫的數據同步落后于主庫,導致主從庫之間數據不一致。造成這種問題的原因有很多,例如從庫的硬件性能較差,導致SQL線程執行中繼日志事件的速度較慢;主庫上有大量的并發寫操作,產生的二進制日志量過大,從庫的I/O線程和SQL線程處理速度跟不上;網絡延遲過高,影響了從庫從主庫獲取二進制日志的速度等。
  2. 解決思路
    針對從庫硬件性能問題,可以考慮升級從庫的硬件配置,如增加CPU、內存等資源,提高SQL線程的執行效率。對于主庫寫操作過于頻繁的情況,可以通過優化主庫的業務邏輯,減少不必要的寫操作,或者采用分庫分表等方式分散寫壓力。此外,還可以通過調整MySQL的相關參數,如適當增大從庫的innodb_log_buffer_size參數,提高I/O線程的讀取效率;調整slave_parallel_workers參數,開啟并行復制功能(在MySQL 5.6及以上版本支持),讓SQL線程能夠并行執行中繼日志事件,加快數據同步速度。同時,優化網絡環境,降低網絡延遲,也有助于緩解主從數據延遲問題。

主從同步中斷問題

  1. 原因分析
    主從同步中斷可能是由于網絡故障導致從庫與主庫的連接斷開,或者主庫或從庫出現異常重啟等情況。另外,如果主庫的二進制日志文件損壞,從庫在讀取時也會出現錯誤,從而導致同步中斷。
  2. 解決思路
    當出現網絡故障導致連接斷開時,從庫會自動嘗試重連主庫。數據庫管理員可以通過監控工具及時發現連接中斷情況,并檢查網絡配置,確保網絡恢復正常。對于主庫或從庫異常重啟的情況,需要在重啟后檢查主從同步的狀態,可以通過查看從庫的狀態信息(如使用SHOW SLAVE STATUS語句),確認I/O線程和SQL線程是否正常運行。如果主庫的二進制日志文件損壞,可以嘗試從備份中恢復二進制日志,或者通過重新初始化主從同步關系來解決問題。具體操作可以先在從庫上停止復制(STOP SLAVE;),然后重新配置主庫連接信息并啟動復制(CHANGE MASTER TO…; START SLAVE;)。

數據一致性問題

  1. 原因分析
    除了前面提到的基于語句復制模式下因函數不確定性導致的數據不一致外,在主從同步過程中,如果主庫和從庫的MySQL版本不一致,或者配置參數存在差異,也可能會導致數據一致性問題。此外,在一些特殊的場景下,如主庫和從庫同時對同一條數據進行操作(雖然這種情況應該盡量避免,但在復雜的業務環境中可能會出現),也會引發數據沖突和不一致。
  2. 解決思路
    為了保證數據一致性,首先要確保主庫和從庫的MySQL版本相同,并且配置參數保持一致。在業務設計上,要嚴格避免主庫和從庫同時對同一條數據進行操作的情況。如果出現了數據沖突,可以通過一些數據校驗和修復工具來檢查和修復不一致的數據。例如,可以使用pt - table - checksum工具來檢測主從庫之間的數據差異,并根據檢測結果進行相應的數據修復操作。

七、總結

MySQL主從同步原理是一個復雜而又精妙的機制,它通過主庫記錄操作、從庫獲取并重放操作的流程,借助二進制日志、中繼日志以及I/O線程、SQL線程等組件的協同工作,實現了主從庫之間的數據同步。了解不同的復制模式以及常見問題的解決思路,對于構建穩定、高效的MySQL主從架構至關重要。隨著數據庫技術的不斷發展,MySQL主從同步也在不斷演進和優化,數據庫管理員需要持續關注和學習,以更好地應用這一技術來滿足業務對數據存儲和處理的需求。希望通過本文的介紹,讀者能夠對MySQL主從同步原理有一個全面而深入的理解。

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

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

相關文章

論文學習16:Learning Transferable Visual Models From Natural Language Supervision

代碼來源 Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00020 模塊作用 當前最先進的計算機視覺系統被訓練用于預測一組固定的、預先定義的目標類別。這種受限的監督方式限制了它們的通用性和可用性,因為要…

[MySQL初階]MySQL(9)事務機制

標題:[MySQL初階]MySQL(9)事物機制 水墨不寫bug 文章目錄 一、認識事務1、多線程訪問數據庫出現的問題2、對CURD的限制是通過事務機制實現的3、事務的四個屬性4、哪些引擎支持事務 二、事務的提交與autocommit設置三、事務的隔離性和隔離級別…

spring-cloud-alibaba-nacos-config使用說明

一、核心功能與定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生態中的核心組件之一,專為微服務架構提供動態配置管理能力。它通過整合 Nacos 的配置中心功能,替代傳統的 Spring Cloud Config,提供更高效的配置集中化管理…

SonarQube數據庫配置

SonarQube部署完成后,在瀏覽器地址欄輸入http://IP:9000可以進入登錄頁面,以本機運行為例,地址為http://127.0.0.1:9000/,默認登錄名:admin,登錄密碼也是admin。登錄后會要求設置密碼: 按要求設…

醫藥檔案區塊鏈系統

1. 醫生用戶模塊?? ??目標用戶??:醫護人員 ??核心功能??: ??檢索檔案??:通過關鍵詞或篩選條件快速定位患者健康檔案。??請求授權??:向個人用戶發起檔案訪問權限申請,需經對方確認。??查看檔案?…

CSS3學習教程,從入門到精通, 化妝品網站 HTML5 + CSS3 完整項目(26)

化妝品網站 HTML5 CSS3 完整項目 下面是一個完整的化妝品網站項目,包含主頁、登錄頁面和注冊頁面。我將按照您的要求提供詳細的代碼和注釋。 1. 網站規劃與需求分析 需求分析 展示化妝品產品信息提供用戶注冊和登錄功能響應式設計,適配不同設備美觀…

ROS2 多機時間同步(Chrony配置簡明指南)

適用場景: 主機運行 ROS2 Humble(發布 /scan 等),板子運行 ROS2 Foxy(發布 /tf 等),兩邊通過 ROS_DOMAIN_ID 跨平臺通訊。需要保證系統時間對齊,避免 TF 插值失敗、建圖抖動等問題。…

Nginx配置偽靜態,URL重寫

Nginx配置偽靜態,URL重寫 [ Nginx ] 在Nginx低版本中,是不支持PATHINFO的,但是可以通過在Nginx.conf中配置轉發規則實現: location / { // …..省略部分代碼if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s/$1 l…

電路筆記(元器件):ADC LTC系列模數轉換器的輸出范圍+滿量程和偏移調整

LTC1740(LTC1740官方文檔)是Analog Devices(原Linear Technology)公司生產的一款高性能、低功耗的14位模數轉換器(ADC)。它通常用于需要高精度和快速采樣率的應用中,如通信系統、數據采集設備等。同類產品 LTC1746:一款14位、40Ms…

續-算法-數學知識

3、歐拉函數 1、定義: 1~n 中與 n 互質的數的個數 例如:6 的有 1 2 3 4 5 6 其中,與 n 互質 的 數的個數為 2個分別是:1、5 2、計算: $ N p_1^{a1} p_2^{a2} p_3^{a3} … p_k^{ak} $(例如&#x…

C/C++測試框架googletest使用示例

文章目錄 文檔編譯安裝示例參考文章 文檔 https://github.com/google/googletest https://google.github.io/googletest/ 編譯安裝 googletest是cmake項目,可以用cmake指令編譯 cmake -B build && cmake --build build將編譯產物lib和include 兩個文件夾…

LintCode第974題-求矩陣各節點的最短路徑(以0為標準)

描述 給定一個由0和1組成的矩陣,求每個單元格最近的0的距離。 兩個相鄰細胞之間的距離是1。 給定矩陣的元素數不超過10,000。 在給定的矩陣中至少有一個0。 單元格在四個方向上相鄰:上,下,左和右。 樣例 例1: 輸入: [[0,0,0],[0,0,0],[0…

Redis核心機制-緩存、分布式鎖

目錄 緩存 緩存更新策略 定期生成 實時生成 緩存問題 緩存預熱(Cache preheating) 緩存穿透(Cache penetration) 緩存雪崩(Cache avalanche) 緩存擊穿(Cache breakdown) 分…

CF每日5題(1300-1500)

最近急速補練藍橋杯中,疏于cf練習。 感覺自己過題還是太慢了。 今日水題,我水水水水。 1- 1979C lcm 水 1400 第 i i i局贏了,1個硬幣頂 k [ i ] k[i] k[i]個貢獻,所以每局分硬幣 x i 1 k [ i ] x_i{1\over k[i]} xi?k[i]1?個…

從代碼學習深度學習 - LSTM PyTorch版

文章目錄 前言一、數據加載與預處理1.1 代碼實現1.2 功能解析二、LSTM介紹2.1 LSTM原理2.2 模型定義代碼解析三、訓練與預測3.1 訓練邏輯代碼解析3.2 可視化工具功能解析功能結果總結前言 深度學習中的循環神經網絡(RNN)及其變種長短期記憶網絡(LSTM)在處理序列數據(如文…

easy-poi 一對多導出

1. 需求: 某一列上下兩行單元格A,B值一樣且這兩個單元格, 前面所有列對應單元格值一樣的話, 就對A,B 兩個單元格進行縱向合并單元格 1. 核心思路: 先對數據集的國家,省份,城市...... id 身份證進行排序…

AI比人腦更強,因為被植入思維模型【42】思維投影思維模型

giszz的理解:本質和外在。我們的行為舉止,都是我們的內心的表現。從外邊可以看內心,從內心可以判斷外在。曾國藩有7個識人的方法,大部分的人在他的面前如同沒穿衣服一樣。對于我們自身的啟迪,我認為有四點&…

Spring Boot 打印日志

1.通過slf4j包中的logger對象打印日志 Spring Boot內置了日志框架slf4j,在程序中調用slf4j來輸出日志 通過創建logger對象打印日志,Logger 對象是屬于 org.slf4j 包下的不要導錯包。 2.日志級別 日志級別從高到低依次為: FATAL:致命信息,表…

【IOS webview】源代碼映射錯誤,頁面卡住不動

報錯場景 safari頁面報源代碼映射錯誤,頁面卡住不動。 機型:IOS13 技術棧:react 其他IOS也會報錯,但不影響頁面顯示。 debug webpack配置不要GENERATE_SOURCEMAP。 解決方法: GENERATE_SOURCEMAPfalse react-app…

ES中經緯度查詢geo_point

0. ES版本 6.x版本 1. 創建索引 PUT /location {"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"location": {"properties": {"id": {"type": "keywor…