面试39 MySQL读写分离
(1)如何實(shí)現(xiàn)mysql的讀寫分離?
?
其實(shí)很簡(jiǎn)單,就是基于主從復(fù)制架構(gòu),簡(jiǎn)單來說,就搞一個(gè)主庫,掛多個(gè)從庫,然后我們就單單只是寫主庫,然后主庫會(huì)自動(dòng)把數(shù)據(jù)給同步到從庫上去。
?
(2)MySQL主從復(fù)制原理的是啥?
?
主庫將變更寫binlog日志,然后從庫連接到主庫之后,從庫有一個(gè)IO線程,將主庫的binlog日志拷貝到自己本地,寫入一個(gè)中繼日志中。接著從庫中有一個(gè)SQL線程會(huì)從中繼日志讀取binlog,然后執(zhí)行binlog日志中的內(nèi)容,也就是在自己本地再次執(zhí)行一遍SQL,這樣就可以保證自己跟主庫的數(shù)據(jù)是一樣的。
?
這里有一個(gè)非常重要的一點(diǎn),就是從庫同步主庫數(shù)據(jù)的過程是串行化的,也就是說主庫上并行的操作,在從庫上會(huì)串行執(zhí)行。所以這就是一個(gè)非常重要的點(diǎn)了,由于從庫從主庫拷貝日志以及串行執(zhí)行SQL的特點(diǎn),在高并發(fā)場(chǎng)景下,從庫的數(shù)據(jù)一定會(huì)比主庫慢一些,是有延時(shí)的。所以經(jīng)常出現(xiàn),剛寫入主庫的數(shù)據(jù)可能是讀不到的,要過幾十毫秒,甚至幾百毫秒才能讀取到。
?
而且這里還有另外一個(gè)問題,就是如果主庫突然宕機(jī),然后恰好數(shù)據(jù)還沒同步到從庫,那么有些數(shù)據(jù)可能在從庫上是沒有的,有些數(shù)據(jù)可能就丟失了。
?
所以mysql實(shí)際上在這一塊有兩個(gè)機(jī)制,一個(gè)是半同步復(fù)制,用來解決主庫數(shù)據(jù)丟失問題;一個(gè)是并行復(fù)制,用來解決主從同步延時(shí)問題。
?
這個(gè)所謂半同步復(fù)制,semi-sync復(fù)制,指的就是主庫寫入binlog日志之后,就會(huì)將強(qiáng)制此時(shí)立即將數(shù)據(jù)同步到從庫,從庫將日志寫入自己本地的relay log之后,接著會(huì)返回一個(gè)ack給主庫,主庫接收到至少一個(gè)從庫的ack之后才會(huì)認(rèn)為寫操作完成了。
?
所謂并行復(fù)制,指的是從庫開啟多個(gè)線程,并行讀取relay log中不同庫的日志,然后并行重放不同庫的日志,這是庫級(jí)別的并行。
1)主從復(fù)制的原理
2)主從延遲問題產(chǎn)生的原因
3)主從復(fù)制的數(shù)據(jù)丟失問題,以及半同步復(fù)制的原理
4)并行復(fù)制的原理,多庫并發(fā)重放relay日志,緩解主從延遲問題
?
(3)mysql主從同步延時(shí)問題(精華)
?
線上確實(shí)處理過因?yàn)橹鲝耐窖訒r(shí)問題,導(dǎo)致的線上的bug,小型的生產(chǎn)事故
?
show status,Seconds_Behind_Master,你可以看到從庫復(fù)制主庫的數(shù)據(jù)落后了幾ms
?
其實(shí)這塊東西我們經(jīng)常會(huì)碰到,就比如說用了mysql主從架構(gòu)之后,可能會(huì)發(fā)現(xiàn),剛寫入庫的數(shù)據(jù)結(jié)果沒查到,結(jié)果就完蛋了。。。。
?
所以實(shí)際上你要考慮好應(yīng)該在什么場(chǎng)景下來用這個(gè)mysql主從同步,建議是一般在讀遠(yuǎn)遠(yuǎn)多于寫,而且讀的時(shí)候一般對(duì)數(shù)據(jù)時(shí)效性要求沒那么高的時(shí)候,用mysql主從同步
?
所以這個(gè)時(shí)候,我們可以考慮的一個(gè)事情就是,你可以用mysql的并行復(fù)制,但是問題是那是庫級(jí)別的并行,所以有時(shí)候作用不是很大
?
所以這個(gè)時(shí)候。。通常來說,我們會(huì)對(duì)于那種寫了之后立馬就要保證可以查到的場(chǎng)景,采用強(qiáng)制讀主庫的方式,這樣就可以保證你肯定的可以讀到數(shù)據(jù)了吧。其實(shí)用一些數(shù)據(jù)庫中間件是沒問題的。
?
一般來說,如果主從延遲較為嚴(yán)重
?
1、分庫,將一個(gè)主庫拆分為4個(gè)主庫,每個(gè)主庫的寫并發(fā)就500/s,此時(shí)主從延遲可以忽略不計(jì)
2、打開mysql支持的并行復(fù)制,多個(gè)庫并行復(fù)制,如果說某個(gè)庫的寫入并發(fā)就是特別高,單庫寫并發(fā)達(dá)到了2000/s,并行復(fù)制還是沒意義。28法則,很多時(shí)候比如說,就是少數(shù)的幾個(gè)訂單表,寫入了2000/s,其他幾十個(gè)表10/s。
3、重寫代碼,寫代碼的同學(xué),要慎重,當(dāng)時(shí)我們其實(shí)短期是讓那個(gè)同學(xué)重寫了一下代碼,插入數(shù)據(jù)之后,直接就更新,不要查詢
如果確實(shí)是存在必須先插入,立馬要求就查詢到,然后立馬就要反過來執(zhí)行一些操作,對(duì)這個(gè)查詢?cè)O(shè)置直連主庫。不推薦這種方法,你這么搞導(dǎo)致讀寫分離的意義就喪失了
轉(zhuǎn)載于:https://www.cnblogs.com/xiufengchen/p/11259314.html
總結(jié)
以上是生活随笔為你收集整理的面试39 MySQL读写分离的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sencha touch笔记(6)——路
- 下一篇: linux cmake编译源码,linu