Mysql系列-Binlog主從同步

原文鏈接:https://zhuanlan.zhihu.com/p/669450627

一、主從同步概述

mysql主從同步,即MySQL Replication,可以實現將數據從一臺數據庫服務器同步到多臺數據庫服務器。MySQL數據庫自帶主
從同步功能,經過配置,可以實現基于庫、表結構的多種方案的主從同步。可以對MySQL做主從架構并且進行讀寫分離,讓主服務器(Master)處理寫請求,從服務器(Slave)處理讀請求,這樣可以
進一步提升數據庫的并發處理能力,如下圖所示:

二、主從同步作用

一般來說,優先考慮優化sql及索引等,充分發揮數據庫的最大性能;其次是采用緩存的策略,比如使用redis、magodb
等緩存工具,通過其高性能的優勢把數據保存在內存數據庫中,提升讀取的效率,最后才是采取數據庫主從架構,進行讀寫分
離(因為成本高)。

2.1 讀寫分離

通過主從復制的方式來同步數據,之后通過讀寫分離的方法提升數據庫并發處理能力。簡單來說就是數據放在多個數據庫中,其中一
個是Master主庫,其余的是Slave從庫。當主數據庫數據發生變化時,會自動將數據同步到從數據庫中,程序可以設置去從庫
讀取數據,從而實現讀寫分離

2.2 數據備份

主從同步屬于數據熱備份機制,在主庫正常運行下備份,不影響提供查詢服務。

2.3 高可用性

數據備份其實是冗余的機制,通過冗余的方式可以換取數據庫的高可用性,當服務器出現故障、宕機等無可用的情況下,可
以迅速進行故障切換,讓從庫當主庫,保證服務正常運行。

三、主從同步原理

3.1 主從同步流程圖

3.2 主從同步執行流程

1、從庫不斷試探主庫的二進制日志文件(binlog),如果這個文件有更新則發送請求從主庫獲取新的內容;
2、用戶向主庫中寫數據:包括添加、刪除、修改、建庫建表等操作;
3、主庫將寫的命令記錄到二進制文件并更新二進制文件的偏移量;
4、從庫試探主庫二進制文件發現偏移量與從庫中記錄的偏移量值不一樣時表示主庫有更新,那么啟動IO線程向主庫請求從某個偏移量開始到二進制日志文件結束位置之間所有的數據;
5、主庫根據從庫請求,通過binlog dump線程將新偏移量推送到從庫中;
6、從庫獲取主庫的數據后,會將這些命令數據寫入中繼日志文件(relaylog)中,然后喚醒SQL線程同時讓當前的IO線程掛起(休眠等待);
7、SQL線程根據記錄的中繼日志文件的偏移量讀取中繼日志文件中的命令;
8、SQL線程獲取到命令后在本地數據庫進行回放(就是從庫中執行主庫的SQL語句),回放完成當前SQL線程掛機(休眠等待)。

3.3?主從同步線程

msyql 的主從同步通過3個線程完成,其中1個線程在主庫,2個線程在從庫上。

如果一個主庫連接多個從庫,那么主庫將會給每個處于連接狀態的從庫創建一個Binary log dump線程,每個從庫也有自己的同步I/O以及SQL線程。

3.3.1 Binary log dump 線程

當從庫連上主庫時,主庫會創建一個線程來發送 binlog 的內容給從庫。

在數據庫終端執行sql: SHOW PROCESSLIST , 可以看到 Binlog Dump 線程。

binlog dump 線程在binlog中讀取要發送給從庫的數據時,會對binlog加鎖。一旦數據讀取完成,線程將釋放鎖,即使數據還未發送到從庫。

3.3.2?IO 線程

當在從庫上執行sql: START SLAVE ,從庫將創建一個I/O線程。該線程將連接主庫,并請求主庫發送binlog中更新的記錄給從庫。

主庫的Binlog Dump線程,將更新的binlog發送到從庫,從庫的 I/O線程將這些更新入從庫的relay log。

在從庫中執行sql: SHOW SLAVE STATUS, 能夠看到 Slave_IO_running 的狀態。

3.3.3?IO 線程

從庫創建同步SQL線程來讀取 relay log,并執行其中的事務。

