MySQL主從同步的原理與思考

摘要

分析主從同步出現的原因,MySQL實現主從同步的原理,思考實現原理的局限性和優點

背景

在實際應用中主從同步常用于實現備份、負載均衡和高可用。數據冗余的目的是提高數據的安全性,避免因磁盤損壞導致數據丟失的問題。讀寫分離的目的是減輕單臺主機的通信壓力,提高系統的吞吐量。一般業務中的讀操作要遠遠大于寫操作,使用主從同步將讀操作的請求量分散到多個從主機,使每臺從主機的壓力都變小。

原理

從整體上看MySQL實現主從同步主要有三個步驟:

  1. 在主庫上把數據更改記錄到二進制日志(Binary Log)中(這些記錄被稱為二進制日志事件)。
  2. 備庫將主庫上的日志復制到自己的中繼日志(Relay Log)中。
  3. 備庫讀取中繼日志中的事件,將其重放到備庫數據之上。
    在這里插入圖片描述

原理分析

保存數據更改事件

在每次準備提交事務完成數據更新前,主庫將數據更新的事件記錄到二進制日志中。MySQL會按事務提交的順序而非每條語句的執行順序來記錄二進制日志。在記錄二進制日志后,主庫會告訴存儲引擎可以提交事務了。
MySQL實現了兩種方式記錄數據的更新,分別是基于語句和基于行。基于語句就是記錄寫操作命令,基于行是記錄執行寫操作后受影響的行數據。這兩種方式都有利弊,實際情況推薦是兩種方式混合使用。

基于語句的方式

實現簡單,只需要按事務執行順序把對應的SQL語句記錄下來即可。但是對于一些特殊的SQL會無法同步到正確的數據,如SQL中用到了CURRENT_USER()等與當前環境相關的函數,在從節點重放SQL時可能會得到不一樣的數據。
如果正在使用觸發器或者存儲過程,就不要使用基于語句的復制模式,除非能夠清楚地確定不會碰到復制問題。

基于行的方式

將實際數據記錄在二進制日志中。這種方式最大的好處是可以正確地復制每一行。在一些場景下可能沒有基于語句高效。如更新所有用戶的狀態,基于語句的方式只需要記錄一條SQL語句,而基于行的方式則需要記錄所有更改的用戶數據。

兩種復制方式的比較
  1. 復制的準確性:
  • 基于行的復制幾乎可以準確無誤地復制所有數據變更,因為它記錄了每一行數據的變化,不受SQL語句的影響。這在處理復雜的SQL語句、存儲過程、觸發器和用戶定義函數時尤其重要,因為這些可能在不同的環境中產生不同的結果。
  • 基于語句的復制則可能在某些情況下無法準確復制,比如當復制環境與主庫環境不完全相同時,由于SQL語句在從庫上的執行可能產生不同的結果。
  1. 資源消耗:
  • 基于行的復制通常會占用更多的日志空間和網絡帶寬,因為它記錄了更多的數據。這在數據變更頻繁的場景中尤其明顯。
  • 基于語句的復制通常消耗較少的資源,因為它只記錄執行的SQL語句,這在數據變更較小或網絡帶寬受限的環境中可能是更好的選擇。
  1. 性能影響:
  • 基于行的復制在處理大量數據變更時可能會對主庫的性能產生更大影響,因為它需要記錄更多的信息。
  • 基于語句的復制在執行簡單的查詢和變更時,通常對性能的影響較小。
  1. 可追溯性和審計:
  • 基于行的復制提供了更好的可追溯性,因為可以明確看到哪些行數據發生了變化。
  • 基于語句的復制可能在追蹤具體數據變更時不夠直觀。
  1. 故障恢復:
  • 基于行的復制在故障恢復時可能更容易,因為可以明確知道哪些數據需要被恢復。
  • 基于語句的復制可能需要更復雜的故障恢復策略,尤其是當遇到無法正確執行的語句時。

在實際應用中,MySQL從5.1版本開始引入了混合復制模式(Mixed-Based Replication, MBR)。在這種模式下,MySQL默認嘗試使用SBR(基于語句的復制 [Statement-Based Replication]),但在檢測到SBR可能失敗的情況下自動切換到RBR(基于行的復制 [Row-Based Replication])。這種方式試圖平衡資源消耗和復制的準確性,是許多場景下的推薦選擇。

主節點與從節點同步數據

首先,備庫會啟動一個工作線程,稱為I/O線程,I/O線程跟主庫建立一個普通的客戶端連接,然后在主庫上啟動一個特殊的二進制轉儲(binlog dump)線程(該線程沒有對應的SQL命令),這個二進制轉儲線程會讀取主庫上二進制日志中的事件。它不會對事件進行輪詢。如果該線程追趕上了主庫,它將進入睡眠狀態,直到主庫發送信號量通知其有新的事件產生時才會被喚醒,備庫I/O線程會將接收到的事件記錄到中繼日志中。

重放SQL

