目錄
5.3 半同步複製
5.4 增強半同步複製
首頁 資料庫 mysql教程 一文徹底搞懂MySql主從同步

一文徹底搞懂MySql主從同步

Mar 01, 2023 pm 04:59 PM
mysql 資料庫

這篇文章為大家帶來了關於MySql的相關知識,其中主要給大家介紹MySQL的主從同步及其作用原理等等,有興趣的朋友下面一起來看一下吧,歡迎大家收藏學習!

1 引言

大家好,Mysql是大家最常用的資料庫,以下為大家帶來mysql主從同步知識點的分享,以便鞏固mysql基礎知識,如有錯誤,還請各位大佬們指正。

2 MySql主從同步概述

MySQL主從同步,也就是MySQL Replication,可以實作將資料從一台資料庫伺服器同步到多台資料庫伺服器。 MySQL資料庫自備主從同步功能,經過配置,可實現基於函式庫、表格結構的多種方案的主從同步。

Redis是一種高效能的記憶體資料庫,但不是今天的主角;MySQL是基於磁碟檔案的關係型資料庫,相較於Redis來說,讀取速度會慢一些,但是功能強大,可以用於儲存持久化的資料。在實際工作中,我們常將Redis作為快取與MySQL配合來使用,當有資料存取請求的時候,首先會從快取中進行查找,如果存在就直接取出,如果不存在再存取資料庫,這樣就提升了讀取的效率,也減少了後端資料庫的存取壓力。使用Redis這種快取架構是高並發架構中非常重要的一環。

隨著業務量的不斷成長,資料庫的壓力會不斷變大,快取的頻繁變更也強烈依賴資料的查詢結果,導致資料查詢效率低,負載很高,連線過多等問題。對於電商場景來說,往往存在著許多典型的讀多寫少場景,我們可以對MySQL做主從架構並且進行讀寫分離,讓主伺服器(Master)處理寫入請求,從伺服器(Slave)處理讀取請求,這樣可以進一步提升資料庫的並發處理能力。如下圖:

上圖中,可以看到,我們增加了2個從函式庫,這2個從函式庫可以一起抗下大量的讀取請求,分擔主庫壓力。從庫會透過主從複製,從主庫中不斷的同步數據,以此來確保從庫的數據和主庫數據的一致。

接下來,我們來看看主從同步有哪些作用,以及主從同步具體是怎麼實現的。

3 主從同步的作用

一般來說,不是所有的系統都需要對資料庫進行主從架構的設計,因為架構本身就是有一定成本的,如果我們的目的在於提升資料庫高並發存取的效率,那麼我們首先應該優化SQL語句及索引,充分發揮資料庫的最大效能;其次是採用快取的策略,如使用Redis、MongoDB等快取工具,透過其高效能的優勢把資料保存在記憶體資料庫中,提升讀取的效率,最後才是對資料庫採用主從架構,進行讀寫分離。系統的使用和維護成本是根據架構的升級逐漸升高的。

言歸正傳,主從同步不僅可以提升資料庫的吞吐量,還有以下三個面向的功能:

3.1 讀寫分離

我們可以透過主從複製的方式來同步數據,然後透過讀寫分離來提升資料庫的同時處理能力。簡單來說就是我們的資料被放在了多個資料庫中,其中一個是Master主函式庫,其餘的就是Slave從函式庫。當主庫數據變化時,會自動將數據同步到從庫中,而我們程式可以從從庫讀取數據,也就是採用讀寫分離的方式。電商的應用往往是“讀多寫少”,採用讀寫分離就實現了更高的並發訪問。原本所有的讀寫壓力都由一台伺服器承擔,現在有多個伺服器共同處理讀取請求,減少了對主函式庫的壓力。另外還可以對從伺服器進行負載平衡,讓不同的讀取請求依照策略均勻的分配到不同的從伺服器中,讓讀取更加順暢。讀取順暢的另一個原因,就是減少了鎖表的影響,例如我們讓主庫負責寫,當主庫出現寫鎖的時候,不會影響到從庫的查詢操作。

3.2 資料備份

主從同步也相當於是一種資料熱備份機制,在主庫正常運作下進行備份,不影響提供資料服務。

3.3 高可用性

資料備份實際上是一種冗餘的機制,透過這種冗餘的方式可以換取資料庫的高可用性,當伺服器發生故障、當機等無可用的情況下,可以快速進行故障切換,讓從庫充當主庫,保障服務正常運作。大家可以了解下電商系統資料庫高可用SLA指標。

4 主從同步的原則

