多數據中心的高可用結構【環狀星型數據庫架構】

貼一些比較老的內容,文章是新寫的,技術可能都是大家熟悉的,給入門的兄弟們參考。高手輕拍
原文請見:http://www.muduo.net/index.php/u ... space-itemid-318728

二、
多數據中心的高可用結構【環狀星型數據庫架構】在介紹該結構之前,我們首先了解一下mysql複製的有關內容。在《highperformance mysql》的第一版中,作者介紹了這樣的一種數據庫結構:

                              
三個mysqldaemon均爲上家的slave,均爲下家的master,環形複製,如此,則生生不息。

每個環路上的master分別有自己的slave,解決mysql的效率和可用性的問題。

遺憾的是,Jeremy的想象力夠豐富,但是當時mysql的最新版本爲 4.0,並不支持如此複雜的mysql複製結構,缺少關鍵環節的解決方案,有哪些關鍵環節呢?

i.
Auto_increment 字段衝突問題

ii.
如上圖,4mysql服務器3slave)從3mysql服務器4master)複製數據,只能複製應用程序在3上寫入的數據(即3產生了binlog),對於3(此時作爲mysql服務器2 slave)在2(作爲mysql服務器3master)那裏複製得來的數據,無法複製到服務器4上的。

iii.
環形複製本地產生數據重複寫入的問題

就是上面三個當時無法解決的問題,Jeremy在《high performance mysql》中的整章內容幾乎變成想像。

我相信如今的mysql 5設計一定是吸收了Jeremy的構想的。

(一)
架構圖
結合《單數據中心的mysql高可用架構》和mysql5的特性,我們設計出瞭如下的多數據中心mysql高可用結構,即環狀星型結構。




(二)
系統結構說明
如上圖所示,假設ABCD 4個數據中心,每個數據中心都擁有同樣的應用程序(不限於web服務),各個數據中心的應用程序按照《單數據中心的mysql高可用架構》中提到的方案直接讀寫本地的數據庫數據。
此時,在確保單數據中心高可用的基礎上,我們將結構簡化,簡化爲如下結構:




ABCD是一個十分簡潔的mysql複製環,滿足這個複製結構正常運行需要在如下方面進行配置:



i.
解決auto_increment字段數據衝突的問題,通過http://dev.mysql.com/doc/refman/5.1/en/replication-options-master.html#sysvar_auto_increment_increment



ii.
當同一臺機器作爲slave且作爲master的情況下,解決複製的內容能夠被傳送到下一臺slave



iii.
解決某一數據從A複製到B,從B複製到C,從C複製到D,但是不會從D複製到A





下面將詳細的介紹如何解決上面的問題:



i.
AUTO_INCREMENT字段衝突的問題









auto_increment_increment auto_increment_offset 這兩個系統變量是爲了滿足masterßàmaster 這種mysql複製模式產生的,這兩個變量能夠控制AUTO_INCREMENT 列的行爲,避免 AUTO_INCREMENT 列的value產生衝突。關於這部分的詳細內容,建議參考:http://dev.mysql.com/doc/refman/5.1/en/replication-options-master.html#sysvar_auto_increment_increment



ii.
--log-slave-updates


一般情況下,slave服務器不需要(也不會)將它從master服務器那裏接收到的“更新”記錄到binlog裏面,但是這個系統變量能夠讓mysqlslave服務器記錄這些“更新”到自己的binlog。在使用這個變量的情況下,需要首先配置mysql的“--log-bin”變量。



iii.
--replicate-same-server-id


默認情況下,這個值被置成0。以避免在環形複製結構中出現的無限循環複製。


Ok,在普通複製結構的基礎上,經過上面的三點額外配置,mysql環形複製即可以正常工作。如上圖的ABCD4mysql環形複製結構,可以在任意一個mysqld服務中插入、更新數據,而在任一mysqld服務器中,可以查到所有的數據。當然,對於滿足環狀星型高可用mysql數據庫架構來講,還需要進一步解決:



i.
任一mysql集羣(如A)的master服務的高可用(通過heart-beat實現虛擬IP地址的漂移,通過漂移IP實現)



ii.
數據庫各組之間間數據連通性及可靠性問題【針對業務要求,指定不同的標準】


a)
通過 UDT網關進行傳輸層代理


b)
通過專線進行解決



iii.
解決mysql binlog傳輸的帶寬問題,該問題考慮下面兩種解決方法:


a)
通過--slave_compressed_protocol ,在mysql 主、從服務器之間使用協議壓縮,降低帶寬要求:


1.
slave_compressed_protocol=1


2.
SET @@global.slave_compressed_protocol=1;

b)
通過開發mysql 差異化複製協議(如互動社區的binlog項目





Mysql的環狀星型多數據中心結構能夠解決如下的問題



i.
解決由於跨網操作數據反應慢的問題,數據更新在本地IDC進行,確保動態程序快速、及時。



ii.
解決數據中心的冗餘問題,如果某一個IDC的數據中心宕到,可隨時切換到另外的數據中心。


當然,這種結構也不是完美的,在解決了一些問題的同時,也會帶來一些其他的問題:



i.
數據同步延遲,跨IDC的數據庫同步相比同網的mysql複製,網絡環境更爲複雜,由於binlog的傳輸問題,容易帶來更大的數據延遲



ii.
穩定性,需要強健的監控和較爲複雜的自動化報警、故障處理措施

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章