[轉(zhuǎn)]MySQL 主從復(fù)制與讀寫分離概念及架構(gòu)分析

1.MySQL主從復(fù)制入門

首先厨内,我們看一個(gè)圖:

影響MySQL-A數(shù)據(jù)庫的操作芒珠,在數(shù)據(jù)庫執(zhí)行后琅拌,都會(huì)寫入本地的日志系統(tǒng)A中。

假設(shè)婚度,實(shí)時(shí)的將變化了的日志系統(tǒng)中的數(shù)據(jù)庫事件操作蘸秘,在MYSQL-A的3306端口,通過網(wǎng)絡(luò)發(fā)給MYSQL-B蝗茁。

MYSQL-B收到后醋虏,寫入本地日志系統(tǒng)B,然后一條條的將數(shù)據(jù)庫事件在數(shù)據(jù)庫中完成哮翘。

那么灰粮,MYSQL-A的變化,MYSQL-B也會(huì)變化忍坷,這樣就是所謂的MYSQL的復(fù)制粘舟,即MYSQL replication。

在上面的模型中佩研,MYSQL-A就是主服務(wù)器柑肴,即master,MYSQL-B就是從服務(wù)器旬薯,即slave晰骑。

日志系統(tǒng)A,其實(shí)它是MYSQL的日志類型中的二進(jìn)制日志,也就是專門用來保存修改數(shù)據(jù)庫表的所有動(dòng)作硕舆,即bin log秽荞。【注意MYSQL會(huì)在執(zhí)行語句之后抚官,釋放鎖之前扬跋,寫入二進(jìn)制日志,確保事務(wù)安全】

日志系統(tǒng)B凌节,并不是二進(jìn)制日志钦听,由于它是從MYSQL-A的二進(jìn)制日志復(fù)制過來的,并不是自己的數(shù)據(jù)庫變化產(chǎn)生的倍奢,有點(diǎn)接力的感覺朴上,稱為中繼日志,即relay log卒煞。

可以發(fā)現(xiàn)痪宰,通過上面的機(jī)制,可以保證MYSQL-A和MYSQL-B的數(shù)據(jù)庫數(shù)據(jù)一致畔裕,但是時(shí)間上肯定有延遲酵镜,即MYSQL-B的數(shù)據(jù)是滯后的。

【即便不考慮什么網(wǎng)絡(luò)的因素柴钻,MYSQL-A的數(shù)據(jù)庫操作是可以并發(fā)的執(zhí)行的淮韭,但是MYSQL-B只能從relay log中讀一條,執(zhí)行下贴届。因此MYSQL-A的寫操作很頻繁靠粪,MYSQL-B很可能跟不上『硫荆】

2.主從復(fù)制的幾種方式

同步復(fù)制

所謂的同步復(fù)制占键,意思是master的變化,必須等待slave-1,slave-2,...,slave-n完成后才能返回元潘。

這樣畔乙,顯然不可取,也不是MYSQL復(fù)制的默認(rèn)設(shè)置翩概。比如牲距,在WEB前端頁面上,用戶增加了條記錄钥庇,需要等待很長時(shí)間牍鞠。

異步復(fù)制

如同AJAX請(qǐng)求一樣。master只需要完成自己的數(shù)據(jù)庫操作即可评姨。至于slaves是否收到二進(jìn)制日志难述,是否完成操作,不用關(guān)心。MYSQL的默認(rèn)設(shè)置胁后。

半同步復(fù)制

master只保證slaves中的一個(gè)操作成功店读,就返回,其他slave不管攀芯。

這個(gè)功能屯断,是由google為MYSQL引入的。

3.主從復(fù)制分析

問題1:master的寫操作敲才,slaves被動(dòng)的進(jìn)行一樣的操作裹纳,保持?jǐn)?shù)據(jù)一致性择葡,那么slave是否可以主動(dòng)的進(jìn)行寫操作紧武?

假設(shè)slave可以主動(dòng)的進(jìn)行寫操作,slave又無法通知master敏储,這樣就導(dǎo)致了master和slave數(shù)據(jù)不一致了阻星。因此slave不應(yīng)該進(jìn)行寫操作,至少是slave上涉及到復(fù)制的數(shù)據(jù)庫不可以寫已添。實(shí)際上妥箕,這里已經(jīng)揭示了讀寫分離的概念。

問題2:主從復(fù)制中更舞,可以有N個(gè)slave,可是這些slave又不能進(jìn)行寫操作畦幢,要他們干嘛?

可以實(shí)現(xiàn)數(shù)據(jù)備份缆蝉。

類似于高可用的功能宇葱,一旦master掛了,可以讓slave頂上去刊头,同時(shí)slave提升為master黍瞧。

異地容災(zāi),比如master在北京原杂,地震掛了印颤,那么在上海的slave還可以繼續(xù)。

主要用于實(shí)現(xiàn)scale out,分擔(dān)負(fù)載,可以將讀的任務(wù)分散到slaves上穿肄。

【很可能的情況是年局,一個(gè)系統(tǒng)的讀操作遠(yuǎn)遠(yuǎn)多于寫操作,因此寫操作發(fā)向master咸产,讀操作發(fā)向slaves進(jìn)行操作】

問題3:主從復(fù)制中有master,slave1,slave2,...等等這么多MYSQL數(shù)據(jù)庫某宪,那比如一個(gè)JAVA WEB應(yīng)用到底應(yīng)該連接哪個(gè)數(shù)據(jù)庫?