說到主從同步的原理,我們就需要了解在資料庫中的一個重要日誌文件,就是Binlog二進位文件,它記錄了對資料庫進行更新的事件,事實上主從同步的原理就是基於Binlog進行資料同步的。

在主從複製的過程中,會基於三個線程來操作,一個是binlog dump線程,位於master節點上,另外兩個線程分別是I/O線程和SQL線程,它們都分別位於slave節點上,如下圖:

結合以上圖片,我們一起來了解主從複製的核心流程:

  • 當master節點接收到一個寫請求時,這個寫請求可能是增刪改操作,此時會把寫請求的更新操作都記錄到binlog日誌中。

  • master節點會把資料複製給slave節點,如圖中的slave01節點和slave02節點,這個過程,首先得要每個slave節點連接到master節點上,當slave當節點連接到master節點上時,master節點會為每個slave節點分別建立一個binlog dump線程,用於向各個slave節點發送binlog日誌。

  • binlog dump執行緒會讀取master節點上的binlog日誌,然後將binlog日誌傳送給slave節點上的I/O執行緒。當主庫讀取事件的時候,會在Binglog上加鎖,讀取完成之後,再將鎖釋放掉。

  • slave節點上的I/O執行緒接收到binlog日誌後,會將binlog日誌先寫入本地的relaylog中,relaylog中就保存了binlog日誌。

  • slave節點上的SQL線程,會來讀取relaylog中的binlog日誌,將其解析成具體的增刪改操作,把這些在master節點上進行過的操作,重新在slave節點上也重做一遍,達到資料還原的效果,這樣就可以保證master節點和slave節點的資料一致性了。

主從同步的資料內容其實是二進位日誌(Binlog),它雖然叫二進位日誌,實際上儲存的是一個又一個的事件(Event),這些事件分別對應著資料庫的更新操作,例如INSERT、UPDATE、DELETE等。

另外我們還要注意的是,不是所有版本的MySQL都預設開啟了伺服器的二進位日誌,在進行主從同步的時候,我們需要先檢查伺服器是否已經開啟了二進位日誌。

二進位日誌,它是一個文件,在進行網路傳輸的過程中就一定會存在一些延遲,例如200ms,這樣就可能造成用戶在從庫上讀取的數據不是最新的數據,也就會造成主從同步中的資料不一致的情況發生。例如我們對一筆記錄進行更新,這個操作是在主庫上完成的,而在很短的時間內,比如100ms,又對同一個記錄進行讀取,這時候從庫還沒有完成數據的同步,那麼,我們透過從庫讀取到的資料就是一條舊的資料。這種情況該怎麼辦呢?

5 如何解決主從同步的資料一致性問題

可以想像下,如果我們想要操作的資料都儲存在同一個資料庫中,那麼對資料進行更新的時候,可以對記錄進行加寫鎖,這樣在讀取的時候就不會發生資料不一致的情況了。但這時從函式庫的作用就是備份數據,沒有做到讀寫分離,分擔主庫的壓力。

因此我們還需要想辦法,在進行讀寫分離的時候,解決主從同步中資料不一致的問題,也就是解決主從之間資料複製方式的問題,如果按照資料一致性從弱到強來進行劃分,有以下三種複製方式。

5.1 全同步複製

首先,全同步複製,就是當主庫執行完一個事務之後,要求所有的從庫也都必須執行完該事務,才可以返回處理結果給客戶端;因此,雖然全同步複製資料一致性得到保證了,但是主庫完成一個事物需要等待所有從庫也完成,性能就比較低了。如下圖:

5.2 非同步複製

而非同步複製,就是當主函式庫提交事物後,會通知binlog dump執行緒發送binlog日誌給從函式庫,一旦binlog dump執行緒將binlog日誌傳送給從函式庫之後,不需要等到從函式庫也同步完成事務,主函式庫就會將處理結果傳回給客戶端。

因為主函式庫只管自己執行完事務,就可以將處理結果傳回給客戶端,而不用關心從函式庫是否執行完事務,這就可能導致短暫的主從資料不一致的問題了,例如剛在主庫插入的新數據,如果馬上在從庫查詢,就可能查詢不到。

而且,當主庫提交事物後,如果宕機掛掉了,此時可能binlog還沒來得及同步給從庫,這時候如果為了恢復故障切換主從節點的話,就會出現數據丟失的問題,所以異步複製雖然效能高,但資料一致性上是最弱的。

mysql主從複製,預設採用的就是非同步複製這種複製策略。

5.3 半同步複製

