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