從節點使用單獨的SQL線程重放SQL,線程從中繼日志中讀取事件并在備庫執行,從而實現備庫數據的更新。當SQL線程追趕上I/O線程時,中繼日志通常已經在系統緩存中,所以中繼日志的開銷很低。

這里是MySQL會經常出現主從延時的關鍵。因為MySQL主節點是在并發的接收寫操作,從節點是單線程方式的恢復數據,當寫操作并發高或者有寫操作執行慢的時候,就會出現主從延時。

思考

技術的發展是由業務推動的。MySQL最開始是沒有主從同步的功能的,隨著互聯網的發展,對數據冗余的需要和MySQL高性能的需求越來越強,主從同步概念也就出現了。

基于語句的復制(也稱為邏輯復制)早在MySQL 3.23版本中就存在,而基于行的復制方式在5.1版本中才被加進來。

主從同步的核心是數據同步。首先想到的應該是同步數據,只同步數據時在某些場景下,同步的代價會比較大。為了實現同步的功能,基于語句的優勢就體現出來了。

一項技術從想法到落地是一步步演進的,在演進的過程中會迭代很多次。很多現在用的框架、中間件等都是迭代了很多版本,所以有了想法先能落地是比較重要的,不能紙上談兵。

MySQL為什么只用一個SQL線程重發SQL語句?只有一個線程重放SQL,在很大程度上總會有延時的。這里我覺得不應該關注在主從延時上。主從同步從理論上說就不可能做到實時,理想情況下也會有幾十毫秒的延時。重點應該關注主從同步帶來的作用,它實現了數據冗余,提高MySQL的服務能力。

MySQL在5.6版本之后支持了并行復制,使用多條SQL線程重放SQL語句。現代服務器通常配備多核CPU和高帶寬網絡,單線程復制模型無法充分利用這些資源。高性能和低延時對于許多現代應用程序至關重要。并行復制能夠幫助數據庫架構更好地支撐實時數據分析、在線交易處理等高要求場景。

盡管單個SQL線程進行重放有以下幾點優勢:

  1. 數據一致性:
    單個SQL線程確保所有事件按照它們在主庫上的發生順序執行,這對于依賴于順序執行的事務非常重要,以維持數據的一致性。
  2. 事務完整性:
    單個SQL線程有助于保證事務的原子性和隔離性,確保從庫上的事務執行與主庫完全相同。
  3. 簡化故障恢復:
    使用單個SQL線程使得故障恢復更加簡單,因為不需要處理多個并發SQL線程可能引入的復雜性。
  4. 資源管理:
    單線程設計減少了資源爭用,如CPU、內存和磁盤I/O,從而降低了系統開銷。

但是軟件的發展要緊隨市場的腳步,否則就會被淘汰。

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

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

相關文章

ubuntu系統Docker常用命令

1.查看docker是否開機啟動 sudo systemctl list-unit-files | grep enable|grep docker 2.設置開機啟動 sudo systemctl enable docker 3.關閉docker開機啟動 sudo systemctl disable docker 4.開啟docker服務 sudo service docker start 5.關閉docker服務 sudo servi…

基于CNN的MINIST手寫數字識別項目代碼以及原理詳解

文章目錄 項目簡介項目下載地址項目開發軟件環境項目開發硬件環境前言一、數據加載的作用二、Pytorch進行數據加載所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加載項目需要使用的庫 三、加載MINIST數據集3.1 數據集簡介3.2 數據預處理3.3 加載數據集 四…

2.10、matlab中字符、數字、矩陣、字符串和元胞合并為字符串并將字符串以不同格式寫入讀出excel

1、前言 在 MATLAB 中,可以使用不同的數據類型(字符、數字、矩陣、字符串和元胞)合并為字符串,然后將字符串以不同格式寫入 Excel 文件。 以下是一個示例代碼,展示如何將不同數據類型合并為字符串,并以不…

重生奇跡mu魔法師瞬間移動技能

瞬間移動是勇士大陸魔法師所擁有的一項技能。一開始,許多玩家對這種技能的用處感到困惑。實際上,這種技能只能在游戲中不同的位置間進行移動,不能隨機傳送到地圖的其他坐標位置。 一位重生奇跡mu魔法師在PK中不小心使用了一項技能&#xff0c…

【仿真建模-anylogic】數據源組件

Author:趙志乾 Date:2024-07-16 Declaration:All Right Reserved!!! 1. 簡介 仿真模型依賴的數據源通常有Excel文件、MySQL數據庫兩種;針對小數量、大數據量以及是否允許外部依賴等場景設計了一…

labview使用斑馬打印機打印標簽

使用ZebraDesigner 3設計標簽樣式 設計完成后打印至文件,生成prn文件 用記事本打開prn文件 ^MMT 標簽撕下 ^MMP 標簽剝離 按照需求替換FD--------^FS中間內容

路由上傳一個ui_control參數(uint32類型)控制頁面UI顯隱

