image.png
主從復(fù)制的時機(jī):
- 當(dāng)開啟主從復(fù)制時枯冈,slave建立io線程連接主庫毅贮。當(dāng)master有寫入操作導(dǎo)致數(shù)據(jù)變更時,在事務(wù)提交之前會將對數(shù)據(jù)的操作寫入binlog尘奏。然后通知dump thread向slave發(fā)送數(shù)據(jù)變更滩褥。slave通過IO線程將數(shù)據(jù)寫入relay log.在SQL線程內(nèi),讀取對relay log的寫入炫加,通過SQL thread邏輯的完成數(shù)據(jù)的寫入瑰煎。
https://www.hoohack.me/2017/07/11/learning-mysql-replication-detail
2.1復(fù)制模式
異步(默認(rèn))
寫入到binlog之后,提交成功就返回俗孝,無需等待任何從節(jié)點的ack酒甸。
異步
半同步
將修改操作寫入到binlog之后,通知dump thread將binlog的更新發(fā)送到從節(jié)點赋铝,等待從節(jié)點的ack插勤。收到任意從節(jié)點的ack之后即可成功返回。若超時仍未收到ack革骨,則降級為異步农尖。
半同步
同步
全同步模式是指主節(jié)點和從節(jié)點全部執(zhí)行了commit并確認(rèn)才會向客戶端返回成功。
2.3 why?
- 1.為什么要主從復(fù)制良哲?他真的降低了數(shù)據(jù)庫的讀寫壓力嗎盛卡?
從常規(guī)思路來講,不做主從復(fù)制的時候臂外,主庫承擔(dān)來自客戶端的讀寫壓力窟扑。 采用主從復(fù)制和讀寫分離之后,主庫和從庫都既要寫入漏健,又要讀出嚎货。似乎有點自欺欺人的感覺? 事實上并不是這樣的蔫浆,從庫讀取binlog是順序讀殖属,效率較高。由于IO線程和SQL線程獨立運(yùn)行瓦盛,并不會由于其中一個阻塞另一個洗显,即使SQL線程執(zhí)行慢,IO線程也能將binlog的信息寫入到relay log, SQL線程只需要不斷地讀取relay log即可原环。從而在保證主從之間復(fù)制的開銷小的同時將主庫面臨的讀取壓力轉(zhuǎn)移到從庫挠唆。從庫可以配置多個,讀取時可以通過代理做一次負(fù)載均衡嘱吗,降低單個從庫的讀取壓力玄组。 - 從庫面臨的主要壓力來自于DDL和DML語句的執(zhí)行,mysql的主從復(fù)制都是單線程(5.6之后 SQL執(zhí)行可以并發(fā))的操作。每條statement基本上都是隨機(jī)寫入俄讹,若主庫的并發(fā)較高時哆致,產(chǎn)生的DML數(shù)量超過slave的SQL thread所能處理的速度,或者當(dāng)slave中有大型query語句產(chǎn)生了鎖等待患膛,會產(chǎn)生延時摊阀。