分庫分布的幾件小事(五)MYSQL讀寫分離

1.為什么進行讀寫分離

這個,高并發(fā)這個階段,那肯定是需要做讀寫分離的,啥意思?因為實際上大部分的互聯(lián)網(wǎng)公司,一些網(wǎng)站,或者是app,其實都是讀多寫少。所以針對這個情況,就是寫一個主庫,但是主庫掛多個從庫,然后從多個從庫來讀,那不就可以支撐更高的讀并發(fā)壓力了嗎?

2.如何實現(xiàn)mysql讀寫分離

其實很簡單,就是基于主從復(fù)制架構(gòu),簡單來說,就是搞一個主庫,掛多個從庫,然后我們就只是寫主庫,然后主庫自動把數(shù)據(jù)同步到從庫,讀數(shù)據(jù)全都走從庫。

3.MYSQL主從復(fù)制原理

主庫將數(shù)據(jù)操作指令寫到binlog日志,然后從庫連接主庫之后,從庫有一個IO線程,將主庫的binlog日志拷貝到自己本地,寫入一個中繼日志中。接著從庫中有一個SQL線程會從中繼日志中讀取binlog,然后執(zhí)行binlog日志中的內(nèi)容,也就是在自己本地再執(zhí)行一遍SQL,這樣就可以保證自己跟主庫的數(shù)據(jù)是一致的。

image.png

這里有一個非常重要的一點,就是從庫同步主庫數(shù)據(jù)的過程是串行化的,也就是說主庫上并行的操作,在從庫上會串行執(zhí)行。所有在高并發(fā)場景下,從庫的數(shù)據(jù)一定會別主庫慢一些,,是有延時的。所以經(jīng)常出現(xiàn),剛寫入的數(shù)據(jù)可能是讀不到的問題,要經(jīng)過幾十毫秒,甚至幾百毫秒才能讀取到。

還有一個問題,就是如果一個數(shù)據(jù)已寫入主庫,但是這時候binlog從庫還沒有來得及復(fù)制。主庫這時候宕機了,那么有些數(shù)據(jù)可能在從庫上是沒有的,有些數(shù)據(jù)就會丟失。

4.解決主庫數(shù)據(jù)丟失問題

mysql有一個機制叫做半同步復(fù)制,這個機制就可以解決主庫數(shù)據(jù)丟失問題。
這個所謂半同步復(fù)制,semi-sync復(fù)制,指的是主庫寫入binlog日志之后,就會將數(shù)據(jù)立即強制將數(shù)據(jù)同步到從庫。從庫將日志寫入自己本地的relay log之后,接著會返回一個ack給主庫,主庫接收到至少一個從庫的ack之后才會認(rèn)為寫操作完成了。

5.解決主從同步延遲

mysql可以在復(fù)制binlog文件時并行復(fù)制,減輕延遲問題。
這個所謂并行復(fù)制,指的是從庫開啟多個線程,并行讀取relay log中不同庫 的日志,然后并行重放不同庫的日志,這是庫級別的并行。

6.mysql主從延時問題

show status,Seconds_Behind_Master,你可以看到從庫復(fù)制主庫的數(shù)據(jù)落后了幾ms。

其實這塊東西我們經(jīng)常會碰到,就比如說用了mysql主從架構(gòu)之后,可能會發(fā)現(xiàn),剛寫入庫的數(shù)據(jù)結(jié)果沒查到,結(jié)果就完蛋了。。。。

所以實際上你要考慮好應(yīng)該在什么場景下來用這個mysql主從同步,建議是一般在讀遠遠多于寫 ,而且讀的時候一般對數(shù)據(jù)時效性要求沒那么高的時候,用mysql主從同步。

所以這個時候,我們可以考慮的一個事情就是,你可以用mysql的并行復(fù)制,但是問題是那是庫級別的并行,所以有時候作用不是很大

所以這個時候通常來說,我們會對于那種寫了之后立馬就要保證可以查到的場景,采用強制讀主庫的方式,這樣就可以保證你肯定的可以讀到數(shù)據(jù)了吧。其實用一些數(shù)據(jù)庫中間件是沒問題的。

一般來說,如果主從延遲較為嚴(yán)重

1、分庫,將一個主庫拆分為4個主庫,每個主庫的寫并發(fā)就500/s,此時主從延遲可以忽略不計。

2、打開mysql支持的并行復(fù)制,多個庫并行復(fù)制,如果說某個庫的寫入并發(fā)就是特別高,單庫寫并發(fā)達到了2000/s,并行復(fù)制還是沒意義。28法則,很多時候比如說,就是少數(shù)的幾個訂單表,寫入了2000/s,其他幾十個表10/s。

3、重寫代碼,寫代碼的同學(xué),要慎重,不要做插入之后立即查詢操作,插入數(shù)據(jù)之后,直接就更新,不要查詢。

4、如果確實是存在必須先插入,立馬要求就查詢到,然后立馬就要反過來執(zhí)行一些操作,對這個查詢設(shè)置直連主庫。不推薦這種方法,你這么搞導(dǎo)致讀寫分離的意義就喪失了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容