一個從庫使用2個線程將從主庫讀取更新以及在從庫執行數據更新分成獨立的任務。因此,從主庫讀取更新的任務不會減慢,即使從庫執行數據更新任務很慢。例如,如果從庫停止運行一段時間后再啟動從庫,從庫的 I/O線程能夠快速獲從主庫取到所有的binlog,即使 SQL 線程滯后。如果從庫在 SQL線程執行所有更新前停止運行, I/O 線程至少獲取到了一份安全的更新binlog并保存到從庫的relay log, 當下次啟動從庫后就可能執行數據更新。

在從庫上通過設置系統變量 slave_parallel_workers 的值大于0(默認值),可以開啟并行處理任務。當該變量設置了,從庫設置創建設置的數量的worker 線程,以及一個協調線程來管理worker 線程。如果你在使用多從庫通道,每個通道都將有這么多線程。slave_parallel_workers大于0從庫一般被稱為多線程從庫(副本)。一旦這么設置,失敗的事務將會被重試。

3.4?Relay log與從庫元數據存儲

從庫(副本)也會記錄從庫(源庫)的binlog的當前位置以及從庫的relay log。

在同步過程中,一個從庫創建多個信息庫。

3.4.1 relay log

該log有 I/O線程寫入,log中的事務來自主庫的binlog,并且將被 SQL線程執行更新到從庫。

3.4.2 從庫連接元數據存儲

包含了從庫I/O線程連接主庫需要的信息,以及從主庫binlog中檢索事務需要的信息。連接元數據存儲被寫進表mysql.slave_master_info或者一個文件中。

3.4.3 從庫的應用程序元數據存儲

包含了從庫SQL線程從relay log讀取事務以及將事務更新到從庫的信息。從庫的應用程序元數據存儲被寫進表mysql.slave_relay_log_info 或者 一個文件中。

從庫連接元數據存儲與從庫的應用程序元數據存儲被統稱為從庫元數據存儲,可以參考更多相關說明

使從庫能夠靈活應對宕機: 事務性存儲引擎InnoDB創建表mysql.slave_master_info 與 表mysql.slave_relay_log_info。從庫的應用程序元數據存儲表更新將與事務一起提交, 也就是記錄在元數據存儲中的從庫進度信息一直與從庫的更新保持一致,即使從庫宕機。

四、解決主從數據一致性

4.1 全同步復制

全同步復制,就是當主庫執行完一個事務之后,要求所有的從庫也都執行完該事物,才可以返回處理結果給客戶端;因此,雖然
全同步復制數據一致性得到保證了,但是主庫完成一個事務需要等待所有從庫完成,性能難免會降低。

4.2 異步復制

異步復制,就是當主庫提交事物后,會通知binlog dump線程發送binlog 日志給從庫,一旦binlog dump線程將binlog 日志
發送給從庫之后,不需要等到從庫也同步完成事物,主庫就會將處理結果返回給客戶端。
主庫只管自己完成事物,就將處理結果返回給客戶端(此時從庫不一定完成同步事物),可能導致主從數據不一致問題,比如剛在
主庫新增的數據,馬上去從庫查詢就可能查詢不到。而且當主庫提交完事物后,如果宕機了,可能會導致binlog 日志未同步給從庫,
同時為了回復故障切換主從節點的話,就會出現數據丟失問題。因此,雖然異步復制性能高,但是數據一致性是最弱的。
mysql主從復制,默認采用的就是異步復制這種復制策略。

4.3 半同步復制

mysql5.5 版本后開始支持半同步復制方式。原理就是在客戶端提交commit之后不直接將結果返回客戶端,而是至少等待至少有一個從
庫收到binlog ,并且寫到中繼日志之后再返回給客戶端。優點:提高數據一致性。缺點:降低主庫寫的效率。
mysql5.7 版本中增加了一個rpl_semi_sync_master_wait_for_slave_count參數,可以根據需要響應的從庫數據庫數量
設置,默認為1,也就是一個從庫有了響應,就返回給客戶端。如果這個參數調大,就可以提高數據一致性。

4.4 增強半同步復制

