更新時(shí)間:2020-09-08 14:44:51 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2061次
在實(shí)際的生產(chǎn)環(huán)境中,如果對(duì)mysql數(shù)據(jù)庫(kù)的讀和寫(xiě)都在一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器中操作,無(wú)論是在安全性、高可用性,還是高并發(fā)等各個(gè)方面都是不能滿足實(shí)際需求的。因此,一般通過(guò)主從復(fù)制的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫(xiě)分離來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。

Mysql主從復(fù)制和讀寫(xiě)分離
一,主從復(fù)制:
Mysql的主從復(fù)制和mysql的讀寫(xiě)分離兩者有緊密的聯(lián)系,首先要部署主從復(fù)制,只有主從復(fù)制完成了,才能再此基礎(chǔ)上進(jìn)行數(shù)據(jù)的讀寫(xiě)分離。
Mysql支持的復(fù)制類型:
1、基于語(yǔ)句的復(fù)制:在主服務(wù)器上執(zhí)行的sql語(yǔ)句,在從服務(wù)器上會(huì)執(zhí)行同樣的語(yǔ)句。Mysql默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高,但是有時(shí)不能實(shí)現(xiàn)精準(zhǔn)復(fù)制。
2,基于行的復(fù)制:把改變的內(nèi)容復(fù)制過(guò)去,而不是把命令在從服務(wù)器上執(zhí)行一遍。
3、混合類型的復(fù)制:默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句的復(fù)制不能精準(zhǔn)復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。

二,主從復(fù)制過(guò)程:
1、在每個(gè)事物更新數(shù)據(jù)完成之前,master在二進(jìn)制日志記錄這些改變,寫(xiě)入二進(jìn)制日志完成后,master通知存儲(chǔ)引擎提交事物。
2、Slave將master的binary log復(fù)制到其中的中繼日志。首先從mysql服務(wù)器開(kāi)始一個(gè)工作線程I/O線程,I/O線程在master上打開(kāi)一個(gè)普通的連接,然后開(kāi)始binlog dump process。Binlog dump process從master的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上master。他會(huì)睡眠并等待master產(chǎn)生新的事件。I/O線程將這些事件寫(xiě)入中繼日志。
3、Sql從線程處理該過(guò)程的最后一步。Sql線程從中繼日志中讀取事件,并重放其中的事件而更新slave的數(shù)據(jù),使其與master的數(shù)據(jù)一致。
三、讀寫(xiě)分離
簡(jiǎn)單的來(lái)說(shuō),讀寫(xiě)分離就是只在mysql主服務(wù)器上寫(xiě),只在mysql從服務(wù)器上讀?;驹硎亲屩鲾?shù)據(jù)庫(kù)處理事務(wù)性查詢,而從數(shù)據(jù)庫(kù)處理select查詢。數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性查詢導(dǎo)致的變更同步到集群中的數(shù)據(jù)庫(kù)。
目前較為常見(jiàn)的mysql讀寫(xiě)分離有兩種:
1、基于程序代碼的內(nèi)部實(shí)現(xiàn)
在代碼中根據(jù)select、insert進(jìn)行路由分類,這類方法也是目前生產(chǎn)環(huán)境中較為常用的,優(yōu)點(diǎn)是性能較好,因?yàn)樵诔绦虼a中實(shí)現(xiàn),不需要增加額外的設(shè)備作為硬件開(kāi)支;缺點(diǎn)是需要研發(fā)人員來(lái)實(shí)現(xiàn),運(yùn)維人員無(wú)從下手。
2、基于中間代理層實(shí)現(xiàn)
代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接收到客戶端請(qǐng)求后通過(guò)判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫(kù)。如下有兩個(gè)常用代理:
Mysql-proxy:其為mysql的開(kāi)源項(xiàng)目,通過(guò)其自帶的lua腳本進(jìn)行sql判斷,雖然是mysql官方產(chǎn)品,但是mysql官方并不建議其使用到生產(chǎn)環(huán)境中。
Amoeba:由陳思儒開(kāi)發(fā),該程序由Java語(yǔ)言進(jìn)行開(kāi)發(fā)。這個(gè)軟件致力于mysql的分布式數(shù)據(jù)庫(kù)前端代理層,它主要為應(yīng)用層訪問(wèn)mysql的時(shí)候充當(dāng)sql路由功能。Amoeba能夠完成多數(shù)據(jù)源的高可用、負(fù)載均衡、數(shù)據(jù)切片等功能。

以上就是mysql主從復(fù)制與讀寫(xiě)分離的詳解介紹,更多資料大家可以在動(dòng)力節(jié)點(diǎn)官網(wǎng)的Java技術(shù)文檔中查找。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)