貼一些比較老的內(nèi)容,文章是新寫的,技術(shù)可能都是大家熟悉的,給入門的兄弟們參考。高手輕拍
原文請(qǐng)見:http://www.muduo.net/index.php/u ... space-itemid-318728
二、
多數(shù)據(jù)中心的高可用結(jié)構(gòu)【環(huán)狀星型數(shù)據(jù)庫(kù)架構(gòu)】在介紹該結(jié)構(gòu)之前,我們首先了解一下mysql復(fù)制的有關(guān)內(nèi)容。在《highperformance mysql》的第一版中,作者介紹了這樣的一種數(shù)據(jù)庫(kù)結(jié)構(gòu):
![]()
三個(gè)mysql的daemon均為上家的slave,均為下家的master,環(huán)形復(fù)制,如此,則生生不息。
每個(gè)環(huán)路上的master分別有自己的slave,解決mysql的效率和可用性的問(wèn)題。
遺憾的是,Jeremy的想象力夠豐富,但是當(dāng)時(shí)mysql的最新版本為 4.0,并不支持如此復(fù)雜的mysql復(fù)制結(jié)構(gòu),缺少關(guān)鍵環(huán)節(jié)的解決方案,有哪些關(guān)鍵環(huán)節(jié)呢?
i.
Auto_increment 字段沖突問(wèn)題
ii.
如上圖,4(mysql服務(wù)器3的slave)從3(mysql服務(wù)器4的master)復(fù)制數(shù)據(jù),只能復(fù)制應(yīng)用程序在3上寫入的數(shù)據(jù)(即3產(chǎn)生了binlog),對(duì)于3(此時(shí)作為mysql服務(wù)器2 的slave)在2(作為mysql服務(wù)器3的master)那里復(fù)制得來(lái)的數(shù)據(jù),無(wú)法復(fù)制到服務(wù)器4上的。
iii.
環(huán)形復(fù)制本地產(chǎn)生數(shù)據(jù)重復(fù)寫入的問(wèn)題
就是上面三個(gè)當(dāng)時(shí)無(wú)法解決的問(wèn)題,Jeremy在《high performance mysql》中的整章內(nèi)容幾乎變成想像。
我相信如今的mysql 5的設(shè)計(jì)一定是吸收了Jeremy的構(gòu)想的。
(一)
架構(gòu)圖
結(jié)合《單數(shù)據(jù)中心的mysql高可用架構(gòu)》和mysql5的特性,我們?cè)O(shè)計(jì)出了如下的多數(shù)據(jù)中心mysql高可用結(jié)構(gòu),即環(huán)狀星型結(jié)構(gòu)。
![]()
(二)
系統(tǒng)結(jié)構(gòu)說(shuō)明
如上圖所示,假設(shè)A、B、C、D 4個(gè)數(shù)據(jù)中心,每個(gè)數(shù)據(jù)中心都擁有同樣的應(yīng)用程序(不限于web服務(wù)),各個(gè)數(shù)據(jù)中心的應(yīng)用程序按照《單數(shù)據(jù)中心的mysql高可用架構(gòu)》中提到的方案直接讀寫本地的數(shù)據(jù)庫(kù)數(shù)據(jù)。
此時(shí),在確保單數(shù)據(jù)中心高可用的基礎(chǔ)上,我們將結(jié)構(gòu)簡(jiǎn)化,簡(jiǎn)化為如下結(jié)構(gòu):
![]()
A、B、C、D是一個(gè)十分簡(jiǎn)潔的mysql復(fù)制環(huán),滿足這個(gè)復(fù)制結(jié)構(gòu)正常運(yùn)行需要在如下方面進(jìn)行配置:
ii.
當(dāng)同一臺(tái)機(jī)器作為slave且作為master的情況下,解決復(fù)制的內(nèi)容能夠被傳送到下一臺(tái)slave
iii.
解決某一數(shù)據(jù)從A復(fù)制到B,從B復(fù)制到C,從C復(fù)制到D,但是不會(huì)從D復(fù)制到A
下面將詳細(xì)的介紹如何解決上面的問(wèn)題:
i.
AUTO_INCREMENT字段沖突的問(wèn)題
![]()
ii.
--log-slave-updates
一般情況下,slave服務(wù)器不需要(也不會(huì))將它從master服務(wù)器那里接收到的“更新”記錄到binlog里面,但是這個(gè)系統(tǒng)變量能夠讓mysql的slave服務(wù)器記錄這些“更新”到自己的binlog。在使用這個(gè)變量的情況下,需要首先配置mysql的“--log-bin”變量。
iii.
--replicate-same-server-id
默認(rèn)情況下,這個(gè)值被置成0。以避免在環(huán)形復(fù)制結(jié)構(gòu)中出現(xiàn)的無(wú)限循環(huán)復(fù)制。
Ok,在普通復(fù)制結(jié)構(gòu)的基礎(chǔ)上,經(jīng)過(guò)上面的三點(diǎn)額外配置,mysql環(huán)形復(fù)制即可以正常工作。如上圖的A、B、C、D4臺(tái)mysql環(huán)形復(fù)制結(jié)構(gòu),可以在任意一個(gè)mysqld服務(wù)中插入、更新數(shù)據(jù),而在任一mysqld服務(wù)器中,可以查到所有的數(shù)據(jù)。當(dāng)然,對(duì)于滿足環(huán)狀星型高可用mysql數(shù)據(jù)庫(kù)架構(gòu)來(lái)講,還需要進(jìn)一步解決:
i.
任一mysql集群(如A)的master服務(wù)的高可用(通過(guò)heart-beat實(shí)現(xiàn)虛擬IP地址的漂移,通過(guò)漂移IP實(shí)現(xiàn))
ii.
數(shù)據(jù)庫(kù)各組之間間數(shù)據(jù)連通性及可靠性問(wèn)題【針對(duì)業(yè)務(wù)要求,指定不同的標(biāo)準(zhǔn)】
a)
通過(guò) UDT網(wǎng)關(guān)進(jìn)行傳輸層代理
b)
通過(guò)專線進(jìn)行解決
iii.
解決mysql binlog傳輸?shù)膸拞?wèn)題,該問(wèn)題考慮下面兩種解決方法:
a)
通過(guò)--slave_compressed_protocol ,在mysql 主、從服務(wù)器之間使用協(xié)議壓縮,降低帶寬要求:
1.
slave_compressed_protocol=1
2.
SET @@global.slave_compressed_protocol=1;
b)
通過(guò)開發(fā)mysql 差異化復(fù)制協(xié)議(如互動(dòng)社區(qū)的binlog項(xiàng)目)
Mysql的環(huán)狀星型多數(shù)據(jù)中心結(jié)構(gòu)能夠解決如下的問(wèn)題:
i.
解決由于跨網(wǎng)操作數(shù)據(jù)反應(yīng)慢的問(wèn)題,數(shù)據(jù)更新在本地IDC進(jìn)行,確保動(dòng)態(tài)程序快速、及時(shí)。
ii.
解決數(shù)據(jù)中心的冗余問(wèn)題,如果某一個(gè)IDC的數(shù)據(jù)中心宕到,可隨時(shí)切換到另外的數(shù)據(jù)中心。
當(dāng)然,這種結(jié)構(gòu)也不是完美的,在解決了一些問(wèn)題的同時(shí),也會(huì)帶來(lái)一些其他的問(wèn)題:
i.
數(shù)據(jù)同步延遲,跨IDC的數(shù)據(jù)庫(kù)同步相比同網(wǎng)的mysql復(fù)制,網(wǎng)絡(luò)環(huán)境更為復(fù)雜,由于binlog的傳輸問(wèn)題,容易帶來(lái)更大的數(shù)據(jù)延遲
ii.
穩(wěn)定性,需要強(qiáng)健的監(jiān)控和較為復(fù)雜的自動(dòng)化報(bào)警、故障處理措施
[ 本帖最后由 平凡的香草 于 2009-2-13 18:20 編輯 ] |