mysql主從同步延遲

如何實現mysql讀寫分離

基於主從複製架構,簡單來說,就是搞了一個主庫,掛多個從庫,然後我們單單只是寫主庫,然後主庫會自動把數據同步到從庫上。

mysql主從複製原理是什麼

主庫將變更寫binlog日誌,然後從庫連接到主庫後,從庫有一個IO線程,將主庫的binlog日誌拷貝到自己本地,寫入一箇中繼日誌中,接着從庫中有一個sql線程會從中繼日誌讀取binlog,然後執行binlog日誌中的內容,也就是在自己本地再執行一遍sql,這樣就可以保證自己跟主庫的數據一致。
這裏有很重要一點,就是從庫同步主庫數據的過程是串行化的,也就是說主庫上並行操作,在從庫上會串行化執行,由於從庫從主庫拷貝日誌以及串行化執行sql特點,在高併發情況下,從庫數據一定比主庫慢一點,是有延時的,所以經常出現,剛寫入主庫的數據可能讀不到了,要過幾十毫秒,甚至幾百毫秒才能讀取到。
還有一個問題,如果突然主庫宕機了,然後恰巧數據還沒有同步到從庫,那麼有些數據可能在從庫上是沒有的,有些數據可能就丟失了。
所以mysql實際上有兩個機制,一個是半同步複製,用來解決主庫數據丟失問題,一個是並行複製,用來解決主從同步延時問題。

  • 半同步複製:semi-sync複製,指的就是主庫寫入binlog日誌後,就會將強制此時立即將數據同步到從庫,從庫將日誌寫入自己本地的relay log之後,接着會返回一個ack給主庫,主庫接收到至少一個從庫ack之後纔會認爲寫完成。
  • 併發複製:指的是從庫開啓多個線程,並行讀取relay log中不同庫的日誌,然後並行重放不同庫的日誌,這樣庫級別的並行。

mysql主從同步延時問題

就比如說用了mysql主從架構之後,可能會發現,剛寫入庫的數據結果沒查到,結果就完蛋了。
所以實際上需要考慮好應該在什麼場景下來用mysql主從同步,建議是一般在讀遠遠多於寫,而且讀的時候一般對數據時效性要求沒有那麼高,用mysql主從同步。
通常來說,我們會對於那種寫了之後立馬就要保證可以查到的場景,採用強制讀主庫的方式,這樣就可以保證讀到數據,其實用一些數據庫中間件是沒問題的。


解決主從延遲嚴重

1、分庫,將一個主庫拆分爲4個主庫,每個主庫的寫併發就500/s,此時主從延遲可以忽略不計
2、打開mysql支持的並行複製,多個庫並行複製,如果說某個庫的寫入併發就是特別高,單庫寫併發達到了2000/s,並行複製還是沒意義。28法則,很多時候比如說,就是少數的幾個訂單表,寫入了2000/s,其他幾十個表10/s。
3、重寫代碼,寫代碼的同學,要慎重,當時我們其實短期是讓那個同學重寫了一下代碼,插入數據之後,直接就更新,不要查詢
4、如果確實是存在必須先插入,立馬要求就查詢到,然後立馬就要反過來執行一些操作,對這個查詢設置直連主庫。不推薦這種方法,你這麼搞導致讀寫分離的意義就喪失了

01_爲什麼MySQL要讀寫分離?.png

02_MySQL主從複製原理.png

 

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