MySQL讀寫分離

2022-07-04 08:42:11 字數 1411 閱讀 6354

一、如何實現mysql讀寫分離

其實很簡單,就是基於主從複製架構,簡單來說,就搞乙個主庫,掛多個從庫,然後我們就單單只是寫主庫,然後主庫會自動把資料給同步到從庫上去。

主庫將變更寫入 binlog 日誌,然後從庫連線到主庫之後,從庫有乙個 io 執行緒,將主庫的binlog 日誌拷貝到自己本地,寫入乙個 relay 中繼日誌中。接著從庫中有乙個 sql 執行緒會從中繼日誌讀取 binlog,然後執行 binlog 日誌中的內容,也就是在自己本地再次執行一遍 sql,這樣就可以保證自己跟主庫的資料是一樣的

這裡有乙個非常重要的一點,就是從庫同步主庫資料的過程是序列化的,也就是說主庫上並行的操作,在從庫上會序列執行。所以這就是乙個非常重要的點了,由於從庫從主庫拷貝日誌以及序列執行 sql 的特點,在高併發場景下,從庫的資料一定會比主庫慢一些,是有延時的。所以經常出現,剛寫入主庫的資料可能是讀不到的,要過幾十毫秒,甚至幾百毫秒才能讀取到。

而且這裡還有另外乙個問題,就是如果主庫突然宕機,然後恰好資料還沒同步到從庫,那麼有些資料可能在從庫上是沒有的,有些資料可能就丟失了。

所以 mysql 實際上在這一塊有兩個機制,乙個是半同步複製,用來解決主庫資料丟失問題;乙個是並行複製,用來解決主從同步延時問題。

這個所謂半同步複製,也叫semi-sync複製,指的就是主庫寫入 binlog 日誌之後,就會將強制此時立即將資料同步到從庫,從庫將日誌寫入自己本地的 relay log 之後,接著會返回乙個 ack 給主庫,主庫接收到至少乙個從庫的 ack 之後才會認為寫操作完成了。

所謂並行複製,指的是從庫開啟多個執行緒,並行讀取 relay log 中不同庫的日誌,然後並行重放不同庫的日誌,這是庫級別的並行。

以前線上確實處理過因為主從同步延時問題而導致的線上的 bug,屬於小型的生產事故。有個同學是這樣寫**邏輯的。先插入一條資料,再把它查出來,然後更新這條資料。在生產環境高峰期,寫併發達到了 2000/s,這個時候,主從複製延時大概是在小幾十毫秒。線上會發現,每天總有那麼一些資料,我們期望更新一些重要的資料狀態,但在高峰期時候卻沒更新。使用者跟客服反饋,而客服就會反饋給我們。

我們通過 mysql 命令

show status
檢視seconds_behind_master,可以看到從庫複製主庫的資料落後了幾 ms。

一般來說,如果主從延遲較為嚴重,有以下解決方案:

mysql讀寫分離

5.讀寫分離適用與讀遠大於寫的場景,如果只有一台伺服器,當select很多時,update和delete會被這些select訪問中的資料堵塞,等待select結束,併發效能不高。對於寫和讀比例相近的應用,應該部署雙主相互複製。6.可以在從庫啟動是增加一些引數來提高其讀的效能,例如 skip inno...

讀寫分離 MySQL

1 what 讀寫分離 讀寫分離,基本的原理是讓主資料庫處理事務性增 改 刪操作 insert update delete 而從資料庫處理select查詢操作。資料庫複製被用來把事務性操作導致的變更同步到集群中的從資料庫。2 why 那麼為什麼要讀寫分離呢?因為資料庫的 寫 寫10000條資料到or...

mysql讀寫分離

在資料庫集群架構中,讓主庫負責處理事務性查詢,而從庫只負責處理select查詢,讓兩者分工明確達到提高資料庫整體讀寫效能。當然,主資料庫另外乙個功能就是負責將事務性查詢導致的資料變更同步到從庫中,也就是寫操作。即主從複製和讀寫分離是離不開的 1 分攤伺服器壓力,提高機器的系統處理效率 讀寫分離適用於...