當(dāng)然观蓄,我們?cè)趹?yīng)用程序中可以這樣皆串,insert/delete/update這些更新數(shù)據(jù)庫的操作,用connection(for master)進(jìn)行操作蒙幻,select用connection(for slaves)進(jìn)行操作。那我們的應(yīng)用程序還要完成怎么從slaves選擇一個(gè)來執(zhí)行select衣迷,例如簡單的輪循算法畏鼓。

這樣的話,相當(dāng)于應(yīng)用程序完成了SQL語句的路由壶谒,而且與MYSQL的主從復(fù)制架構(gòu)非常關(guān)聯(lián)云矫,一旦master掛了,某些slave掛了汗菜,那么應(yīng)用程序就要修改了让禀。能不能讓應(yīng)用程序與MYSQL的主從復(fù)制架構(gòu)沒有什么太多關(guān)系呢?可以看下面的圖:

找一個(gè)組件陨界,application program只需要與它打交道巡揍,用它來完成MYSQL的代理,實(shí)現(xiàn)SQL語句的路由菌瘪。

mysql proxy并不負(fù)責(zé)腮敌,怎么從眾多的slaves挑一個(gè)?可以交給另一個(gè)組件(比如haproxy)來完成俏扩。

這就是所謂的MYSQL READ WRITE SPLITE糜工,MYSQL的讀寫分離。

問題4:如果mysql proxy , direct , master他們中的某些掛了怎么辦录淡?

總統(tǒng)一般都會(huì)弄個(gè)副總統(tǒng)捌木,以防不測。同樣的嫉戚,可以給這些關(guān)鍵的節(jié)點(diǎn)來個(gè)備份刨裆。

問題5:當(dāng)master的二進(jìn)制日志每產(chǎn)生一個(gè)事件,都需要發(fā)往slave彼水,如果我們有N個(gè)slave,那是發(fā)N次崔拥,還是只發(fā)一次?

如果只發(fā)一次凤覆,發(fā)給了slave-1链瓦,那slave-2,slave-3,...它們?cè)趺崔k?

顯然盯桦,應(yīng)該發(fā)N次慈俯。實(shí)際上,在MYSQL master內(nèi)部拥峦,維護(hù)N個(gè)線程贴膘,每一個(gè)線程負(fù)責(zé)將二進(jìn)制日志文件發(fā)往對(duì)應(yīng)的slave。master既要負(fù)責(zé)寫操作略号,還的維護(hù)N個(gè)線程刑峡,負(fù)擔(dān)會(huì)很重洋闽。可以這樣突梦,slave-1是master的從诫舅,slave-1又是slave-2,slave-3,...的主,同時(shí)slave-1不再負(fù)責(zé)select宫患。slave-1將master的復(fù)制線程的負(fù)擔(dān)刊懈,轉(zhuǎn)移到自己的身上。這就是所謂的多級(jí)復(fù)制的概念娃闲。

問題6:當(dāng)一個(gè)select發(fā)往mysql proxy虚汛,可能這次由slave-2響應(yīng),下次由slave-3響應(yīng)皇帮,這樣的話卷哩,就無法利用查詢緩存了。

應(yīng)該找一個(gè)共享式的緩存玲献,比如memcache來解決殉疼。將slave-2,slave-3,...這些查詢的結(jié)果都緩存至mamcache中梯浪。

問題7:隨著應(yīng)用的日益增長捌年,讀操作很多,我們可以擴(kuò)展slave挂洛,但是如果master滿足不了寫操作了礼预,怎么辦呢?

scale on ?更好的服務(wù)器虏劲? 沒有最好的托酸,只有更好的,太貴了柒巫。励堡。。

scale out ? 主從復(fù)制架構(gòu)已經(jīng)滿足不了堡掏。

可以分庫【垂直拆分】应结,分表【水平拆分】。


轉(zhuǎn)自:http://blog.51cto.com/zhangfengzhe/1563032

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泉唁,一起剝皮案震驚了整個(gè)濱河市鹅龄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亭畜,老刑警劉巖扮休,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拴鸵,居然都是意外死亡玷坠,警方通過查閱死者的電腦和手機(jī)蜗搔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來八堡,“玉大人碍扔,你說我怎么就攤上這事★踔兀” “怎么了不同?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溶耘。 經(jīng)常有香客問我二拐,道長,這世上最難降的妖魔是什么凳兵? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任百新,我火速辦了婚禮,結(jié)果婚禮上庐扫,老公的妹妹穿的比我還像新娘饭望。我一直安慰自己,他們只是感情好形庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布铅辞。 她就那樣靜靜地躺著,像睡著了一般萨醒。 火紅的嫁衣襯著肌膚如雪斟珊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天富纸,我揣著相機(jī)與錄音囤踩,去河邊找鬼。 笑死晓褪,一個(gè)胖子當(dāng)著我的面吹牛堵漱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涣仿,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勤庐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了变过?” 一聲冷哼從身側(cè)響起埃元,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媚狰,沒想到半個(gè)月后岛杀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崭孤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年类嗤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糊肠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遗锣,死狀恐怖货裹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情精偿,我是刑警寧澤弧圆,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站笔咽,受9級(jí)特大地震影響搔预,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叶组,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一拯田、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甩十,春花似錦船庇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至达吞,卻和暖如春张弛,著一層夾襖步出監(jiān)牢的瞬間荒典,已是汗流浹背酪劫。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寺董,地道東北人覆糟。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像遮咖,于是被迫代替她去往敵國和親滩字。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容