左丿子Filv
我們知道,大型網站為了緩解高併發訪問,往往會給網站做負載均衡,但這遠遠不夠。我們還需要對數據庫層做優化,因為大量的數據查詢單靠一臺數據庫服務器很難抗得住,這時候我們就需要做讀寫分離了。
什麼是讀寫分離?
所謂的“讀寫分離”是指將數據庫分為了主庫和從庫,其中主庫用來寫入數據,(多個)從庫用來讀取數據。
讀寫分離是為了解決什麼問題的?
就大多數互聯網項目而言,絕大多數都是“讀多寫少”,所以讀操作往往會引發數據庫的性能瓶頸,為了解決這個問題,我們就將對數據的讀操作和寫操作進行分離,避免讀寫鎖帶來的衝突,從而提升了數據庫的性能。
通俗的說,讀寫分離是為了解決數據庫的讀寫性能瓶頸的。
MySQL讀寫分離的原理
MySQL讀寫分離是基於主從同步的,因為讀寫分離是將數據讀/寫操作分流至不同的數據庫節點服務器進行操作,這就涉及到了主庫和從庫的數據同步問題。
MySQL主從同步的原理是:主庫將變更記錄寫入binlog日誌(二進程日誌),然後從庫中有一個IO線程將主庫的binlog日誌Copy過來寫入中繼日誌中,從庫會從中繼日誌逐行讀取binlog日誌,然後執行對應的SQL,這樣一來從庫的數據就和主庫的數據保持一致了。
這裡需要留意的是,從庫同步數據時是串行而非並行操作的!!!即使在主庫上的操作是並行的,那在從庫上也是串行執行。所以從庫的數據會比主庫要慢一些,尤其是在高併發場景下延遲更為嚴重!
MySQL主從同步延時問題如何解決?
上面講到了,之所以導致MySQL主從同步存在延遲的原因是從庫同步數據時是串行而非並行執行的。
要解決主從同步延遲,有幾個可行方案供大家參考:
1、我們可以使用並行複製來處理同步。什麼是並行複製呢?並行複製指的就是從庫開啟多個線程並行讀取relay log 中的日誌;
2、對實時性要求嚴格的業務場景,寫操作後我們強制從主庫中讀取;
以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!網絡圈
首先排查原因,對症下藥:
一 網絡I/O:
首先檢查服務器的網絡通信質量,主從服務器的I/O負載,網絡質量不好,或者I/O負載過高會導致主從同步延時。
二 服務器硬件:
看看服務器硬件是否能更上系統的併發和實時要求,如果跟不上,加資源。
三 系統檢查:
系統併發過高的話,適當提高從庫拉取日誌的線程數,改進讀寫緩存策略。如果是多臺從庫,為了避免從庫拉取日誌造成主庫負載過高,可以用中繼的方式拉取日誌。
回答完畢,謝謝,希望對你有所幫助
本人專注互聯網最新技術,大數據,數據採集,數據處理,數據治理,望交流!!
渣渣灰233
這個問題問得好!
工作中遇到過不少這個問題,由於數據庫讀者分離或者主從同步都需要一定時間,由於
怎麼解決?
代碼中規避
寫庫完成之後返回數據通過緩存處理,適當允許不可重複讀!
數據庫主從配置優化
僅用從庫的binlog同步,logs-slave-updates不記錄主從產生日誌等方式減小主從同步壓力。
提高硬件配置,確保主從數據庫在同一個局域網
提高主從數據庫物理機配置,包括IO,帶寬,CPU等,使用SSD。注意儘量在同一個局域網部署主從服務器。
沒有時間細化了,大致上也就這些吧,從代碼到架構到硬件,這也是我們考慮問題的常規思路!望採納!