mysql讀寫分離和解決主從同步延時問題

2021-10-03 19:14:22 字數 1367 閱讀 6898

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、如果確實是存在必須先插入,立馬要求就查詢到,然後立馬就要反過來執行一些操作,對這個查詢設定直連主庫。不推薦這種方法,你這麼搞導致讀寫分離的意義就喪失了

mysql讀寫分離,主從複製,主從延遲

為了提公升資料庫的效能,一般會採用讀寫分離,即寫請求去主庫,讀請求去從庫。支援開啟多個io執行緒,可以提公升效率。開啟mysql的semi sync 半同步複製功能,即資料落庫,寫入binlog,並至少同步給一台從庫的relay日誌,才算寫成功。從庫開啟多個sql執行緒,可以併發讀取relay日誌,...

基於Amoba實現mysql主從讀寫分離

一 amoeba簡介 amoeba是乙個以mysql為底層資料儲存,並對應用提供mysql協議介面的proxy。它集中地響應應用的請求,依據使用者事先設定的規則,將sql請求傳送到特定的資料庫上執行。基於此可以實現負載均衡 讀寫分離 高可用性等需求。與mysql官方的mysql proxy相比,作者...

mysql主從利用proxy實現讀寫分離 IT阿寶

編譯安裝 服務 安裝依賴yum update y nss curl libcurlyum group install development tools yum install gcc make libcurl devel openssl devel gmp devel tar libffi dev...