MySQL高可用的几种方案
首先我們看看MySQL高可用的幾種方案:
?
對(duì)于數(shù)據(jù)實(shí)時(shí)性要求不是特別嚴(yán)格的應(yīng)用,只需要通過廉價(jià)的pc server 來擴(kuò)展Slave 的數(shù)量,將讀壓力分散到多臺(tái)Slave 的機(jī)器上面,即可通過分散單臺(tái)數(shù)據(jù)庫服務(wù)器的讀壓力來解決數(shù)據(jù)庫端的讀性能瓶頸,畢竟在大多數(shù)數(shù)據(jù)庫應(yīng)用系統(tǒng)中的讀壓力還是要比寫壓力大很多。這在很大程度上解決了目前很多中小型網(wǎng)站的數(shù)據(jù)庫壓力瓶頸問題,甚至有些大型網(wǎng)站也在使用類似方案解決數(shù)據(jù)庫瓶頸。
MySQL Cluster由一組計(jì)算機(jī)構(gòu)成,每臺(tái)計(jì)算機(jī)上均運(yùn)行著多種進(jìn)程,包括MySQL服務(wù)器,NDB Cluster 的數(shù)據(jù)節(jié)點(diǎn),管理服務(wù)器,以及(可能)專門的數(shù)據(jù)訪問程序。NDB” 是一種“內(nèi)存中”的存儲(chǔ)引擎,它具有可用性高和數(shù)據(jù)一致性好的特點(diǎn)。MySQL Cluster要實(shí)現(xiàn)完全冗余和容錯(cuò),至少需要 4臺(tái)物理主機(jī),其中兩個(gè)為管理節(jié)點(diǎn)。MySQL Cluster使用不那么廣泛,除了自身構(gòu)架因素、適用的業(yè)務(wù)有限之外,另一個(gè)重要的原因是其安裝配置管理相對(duì)復(fù)雜繁瑣,總共有幾十個(gè)操作步驟,需要DBA花費(fèi)幾個(gè)小時(shí)才能搭建或完成。重啟 MySQL Cluster 數(shù)據(jù)庫的管理操作之前需要執(zhí)行 46 個(gè)手動(dòng)命令,需要耗費(fèi) DBA 2.5 小時(shí)的時(shí)間,而依靠MySQL Cluster Manager只需一個(gè)命令即可完成,但MySQL Cluster Manager 僅作為商用 MySQL Cluster 運(yùn)營(yíng)商級(jí)版本 (CGE) 數(shù)據(jù)庫的一部分提供,需要購(gòu)買。其官方的說明,若應(yīng)用中的SQL操作為主鍵數(shù)據(jù)庫訪問,包含一些 JOIN 操作而非對(duì)整個(gè)表執(zhí)行常規(guī)掃描和JOIN而返回?cái)?shù)萬行數(shù)據(jù),則適合Cluster,否則不合適,從這一條限制來看,表明大多數(shù)業(yè)務(wù)場(chǎng)景并不合適MySQL Cluster,業(yè)內(nèi)有資深人士也憑評(píng)價(jià):NDB不適合大多數(shù)業(yè)務(wù)場(chǎng)景,而且有安全問題。
heartbeat是Linux-HA工程的一個(gè)組件,heartbeat最核心的包括兩個(gè)部分:心跳監(jiān)測(cè)和資源接管。在指定的時(shí)間內(nèi)未收到對(duì)方發(fā)送的報(bào)文,那么就認(rèn)為對(duì)方失效,這時(shí)需啟動(dòng)資源接管模塊來接管運(yùn) 行在對(duì)方主機(jī)上的資源或者服務(wù)。
DRBD是通過網(wǎng)絡(luò)來實(shí)現(xiàn)塊設(shè)備的數(shù)據(jù)鏡像同步的一款開源Cluster軟件,它自動(dòng)完成網(wǎng)絡(luò)中兩個(gè)不同服務(wù)器上的磁盤同步,相對(duì)于binlog日志同步,它是更底層的磁盤同步,理論上DRDB適合很多文件型系統(tǒng)的高可用。
Lvs是一個(gè)虛擬的服務(wù)器集群系統(tǒng),可以實(shí)現(xiàn)LINUX平臺(tái)下的簡(jiǎn)單負(fù)載均衡。keepalived是一個(gè)類似于layer3, 4 & 5交換機(jī)制的軟件,主要用于主機(jī)與備機(jī)的故障轉(zhuǎn)移,這是一種適用面很廣的負(fù)載均衡和高可用方案,最常用于Web系統(tǒng)。
這種gluster模式可以說是全新的一種高可用方案,前面也提到其優(yōu)點(diǎn),它的缺點(diǎn)不多,不支持XA,不支持Lock Table,只能用InnoDB引擎。
Mycat高可用方案
Mycat作為一個(gè)代理層中間件,Mycat系統(tǒng)的高可用涉及到Mycat本身的高可用以及后端MySQL的高可用,前面章節(jié)所講的MySQL高可用方案都可以在此用來確保Mycat所連接的后端MySQL服務(wù)的高可用性。在大多數(shù)情況下,建議采用標(biāo)準(zhǔn)的MySQL主從復(fù)制高可用性配置并交付給Mycat來完成后端MySQL節(jié)點(diǎn)的主從自動(dòng)切換。
如圖所示,MySQL節(jié)點(diǎn)開啟主從復(fù)制的配置方案,并將主節(jié)點(diǎn)配置為Mycat的dataHost里的writeNode,從節(jié)點(diǎn)配置為readNode,同時(shí)Mycat內(nèi)部定期對(duì)一個(gè)dataHost里的所有writeHost與readHost節(jié)點(diǎn)發(fā)起心跳檢測(cè),正常情況下,Mycat會(huì)將第一個(gè)writeHost作為寫節(jié)點(diǎn),所有的DML SQL會(huì)發(fā)送給此節(jié)點(diǎn),若Mycat開啟了讀寫分離,則查詢節(jié)點(diǎn)會(huì)根據(jù)讀寫分離的策略發(fā)往readHost(+writeHost)執(zhí)行,當(dāng)一個(gè)dataHost里面配置了兩個(gè)或多個(gè)writeHost的情況下,如果第一個(gè)writeHost宕機(jī),則Mycat會(huì)在默認(rèn)的3次心跳檢查失敗后,自動(dòng)切換到下一個(gè)可用的writeHost執(zhí)行DML SQL語句,并在conf/dnindex.properties文件里記錄當(dāng)前所用的writeHost的index(第一個(gè)為0,第二個(gè)為1,依次類推),注意,此文件不能刪除和擅自改變,除非你深刻理解了它的作用以及你的目的。
那么問題來了,當(dāng)原來配置的MySQL寫節(jié)點(diǎn)宕機(jī)恢復(fù)以后,怎么重新加入Mycat,要不要恢復(fù)為原來的寫節(jié)點(diǎn)?關(guān)于這個(gè)問題,我們也曾與DBA討論很久,最終的建議方案是,保持現(xiàn)有狀態(tài)不變,改旗易幟,恢復(fù)后的MySQL節(jié)點(diǎn)作為從節(jié)點(diǎn),跟隨新的主節(jié)點(diǎn),重新配置主從同步,原先跟隨該節(jié)點(diǎn)做同步的其他節(jié)點(diǎn)也同樣換帥,重新配置同步源,這些節(jié)點(diǎn)的數(shù)據(jù)手工完成同步以后,再加入Mycat里。目前1.3版本的Mycat還沒有實(shí)現(xiàn)監(jiān)控MySQL主從同步狀態(tài)的功能,因此這個(gè)過程里,DBA可以先修改MySQL的密碼,讓Mycat無法鏈接故障服務(wù)器,等同步完成以后,恢復(fù)密碼,這樣Mycat就自動(dòng)重新將修復(fù)好的Mycat納管進(jìn)來了。
說完了MySQL部分,接下來我們看看Mycat自身的高可用性,由于Mycat自身是屬于無狀態(tài)的中間件(除了主從切換過程中記錄的dnindex.properties文件),因此Mycat很容易部署為集群方式,提供高可用方案。原先有規(guī)劃Mycat-balance組件,專門用于Mycat負(fù)載均衡,但由于缺乏志愿者,也沒有經(jīng)過生產(chǎn)實(shí)踐驗(yàn)證,
因此暫時(shí)不建議使用,官方建議是采用基于硬件的負(fù)載均衡器或者軟件方式的HAproxy,HAProxy相比LVS的使用要簡(jiǎn)單很多,功能方面也很豐富,免費(fèi)開源,穩(wěn)定性也是非常好,可以與LVS相媲美,根據(jù)官方文檔,HAProxy可以跑滿10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),這個(gè)作為軟件級(jí)負(fù)載均衡,也是比較驚人的,下圖是HAproxy+Mycat集群+MySQL主從所組成的高可用性方案:
、
如果還擔(dān)心HAproxy的穩(wěn)定性和單點(diǎn)問題,則可以用keepalived的VIP的浮動(dòng)功能,加以強(qiáng)化:
Galary Cluster 配置
Mycat1.4.1 開始支持galary cluster 集群的配置,提高心跳可用。
配置如下: 1.4.1 開始支持MySQL 集群模式,讓讀更加安全可靠,配置如下: MyCAT心跳檢查語句配置為 show status like ‘wsrep%’ , dataHost 上定義兩個(gè)新屬性: switchType=”3” 此時(shí)意味著開啟MySQL集群復(fù)制狀態(tài)狀態(tài)綁定的讀寫分離與切換機(jī)制,Mycat心跳機(jī)制通過檢測(cè)集群復(fù)制時(shí)延時(shí),如果延時(shí)過大或者集群出現(xiàn)節(jié)點(diǎn)問題不會(huì)負(fù)載改節(jié)點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的MySQL高可用的几种方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基础数学问题
- 下一篇: 两种方式:mysql查看正在执行的sql