MySQL5.5版本之後開始支援半同步複製的方式。原理是在客戶端提交COMMIT之後不直接將結果傳回給客戶端,而是等待至少有一個從庫收到了Binlog,並且寫入到中繼日誌中,再傳回給客戶端。這樣做的好處就是提高了資料的一致性,當然相較於非同步複製來說,至少多增加了一個網路連線的延遲,降低了主庫寫的效率。

在MySQL5.7版本中也增加了一個rpl_semi_sync_master_wait_for_slave_count參數,我們可以對需要回應的從函式庫數量進行設置,預設為1,也就是說只要有一個從函式庫進行了回應,就可以傳回給客戶端。如果將這個參數調大,可以提升資料一致性的強度,但也會增加主庫等待從庫回應的時間。

但是,半同步複製也存在以下幾個問題:

  • 半同步複製的效能,相較於非同步複製而言有所下降,相較於非同步複製是不需要等待任何從庫是否接收到資料的回應,而半同步複製則需要等待至少一個從庫確認接收到binlog日誌的回應,效能上是損耗較大的。
  • 主庫等待從庫回應的最大時長是可以配置的,如果超過了配置的時間,半同步複製就會變成異步複製,那麼,異步複製的問題同樣也就會出現了。
  • 在MySQL 5.7.2之前的版本中,半同步複製存在著幻讀問題的。

當主庫成功提交事物並處於等待從庫確認的過程中,這個時候,從庫都還來不及返回處理結果給客戶端,但因為主庫存儲引擎內部已經提交事務了,所以,其他客戶端是可以到從主庫讀到資料的。

但是,如果下一秒主庫突然掛了,此時正好下一次請求過來,因為主庫掛了,就只能把請求切換到從庫中,因為從庫還沒從主庫同步完數據,所以,從庫中當然就讀不到這條數據了,和上一秒讀取數據的結果對比,就造成了幻讀的現象了。

5.4 增強半同步複製

增強半同步複製,是mysql 5.7.2後的版本對半同步複製做的一個改進,原理上幾乎是一樣的,主要是解決幻讀的問題。

主庫配置了參數rpl_semi_sync_master_wait_point = AFTER_SYNC 後,主庫在儲存引擎提交事務前,必須先收到從庫資料同步完成的確認資訊後,才能提交事務,以此來解決幻讀問題。參考下圖:

6 總結

透過上述內容,我們了解了Mysql資料庫的主從同步,如果你的目標僅是資料庫的高並發,那麼可以先從SQL 優化,索引以及Redis 快取資料等這些方面來考慮最佳化,然後再考慮是否採用主從架構的方式。

在主從架構的配置中,如果想要採取讀寫分離的策略,我們可以自己編寫程序,也可以透過第三方的中間件來實現。

自己寫程式的好處就在於比較自主,我們可以自己判斷哪些查詢在從函式庫上來執行,針對即時性要求高的需求,我們還可以考慮哪些查詢可以在主函式庫上執行。同時程式直接連接資料庫,減少了中間件層,可以減少一些效能損耗。

而採用中間件的方法有很明顯的優勢,功能強大,使用簡單。但因為在客戶端和資料庫之間增加了中間件層會有一些效能損耗,同時商業中間件價格較高,所以有一定學習成本。另外,我們也可以考慮採用一些優秀的開源工具,像是 MaxScale。它是 MariaDB 開發的 MySQL 資料中間件。例如在下圖中,使用 MaxScale作為資料庫的代理,透過路由轉送完成了讀寫分離。同時我們也可以使用 MHA 工具作為強一致的主從切換工具,從而完成 MySQL的高可用架構。

推薦學習:《MySQL影片教學

以上是一文徹底搞懂MySql主從同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

phpmyadmin怎麼打開 phpmyadmin怎麼打開 Apr 10, 2025 pm 10:51 PM

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

redis怎麼使用單線程 redis怎麼使用單線程 Apr 10, 2025 pm 07:12 PM

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL:開發人員的基本技能 MySQL和SQL:開發人員的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL的位置:數據庫和編程 MySQL的位置:數據庫和編程 Apr 13, 2025 am 12:18 AM

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

SQL刪除行後如何恢復數據 SQL刪除行後如何恢復數據 Apr 09, 2025 pm 12:21 PM

直接從數據庫中恢復被刪除的行通常是不可能的,除非有備份或事務回滾機制。關鍵點:事務回滾:在事務未提交前執行ROLLBACK可恢復數據。備份:定期備份數據庫可用於快速恢復數據。數據庫快照:可創建數據庫只讀副本,在數據誤刪後恢復數據。慎用DELETE語句:仔細檢查條件,避免誤刪數據。使用WHERE子句:明確指定要刪除的數據。使用測試環境:在執行DELETE操作前進行測試。

See all articles