增強半同步復制,是mysql 5.7.2后的版本對半同步復制做的一個改進,原理上幾乎是一樣的,主要是解決幻讀的問題。
主庫配置了參數 rpl_semi_sync_master_wait_point = AFTER_SYNC 后,主庫在存儲引擎提交事務前,必須先收到從庫數據
同步完成的確認信息后,才能提交事務,以此來解決幻讀問題

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

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

相關文章

B端設計:任何不顧及用戶體驗的設計,都是在裝樣子,花架子

B端設計是指面向企業客戶的設計,通常涉及產品、服務或系統的界面和功能設計。與C端設計不同,B端設計更注重實用性和專業性,因為它直接影響企業的效率和利益。 在B端設計中,用戶體驗同樣至關重要。不顧及用戶體驗的設計只是空洞的表…

數據庫之索引(二)

目錄 一、如何判斷數據庫的索引是否生效 二、如何評估索引創建的是否合理 三、索引是否越多越好 四、如何處理數據庫索引失效 五、是否所有的字段都適合創建索引 一、如何判斷數據庫的索引是否生效 可以使用EXPLAIN語句查看索引是否正在使用。 例如,假設已經創…

70.Bug:使用list.sort(Comparator.Comping(User::getCreateTime).reverse())空指針異常

1.出錯原因&#xff1a;在xml中沒有做字段映射 報錯語句復現&#xff1a; List<User> listnew ArrayList<>()&#xff1b; xml中進行查詢數據&#xff0c;數據存放在list中........... //排序 list.sort(Comparator.Comping(User::getCreateTime).reverse())&…

經典的layui框架,還有人用嗎?令人惋惜。

自從layui官網宣布關閉之后&#xff0c;layui框架的用戶飛速下滑&#xff0c;以至于到現在貝格前端工場承接的項目中&#xff0c;鮮有要求使用layui框架的&#xff0c;那么個框架還有人用嗎&#xff1f; 一、layui沒落是不是jquery惹的禍 layui的沒落與jQuery無關。layui框架…

Hi3861 OpenHarmony嵌入式應用入門--UDP Server

本篇使用的是lwip編寫udp服務端。需要提前準備好一個PARAM_HOTSPOT_SSID宏定義的熱點&#xff0c;并且密碼為PARAM_HOTSPOT_PSK。 修改網絡參數 在Hi3861開發板上運行上述四個測試程序之前&#xff0c;需要根據你的無線路由、Linux系統IP修改 net_params.h文件的相關代碼&…

深入理解 Docker 容器技術

一、引言 在當今的云計算和軟件開發領域&#xff0c;Docker 容器技術已經成為了一項不可或缺的工具。它極大地改變了應用程序的部署和運行方式&#xff0c;為開發者和運維人員帶來了諸多便利。 二、Docker 容器是什么&#xff1f; Docker 容器是一種輕量級、可移植、自包含的…

起底:Three.js和Cesium.js,二者異同點,好比全科和專科.

Three.js和Cesium.js是兩個常用的webGL引擎&#xff0c;很多小伙伴容易把它們搞混淆了&#xff0c;今天威斯數據來詳細介紹一下&#xff0c;他們的起源、不同點和共同點&#xff0c;閱讀后你就發現二者就像全科醫院和專科醫院的關系&#xff0c;很好識別。 一、二者的起源 Th…

性能測試相關理解---性能測試流程(二)

六、性能測試流程&#xff08;如何做性能測試&#xff1f;) 根據學習全棧測試博主的課程做的筆記 1、前期準備– 項目初期就開始&#xff0c;業務需求評審時盡量參與,對業務更深刻的認識&#xff08;確定哪些是核心業務、哪些可能存在并發請求、確定什么地方會出現瓶頸,方便后…

WebOffice在線編微軟Offfice,并以二進制流的形式打開Word文檔

在日常辦公場景中&#xff0c;我們經常會遇到這種場景&#xff1a;我們的合同管理系統的各種Word,excel,ppt數據都是以二進制數組的形式存儲在數據庫中&#xff0c;如何從數據庫中讀取二進制數據&#xff0c;以二進制數據作為參數&#xff0c;然后加載到瀏覽器的Office窗口&…

【無標題】地平線2西之絕境/Horizon Forbidden West? Complete Edition(更新:V1.3.57)

