mysql主從複製原理探索

来源:http://www.cnblogs.com/hoohack/archive/2017/07/11/7149234.html
-Advertisement-
Play Games

經歷過一次mysql主從延遲之後,就開始思考,主從複製是什麼東西?它是怎麼實現的呢?它的原理是什麼?於是乎就開始查閱資料、文章,現將自己理解到的內容總結在此,加深印象。 ...


上一篇文章裡面,講到了遇到mysql主從延遲的坑,對於這次的坑多說兩句,以前也看過這樣的例子,也知道不能夠寫完之後馬上更新,但是真正開發的時候還是沒有註意到這一點,道理大家都懂,但是還是會犯錯,只有等到自己親生體驗到該錯誤之後,才真正的掌握到該道理。

經歷過一次mysql主從延遲之後,就開始思考,主從複製是什麼東西?它是怎麼實現的呢?它的原理是什麼?於是乎就開始查閱資料、文章,現將自己理解到的內容總結在此,加深印象。

為什麼要做主從複製?

1、在業務複雜的系統中,有這麼一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那麼就很影響運行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。

2、做數據的熱備

3、架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁碟I/O訪問的頻率,提高單個機器的I/O性能。

mysql主從複製的原理是什麼?

binlog: binary log,主庫中保存所有更新事件日誌的二進位文件。

主從複製的基礎是主庫記錄資料庫的所有變更記錄到binlog。binlog是資料庫伺服器啟動的那一刻起,保存所有修改資料庫結構或內容的一個文件。

mysql主從複製是一個非同步的複製過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。

在主庫里,只要有更新事件出現,就會被依次地寫入到binlog裡面,之後會推到從庫中作為從庫進行複製的數據源。

binlog輸出線程。每當有從庫連接到主庫的時候,主庫都會創建一個線程然後發送binlog內容到從庫。
對於每一個即將發送給從庫的sql事件,binlog輸出線程會將其鎖住。一旦該事件被線程讀取完之後,該鎖會被釋放,即使在該事件完全發送到從庫的時候,該鎖也會被釋放。

在從庫里,當複製開始的時候,從庫就會創建兩個線程進行處理:

從庫I/O線程。當START SLAVE語句在從庫開始執行之後,從庫創建一個I/O線程,該線程連接到主庫並請求主庫發送binlog裡面的更新記錄到從庫上。
從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。

從庫的SQL線程。從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。

可以知道,對於每一個主從複製的連接,都有三個線程。擁有多個從庫的主庫為每一個連接到主庫的從庫創建一個binlog輸出線程,每一個從庫都有它自己的I/O線程和SQL線程。

從庫通過創建兩個獨立的線程,使得在進行複製時,從庫的讀和寫進行了分離。因此,即使負責執行的線程運行較慢,負責讀取更新語句的線程並不會因此變得緩慢。比如說,如果從庫有一段時間沒運行了,當它在此啟動的時候,儘管它的SQL線程執行比較慢,它的I/O線程可以快速地從主庫里讀取所有的binlog內容。這樣一來,即使從庫在SQL線程執行完所有讀取到的語句前停止運行了,I/O線程也至少完全讀取了所有的內容,並將其安全地備份在從庫本地的relay log,隨時準備在從庫下一次啟動的時候執行語句。

查看主從複製的狀態

當主從複製正在進行中時,如果想查看從庫兩個線程運行狀態,可以通過執行在從庫里執行”show slave status\G”語句,以下的欄位可以給你想要的信息:

Master_Log_File — 上一個從主庫拷貝過來的binlog文件
Read_Master_Log_Pos — 主庫的binlog文件被拷貝到從庫的relay log中的位置
Relay_Master_Log_File — SQL線程當前處理中的relay log文件
Exec_Master_Log_Pos — 當前binlog文件正在被執行的語句的位置

整個主從複製的流程可以通過以下圖示理解:

DB Replication

  • 步驟一:主庫db的更新事件(update、insert、delete)被寫到binlog
  • 步驟二:從庫發起連接,連接到主庫
  • 步驟三:此時主庫創建一個binlog dump thread,把binlog的內容發送到從庫
  • 步驟四:從庫啟動之後,創建一個I/O線程,讀取主庫傳過來的binlog內容並寫入到relay log
  • 步驟五:還會創建一個SQL線程,從relay log裡面讀取內容,從Exec_Master_Log_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db
註:上面的解釋是解釋每一步做了什麼,整個mysql主從複製是非同步的,不是按照上面的步驟執行的。

其他

關於主從複製架構的搭建,可以參考網上更多的文檔,文筆有限,不做更多的介紹。

作為一名開發,這些基礎的mysql知識還是需要多多學習。

參考資料

What is MySQL Replication and How Does It Work?

Replication Implementation Details

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

如果本文對你有幫助,請點下推薦吧,謝謝^_^

更多精彩內容,請關註個人公眾號。


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

-Advertisement-
Play Games
更多相關文章
  • 在資料庫中存的就是一張張有著千絲萬縷關係的表,所以表設計的好壞,將直接影響著整個資料庫。而在設計表的時候,我們都會關註一個問題,使用什麼存儲引擎。等一下,存儲引擎?什麼是存儲引擎? 什麼是存儲引擎? 關係資料庫表是用於存儲和組織信息的數據結構,可以將表理解為由行和列組成的表格,類似於Excel的電子 ...
  • 2017-07-11 15:57:53 1.查詢表名中的所有數據SELECT * FROM 表名; 2.插入數據 INSERT INTO 表名 VALUES(1,' ',..); //varchar > ' ' //插入的必須是全部元素 INSERT INTO 表名(ID,NAME) VALUES( ...
  • 常見的欄位類型選擇 1.字元類型建議採用varchar/nvarchar數據類型 2.金額貨幣建議採用money數據類型 3.科學計數建議採用numeric數據類型 4.自增長標識建議採用bigint數據類型 (數據量一大,用int類型就裝不下,那以後改造就麻煩了) 5.時間類型建議採用為datet ...
  • 2017-07-11 12:47:30 展示:show 創建:create 刪除:drop 修改: alter table 表中添加列:add 表中刪除列:drop 表中修改列類型: modify 表中修改列名: change 修改表名:rename 1.查詢當前連接下的資料庫SHOW DATABA ...
  • 資料庫索引是為了增加查詢速度而對錶欄位附加的一種標識。很多人機械的理解索引的概念,認為增加索引只有好處沒有壞處。其實遠不是那樣的,這裡將其介紹儘量詳細些。 首先明白為什麼索引會增加速度,DB在執行一條Sql語句的時候,預設的方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們對 ...
  • 前陣子遇到一個案例,需要將資料庫中的幾個表從USER A 移動到USER B下麵,在ORACLE中,這個叫做更改表的所有者或者修改表的Schema。其實遇到這種案例,有好幾種解決方法。下麵我們通過實驗來測試、驗證一下。首先準備簡單測試數據,如下所示: SQL> CREATE TABLE TEST.K... ...
  • 第一次寫事件調用存儲過程,在網上找了一些資料,特此做下總結,鞏固一下: 事件調用存儲過程主要有三種: (1)創建事件馬上執行,調用存儲過程 CREATE EVENT if not exists Event_Stat_Daily on schedule EVERY 1 DAY on completio ...
  • 環境為centos 7.2+mysql 5.7,網上教程很多,原理也不複雜(深知自己踩的坑還不夠) 正常情況下,配置起來比較簡單。另外,根據個人感受,MySQL的複製感覺要比SQL Server的複製要清爽很多(儘管功能上可能有一些差異)。 master伺服器,首先是開啟了二進位日誌,同時設置ser ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...