前言:傳一個uint32類型的值,通過 按位或操作符(|)來設置ui_control的值,通過按位與操作符(&)來檢測是否顯示或隱藏 簡單介紹一下兩個概念: 按位與操作符和按位或操作符都是二進…

etcd的備份與恢復

一 為什么使用etcd 與ZooKeeper相比,etcd更簡單,安裝、部署和使用更加容易,并且etcd的某些功能是ZooKeeper所沒有的。因此,在很多場景下,etcd 比ZooKeeper更受用戶的青,具體表現在如下幾個方面: 1 etcd更…

上海市計算機學會競賽平臺2022年10月月賽丙組門禁記錄

題目描述 小愛得到了某大樓一天內按時間順序記錄的𝑛n條門禁出入記錄,每條記錄由兩個字符串組成,第一個字符串為出入人員姓名,第二個字符串表示該人員進出狀態、為 enter 或 exit 中一項,其中 enter 為進入&#xff0…

鑫創SSS1700USB音頻橋芯片USB轉IIS芯片

鑫創SSS1700支持IIC初始外部編(EEPROM選項),兩線串行總線(I2C總線)用于外部MCU控制整個EEPROM空間可以通過MCU訪問用于主機控制同步的USB HID外部串行EEPROM(24C02~24C16)接口,用于客戶特定的USB視頻、PID、…

jmeter之變量隨機參數化以及解決多線程不會隨機變化

參考鏈接: https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函數多線程運行時數據不會隨機變化?_jmeter 線程組循環執行時 變量不變-CSDN博客 1、如下圖所示,需要對請求參數 autor 和phone進行隨機參數化 2、目前有…

MyBatis源碼中的設計模式2

組合模式的應用 組合模式介紹 組合模式(Composite Pattern) 的定義是:將對象組合成樹形結構以表示整體和部分的層次結構。組合模式可以讓用戶統一對待單個對象和對象的組合。 比如:Windows操作系統中的目錄結構,通過tree命令實現樹形結構展…

【系統架構設計師】十二、系統質量屬性與架構評估(開發期質量屬性|運行期質量屬性|面向架構評估的質量屬性|質量屬性效用樹|質量屬性場景)

目錄 一、軟件系統質量屬性 1.1 開發期質量屬性 1.2 運行期質量屬性 1.3 面向架構評估的質量屬性 1.4 質量屬性效用樹 1.5 質量屬性場景 1.5.1 可用性質量屬性場景描述 1.5.2 可修改性質量屬性場景描述 1.5.3 性能質量屬性場景描述 相關推薦 歷年真題練習 歷…

【vue】輸入框和文本域切換

輸入框的樣子 文本域的樣子 當輸入框出現滾動條的時候&#xff0c;就自動切換成文本域&#xff1b;當文本域到1行并且寬度小于輸入框寬度時切換成輸入框 <div class"left_box_inpt"><divclass"right_box_inpt":class"{notclickable: inputd…

OpenResty使用Lua筆記

文章目錄 一、基礎1、常用2、使用局部變量3、模塊化 二、性能提升1、使用fft調用shell2、不要在循環中拼接字符串3、不要頻繁修改table4、不要在table中用nil5、做好異常處理6、ngx.var 的性能提升 三、拓展1、加載字符串為動態方法 一、基礎 1、常用 OpenResty 中文官網&…

Open3D 最小二乘法擬合點云平面

目錄 一、概述 1.1最小二乘法原理 1.2實現步驟 1.3應用場景 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2matplotlib可視化 3.3平面擬合方程 前期試讀&#xff0c;后續會將博客加入該專欄&#xff0c;歡迎訂閱 Open3D點云算法與點云深度學習…

【學術會議征稿】第四屆人工智能、虛擬現實與可視化國際學術會議(AIVRV 2024)

第四屆人工智能、虛擬現實與可視化國際學術會議&#xff08;AIVRV 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 第四屆人工智能、虛擬現實與可視化國際學術會議&#xff08;AIVRV 2024&#xff09;將…

用python寫一個爬蟲,爬取google中關于蛇的照片

為了爬取Google中關于蛇的照片&#xff0c;我們可以利用Python中的第三方庫進行網頁解析和HTTP請求。請注意&#xff0c;這種爬取行為可能違反Google的使用條款&#xff0c;因此建議在合法和允許的情況下使用。以下是一個基本的Python爬蟲示例&#xff0c;使用Requests庫發送HT…

git 指令速查

1. 創建命令 Create Git 指令命令說明git clone 克隆遠程倉庫git init初始化本地 git 倉庫(即創建新的本地倉庫)2. 本地更改 Local Changes Git 指令命令說明git status查看當前分支狀態git diff查看已跟蹤文件的變更git add 將指定的文件添加到暫存區git add .將所有有變更的…

簡約唯美的404HTML源碼

源碼介紹 簡約唯美的404HTML源碼,很適合做網站錯誤頁,將下面的源碼放到一個空白的html里面,然后上傳到服務器里面即可使用 效果預覽 完整源碼 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…