《如何打造MySQL高可用平臺(tái)》要點(diǎn):
本文介紹了如何打造MySQL高可用平臺(tái),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
相關(guān)主題:MYSQL高可用 / MYSQL調(diào)優(yōu)
原文:http://www.jianshu.com/p/bc50221972ca
作者:何約什
筆者剛開(kāi)始進(jìn)入公司的時(shí)候,主要是忙于分布式MySQL系統(tǒng)----MyShard的構(gòu)建,公司使用了大量的IDC機(jī)房,基于這種網(wǎng)絡(luò)特點(diǎn),MyShard設(shè)計(jì)當(dāng)初完全是為了是一套支持Multi-Master操作的高可用性的分布式數(shù)據(jù)庫(kù),可以在多個(gè)機(jī)房中部署的業(yè)務(wù)上提供快速的寫(xiě)操作,實(shí)現(xiàn)了分布式高可用存儲(chǔ)能力。
在業(yè)務(wù)增長(zhǎng)期,MyShard解決了公司的很多大型的數(shù)據(jù)庫(kù)存儲(chǔ)業(yè)務(wù),隨著公司業(yè)務(wù)逐漸穩(wěn)定下來(lái),分布式存儲(chǔ)需求越來(lái)越少。而公司卻有大量的小業(yè)務(wù)以及不斷嘗試的各種新業(yè)務(wù),需要越來(lái)越多的小數(shù)據(jù)量的數(shù)據(jù)庫(kù)存儲(chǔ)。
所以這時(shí)候發(fā)現(xiàn),之前的工作方向一直集中在公司的10%不到的業(yè)務(wù)上,而公司的90%以上的存儲(chǔ)需求是MySQL的需求,目前有好上千套的MySQL在給不同的業(yè)務(wù)提供服務(wù)。而在當(dāng)時(shí),不管是MySQL的交付還是管理都比較原始,極端情況下,我們需要業(yè)務(wù)申請(qǐng)方自己提供服務(wù)器來(lái)部署MySQL,所以交付的周期也很長(zhǎng)。而在高可用方面,都是需要業(yè)務(wù)方自己去處理主從切換等等問(wèn)題,出現(xiàn)主數(shù)據(jù)庫(kù)故障的時(shí)候,往往需要業(yè)務(wù)方自己去修改配置文件,重啟進(jìn)程,增加了服務(wù)的中斷時(shí)間。
業(yè)界比較流行的MySQL的高可用方案主要有:MMM和MHA兩種,對(duì)這個(gè)方案的分析網(wǎng)上有很多,MHA是優(yōu)先選取的方案。
clipboard.png
當(dāng)master出現(xiàn)故障時(shí),通過(guò)對(duì)比slave之間I/O線(xiàn)程讀取master binlog的位置,選取最接近的slave做為latestslave。其它slave通過(guò)與latest slave對(duì)比生成差異中繼日志。在latest slave上應(yīng)用從master保存的binlog,同時(shí)將latest slave提升為master。最后在其它slave上應(yīng)用相應(yīng)的差異中繼日志并開(kāi)始從新的master開(kāi)始復(fù)制。
在MHA實(shí)現(xiàn)Master故障切換過(guò)程中,MHA Node會(huì)試圖訪(fǎng)問(wèn)故障的master(通過(guò)SSH),如果可以訪(fǎng)問(wèn)(不是硬件故障,比如InnoDB數(shù)據(jù)文件損壞等),會(huì)保存二進(jìn)制文件,以最大程度保證數(shù)據(jù)不丟失。MHA和半同步復(fù)制一起使用會(huì)大大降低數(shù)據(jù)丟失的危險(xiǎn)。
MHA提供了一個(gè)通用的框架,我們可以自定義判斷和切換操作的步驟;而且,MHA的代碼開(kāi)源,我們甚至可以進(jìn)行二次開(kāi)發(fā),這都為高可用系統(tǒng)提供了很好的擴(kuò)展 能力。
需要在各個(gè)節(jié)點(diǎn)間打通ssh信任,這對(duì)某些公司安全制度來(lái)說(shuō)是個(gè)挑戰(zhàn),因?yàn)槿绻硞€(gè)節(jié)點(diǎn)被黑客攻破的話(huà),其他節(jié)點(diǎn)也會(huì)跟著遭殃;
自帶提供的腳本還需要進(jìn)一步補(bǔ)充完善,當(dāng)然了,一般的使用還是夠用的。
雖然一個(gè)MHA Manger可以管理多個(gè)集群,但是沒(méi)有大規(guī)模集群的經(jīng)驗(yàn)。
高可用依賴(lài)于vip的方案,譬如采用keepalive來(lái)達(dá)到vip的切換,但是keepalive會(huì)限制切換的主機(jī)必須在一個(gè)網(wǎng)段,對(duì)于跨機(jī)房不在一個(gè)網(wǎng)段的服務(wù)器來(lái)說(shuō),就無(wú)法支持了。在大規(guī)模為每個(gè)MySQL集群安排一個(gè)vip也是難以實(shí)現(xiàn)的。keepalive在一個(gè)網(wǎng)段內(nèi),部署多套也會(huì)互相影響。
我們公司的數(shù)據(jù)庫(kù)的特點(diǎn):
數(shù)據(jù)庫(kù)多機(jī)房部署
數(shù)據(jù)庫(kù)集群規(guī)模上千
安全性考慮
除了MMM和MHA之外,MySQL還可以采用代理來(lái)實(shí)現(xiàn)高可用,MySQL代理會(huì)比MHA方案更適合大規(guī)模的使用。
當(dāng)時(shí)阿里和騰訊分別推出了rds和cdb。我們研究了騰訊的cdb方案,cdb是基于TGW也即是NAT的模式實(shí)現(xiàn)了4層代理模型,來(lái)達(dá)到MySQL的高可用以及負(fù)載均衡功能。
但是TGW方案有個(gè)比較大的問(wèn)題就是需要修改MySQL協(xié)議,一旦修改MySQL協(xié)議,所有的客戶(hù)端(各種語(yǔ)言的驅(qū)動(dòng))都需要進(jìn)行修改,這在推廣上是非常難的。
所以我們采用了一種折中的方案,啟動(dòng)了RDS項(xiàng)目,主要用于提供MySQL內(nèi)部云服務(wù),其中高可用方案如下圖所示,采用了iptables的NAT來(lái)實(shí)現(xiàn)MySQL的代理路由功能。
clipboard.png
業(yè)務(wù)方首先連接到代理服務(wù)器上,由于代理服務(wù)器上有NAT目標(biāo)地址轉(zhuǎn)換規(guī)則,所以會(huì)轉(zhuǎn)到目標(biāo)MySQL主機(jī)上,同時(shí)從MySQL主機(jī)回包到代理服務(wù)器后,由于有NAT源地址轉(zhuǎn)換規(guī)則,又會(huì)轉(zhuǎn)發(fā)回業(yè)務(wù)方,從而實(shí)現(xiàn)了代理功能。
下面舉例說(shuō)明我們?nèi)绾螢橐粋€(gè)業(yè)務(wù)啟動(dòng)RDS四層代理:
我們先準(zhǔn)備好以下幾臺(tái)機(jī)器:
客戶(hù)端:172.26.14.16
代理 :172.26.82.45 啟動(dòng)業(yè)務(wù)代理端口20000
目標(biāo)機(jī)器:172.26.82.7 部署MySQL 端口號(hào)為3306
在代理機(jī)器上設(shè)置規(guī)則:
1、打開(kāi)forward
echo 1 > /proc/sys/net/ipv4/ip_forward2、設(shè)置從客戶(hù)端請(qǐng)求的目標(biāo)地址和原地址轉(zhuǎn)換規(guī)則
iptables -t nat -A PREROUTING -p tcp -s 172.26.14.16 --dport 3306 -j DNAT --to-destination 172.26.82.7:20000
iptables -t nat -A POSTROUTING -p tcp -d 172.26.82.7 --dport 20000 -j SNAT --to-source 172.26.82.453、設(shè)置好規(guī)則之后,就可以通過(guò)mysql來(lái)連接到代理的20000端口了。
mysql -utest -ptest -h172.26.82.45 -P20000
這時(shí)候,實(shí)際訪(fǎng)問(wèn)的是172.26.82.7上3306端口的MySQL數(shù)據(jù)庫(kù)。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/34.html