MYSQL讀寫分離,主從複製的原理

作爲一名java程序員,求職面試時時常會遇到類似這樣的問題:

你有沒有做過MySQL讀寫分離?如何實現MySQL的讀寫分離?說說MySQL主從複製原理?如何解決 MySQL主從同步延時問題?1、MySQL的讀寫分離

說到讀寫分離,我們先了解下什麼是主從複製。

主從複製,是用來建立一個和主數據庫完全一樣的數據庫環境,稱爲從數據庫,主數據庫一般是準實時的業務數據庫。一臺服務器充當主服務器,而另外一臺服務器充當從服務器。

此時主服務器會將更新信息寫入到一個特定的二進制文件中,並會維護文件的一個索引用來跟蹤日誌循環,這個日誌可以記錄併發送到從服務器的更新中去。

一臺從服務器連接到主服務器時,從服務器會通知主服務器從服務器的日誌文件中讀取最後一次成功更新的位置。然後從服務器會接收從哪個時刻起發生的任何更新,然後鎖住並等到主服務器通知新的更新。

讀寫分離簡單倆說就是基於主從複製架構,一個主庫,有多個從庫,主庫主要負責寫,寫完後主庫會自動把數據給同步給從庫。

2、MySQL主從複製的原理

打開百度極速版,查看更多高清圖片

主庫將變更寫入binlog日誌,然後從庫連接到主庫之後,從庫有一個 IO 線程,將主庫的 binlog 日誌拷貝到自己本地,寫入一個 relay中繼日誌(relay log)中。接着從庫中有一個SQL線程會從中繼日誌讀取binlog,然後執行binlog日誌中的內容,也就是在自己本地再次執行一遍SQL語句,從而使從服務器和主服務器的數據保持一致。

主從配置就是圍繞這個原理配置,也就是說:從庫會生成兩個線程,一個I/O線程,一個SQL線程;I/O線程會去請求主庫的binlog,並將得到的binlog寫到本地的relay-log(中繼日誌)文件中;主庫會生成一個log dump線程,用來給從庫I/O線程傳binlog;SQL線程,會讀取relay log文件中的日誌,並解析成sql語句逐一執行;。

有一點需要注意的是,就是從庫同步主庫數據的過程是串行化的,也就是說主庫上並行的操作,在從庫上會串行執行。

由於從庫從主庫拷貝日誌以及串行執行 SQL 的特點,在高併發場景下,從庫的數據是有延時的。

在實際運用中,時常會出現這樣的情況,主庫的數據已經有了,可從庫還是讀取不到,可能要過幾十毫秒,甚至幾百毫秒才能讀取到。

一個是半同步複製,用來解決主庫數據丟失問題;一個是並行複製,用來解決從庫複製延遲的問題。半同步複製,也叫 semi-sync 複製,指的就是主庫寫入 binlog 日誌之後,就會將強制此時立即將數據同步到從庫,從庫將日誌寫入自己本地的 relay log 之後,接着會返回一個 ack 給主庫,主庫接收到至少一個從庫的 ack 之後纔會認爲寫操作完成了。

並行複製,指的是從庫開啓多個線程,並行讀取 relay log 中不同庫的日誌,然後並行重放不同庫的日誌,這是庫級別的並行。

3、MySQL 主從同步延時問題

譬如用戶升級條件達到了,主庫也成功更新了用戶狀態,可在生產環境高峯期,這個時候,主從複製延時了,從庫在高峯期時候卻沒更新。導致用戶在手機app界面上顯示的等級還是原來的。

主從延時排查方法

MySQL 有主從同步的狀態信息,可以通過MySQL命令 show slave status獲取,除了獲知當前是否主從同步正常工作,另外一個重要指標就是 Seconds_Behind_Master,根據輸出的Seconds_Behind_Master參數的值來判斷:NULL,表示io_thread或是sql_thread有任何一個發生故障;0,該值爲零,表示主從複製良好;正值,表示主從已經出現延時,數字越大表示從庫延遲越嚴重。

4、主從延遲解決方案

分庫,將一個主庫拆分爲多個主庫,(可以是多主一從)這樣每個主庫的寫併發會減少。單個庫讀寫分離,一主多從,主寫從讀,分散壓力。這樣從庫壓力比主庫高,保護主庫。、MySQL 支持的並行複製,多個庫並行複製。但要是單庫寫入併發太高,並行複製並沒有意義。升級Slave硬件配置不知你有沒有其他解決方案,歡迎交流!

由於筆者水平有限,文中紕漏之處在所難免,權當拋磚引玉,不妥之處,請大家批評指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章