游戲介紹 與埃洛伊同行&#xff0c;在危險壯美的邊疆之地揭開種種未知的神秘威脅。此完整版可完整享受廣受好評的《地平線 西之絕境?》內容和額外內容&#xff0c;包括在主線游戲后展開的后續故事“炙炎海岸”。 重返《地平線》中遙遠未來的后末日世界&#xff0c;探索遠方的土…

Twitter群發消息API接口的功能?如何配置?

Twitter群發消息API接口怎么申請&#xff1f;如何使用API接口&#xff1f; 為了方便企業和開發者有效地與用戶互動&#xff0c;Twitter提供了各種API接口&#xff0c;其中Twitter群發消息API接口尤為重要。AokSend將詳細介紹Twitter群發消息API接口的功能及其應用場景。 Twit…

html+css+js貪吃蛇游戲

貪吃蛇游戲&#x1f579;四個按鈕控制方向&#x1f3ae; 源代碼在圖片后面 點贊??關注&#x1f64f;收藏?? 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代碼&#x1f4df; <!DOCTYPE html> <html lang"en"&…

15jQuery引入

【一】什么是jQuery jQuery是一個輕量級的、兼容多瀏覽器的JavaScript庫。jQuery內部封裝了原生的js代碼&#xff0c;提高編寫效率 【二】jQuery引入配置 1.● 代碼復制下來放到自己建的txt中&#xff0c;然后把他移入pycharm項目中重構成js文件(注意&#xff1a;只能在當前…

win10使用小技巧三

1. 添加照片查看器支持 目的&#xff1a;為Windows 10添加對特定圖片格式&#xff08;如JPG&#xff09;的支持&#xff0c;使用Windows照片查看器。步驟&#xff1a; 使用WinR打開運行窗口。輸入regedit&#xff0c;點擊確定進入注冊表編輯器。導航至HKEY_CURRENT_MACHINE\SO…

tomcat原理、結構、設計模式

1 what 一種web服務器&#xff0c;運行java servlet、jsp技術&#xff0c;能為java web提供運行環境并通過http協議處理客戶端請求。即tomcat http服務器 servlet容器。同類產品有jetty Web應用&#xff1a;Web應用是指通過Web瀏覽器訪問的應用程序&#xff0c;它使用Web技術…

平臺穩定性里程碑 | Android 15 Beta 3 已發布

作者 / 產品管理副總裁、Android 開發者 Matthew McCullough 從近期發布的 Beta 3 開始&#xff0c;Android 15 達成了平臺穩定性里程碑版本&#xff0c;這意味著開發者 API 和所有面向應用的行為都已是最終版本&#xff0c;您可以查閱它們并將其集成到您的應用中&#xff0c;并…

HTML 標簽列表(功能排序)

HTML 標簽列表(功能排序) HTML(超文本標記語言)是構建網頁的標準語言,它定義了網頁的結構和內容。HTML包含眾多標簽,每個標簽都有其特定的功能和用途。本文將按照功能對HTML標簽進行分類和排序,以幫助您更好地理解和使用這些標簽。 基礎結構標簽 <!DOCTYPE html>…

使用Node.js 框架( Express.js)來創建一個簡單的 API 端點

文章目錄 使用Node.js 框架&#xff08; Express.js&#xff09;來創建一個簡單的 API 端點什么是express安裝修改代碼 express 自動刷新 使用Node.js 框架&#xff08; Express.js&#xff09;來創建一個簡單的 API 端點 什么是express Express 是一個保持最小規模的靈活的 …

系統架構設計師——計算機體系結構

分值占比3-4分 計算機硬件組成 計算機硬件組成主要包括主機、存儲器和輸入/輸出設備。 主機&#xff1a;主機是計算機的核心部分&#xff0c;包括運算器、控制器、主存等組件。運算器負責執行算術和邏輯運算&#xff1b;控制器負責協調和控制計算機的各個部件&#xff1b;主存…

如何看自己電腦的ip地址?這些方法教你搞定

在數字化時代&#xff0c;網絡已經成為我們生活中不可或缺的一部分。對于每一個接入網絡的設備來說&#xff0c;IP地址就像是一個獨特的身份證&#xff0c;它標識著設備在網絡中的位置。對于電腦用戶而言&#xff0c;了解如何查看自己電腦的IP地址&#xff0c;不僅有助于我們更…