文章目錄
- 什么是MySQL主從架構
- 主從架構的組成
- 工作原理
- 主從復制的步驟
- 主從架構的優點
- 主從架構的缺點
- 什么是主從同步延遲
- 為什么會導致主從延遲
- 主從延時的排查和解決
- 如果發現主從數據不一致怎么辦?
我們常說的業務量越來越大,I/O訪問頻率過高,單機無法滿足,就會用到讀寫分離之類的多庫方案
所以我們首先要知道什么是MySQL主從架構
什么是MySQL主從架構
通過字面上來看,最起碼要有兩臺數據庫,并且他們的關系是主與從。MySQL主從復制就是將數據庫群中一臺或多臺服務器作為主(master)數據庫,其他數據庫作為從(slave)數據庫,然后指向主庫,實時同步主庫中的數據;當主庫數據發生變化時,會將變化的數據實時同步到一個或多個從庫。
這是一種數據庫復制和分布式存儲的解決方案,核心是將數據從一個主服務器(Master)復制到一個或多個從服務器(Slave)。這種架構主要用于數據備份、讀寫分離、負載均衡和高可用性。當然凡事都有兩面性,如數據延遲和寫入瓶頸,因此在設計系統時需要根據實際需求進行權衡
主從架構的組成
主服務器(Master):負責處理寫操作(INSERT、UPDATE、DELETE 等),并將這些更改記錄到二進制日志(binary log)中
從服務器(Slave):通過讀取并應用主服務器的二進制日志來復制數據,通常用于處理讀操作(SELECT)
工作原理
二進制日志(Binary Log):主服務器上的所有更改都會記錄在一個二進制日志中
中繼日志(Relay Log):從服務器從主服務器接收二進制日志的內容,并將其存儲在自己的中繼日志中
I/O線程:從服務器上的I/O線程負責從主服務器讀取二進制日志,并寫入中繼日志
SQL線程:從服務器上的SQL線程負責讀取中繼日志,并將這些更改應用到從服務器的數據庫中
主從復制的步驟
啟動復制:在主服務器上啟用二進制日志,并創建一個具有復制權限的用戶
配置從服務器:配置從服務器,指定主服務器的地址、登錄憑證等,并指定復制的起點
數據同步:在開始復制之前,通常需要將主服務器上的數據同步到從服務器
啟動復制進程:在從服務器上啟動復制進程,開始復制操作
主從架構的優點
數據冗余:提供數據備份,增加數據安全性
讀寫分離:通過從服務器處理讀請求,可以提高系統的讀取性能
負載均衡:分散數據庫的訪問壓力,提高系統整體的處理能力
高可用性:當主服務器出現故障時,可以快速切換到從服務器,減少系統停機時間
主從架構的缺點
數據延遲:從服務器復制數據可能會有延遲,導致數據不一致的問題
故障恢復:當主服務器出現故障時,需要手動或通過自動化工具進行故障轉移
寫入瓶頸:所有的寫操作都必須通過主服務器,可能會成為系統的瓶頸
什么是主從同步延遲
那么再說回什么是主從同步延遲,其實只要使用到了主從設計,基本都會有主從延遲的問題,只是說延遲的嚴重的程度不一樣而已
從字面詞匯解釋:主從延時,通常指的是在數據庫的主從復制架構中,從服務器(Slave)在接收并應用主服務器(Master)上的數據變更時所經歷的時間延遲。具體來說,當主服務器上的數據發生變化后,這些變更需要通過復制機制同步到從服務器,而從服務器處理這些變更并完成數據同步所需的時間就構成了所謂的延時
一般來說幾百毫秒以內可能都是能接受的范圍
為什么會導致主從延遲
- 負載過高:這里其實不管主庫還是從庫的負載比較高,都可能會導致延遲。這里先額外說一個事情,很多人覺得主庫負責寫,從庫只負責讀,所以主庫的配置需要高一點,從庫低一點也無所謂,但其實這是一個誤區,你要清楚所有寫在主庫的數據,在從庫都需要寫一遍,而且要求時延低的話,從庫的壓力其實并不比主庫低。所以如果主庫的并發量壓力較高時,可能會導致從庫來不及寫入
或者本身從庫的負載較高了,因為從庫都是串行去寫入了,為了保證數據一致性,前面也說了其實從庫就是把主庫執行過的sql也同樣的按順序執行一次,如果中途可能因為執行其他查詢或者某一個復雜的事務等,也可能導致無法及時處理同步過來的數據 - 網絡延遲:主從服務器之間的網絡延遲也會影響同步效率,這個字面也很好理解
- 硬件性能不足:如果從庫的硬件性能不足,處理同步數據的速度會受到影響,這個在第一點里面也做過解釋
- MySQL配置不合理:如sync_binlog和innodb_flush_log_at_trx_commit等配置不當可能導致延遲
- 鎖等待:從庫在執行同步操作時可能遇到鎖等待,特別是大型查詢語句
主從延時的排查和解決
先確認復制是否正常在運行,然后就是分析導致延時的原因
- 使用show slave status命令,了解當前的延時情況
- 查看Seconds_Behind_Master參數 NULL:表示I/O線程或SQL線程發生故障。0:表示主從復制狀態正常,無延遲。正值:表示主從已經出現延時,數值越大,延遲越嚴重
- Slave_IO_Running 和 Slave_SQL_Running:這兩個狀態都應該是Yes,如果不是,說明復制過程中斷了
- Last_IO_Error 和 Last_SQL_Error:如果復制出錯,這里會顯示錯誤信息
- 檢查主從機器之間的網絡延遲,查看是否出現問題,如使用ping或traceroute命令來測試網絡連接
- 檢查帶寬限制,這個雖然一般不會出現,但是高負載時也可能帶寬不夠導致復制延遲
- 檢查主服務器的二進制日志和從服務器的中繼日志文件大小,如果日志文件過大,可能會導致處理緩慢
- 檢查服務器資源是否有大的波動
解決辦法就是先根據問題分析的原因來做不同的處理應對
- 優化主從服務器的硬件配置,提升處理能力
- 調整MySQL的復制配置,如修改sync_binlog和innodb_flush_log_at_trx_commit參數,以平衡數據安全性和性能
- 網絡優化,確保主從服務器之間的網絡連接穩定且帶寬充足
- 業務邏輯優化,避免大事務和長耗時操作
- 調整中繼日志的配置,比如日志的大小和刷新策略,減少服務器的I/O壓力
如果發現主從數據不一致怎么辦?
1、首先是檢查主從同步是否還在正常執行
2、檢查延時問題,是否是延時導致的
3、檢查最新的數據,看是最后的數據沒同步到還是中間的數據沒同步到
4、確認主從服務器的錯誤日志,看是否有相關的異常
5、如果數據不一致且無法通過簡單的修復來解決,可能需要重新同步數據:
停止復制:在從服務器上執行STOP SLAVE;命令停止復制
數據備份與恢復:使用mysqldump或其他備份工具從主服務器備份數據,并在從服務器上恢復
重置復制:在從服務器上重置復制狀態,重新配置復制并啟動