本篇文章中給大家?guī)砹岁P(guān)于mysql中高可用架構(gòu)技術(shù)分析的相關(guān)知識,其中主要介紹了MMM的技術(shù)分析、MySQL主從架構(gòu)以及Cluster的相關(guān)問題,希望對大家有幫助。
背景說明
隨著信息技術(shù)的發(fā)展,企業(yè)越來越依賴于信息化管理,各業(yè)務(wù)應(yīng)用的數(shù)據(jù)信息,主要存儲(chǔ)在數(shù)據(jù)庫中,企業(yè)對這些數(shù)據(jù)訪問的連續(xù)性要求越來越高,為了避免因?yàn)閿?shù)據(jù)的中斷導(dǎo)致各種損失,數(shù)據(jù)庫的高可用已成了企業(yè)信息化建設(shè)的重中之中。同時(shí),對于電信、金融、能源、軍工等等涉及國計(jì)民生的行業(yè)或領(lǐng)域的關(guān)鍵業(yè)務(wù)對于關(guān)鍵數(shù)據(jù)存儲(chǔ)都需要高可用,必須保證數(shù)據(jù)系統(tǒng)7×24小時(shí)全天候運(yùn)行,防止數(shù)據(jù)丟失、數(shù)據(jù)損壞。編程學(xué)習(xí)資料點(diǎn)擊領(lǐng)取
高可用架構(gòu)介紹
高可用架構(gòu)對于互聯(lián)網(wǎng)服務(wù)基本是標(biāo)配,無論是應(yīng)用服務(wù)還是數(shù)據(jù)庫服務(wù)都需要做到高可用。對于一個(gè)系統(tǒng)而言,可能包含很多模塊,比如前端應(yīng)用,緩存,數(shù)據(jù)庫,搜索,消息隊(duì)列等,每個(gè)模塊都需要做到高可用,才能保證整個(gè)系統(tǒng)的高可用。對于數(shù)據(jù)庫服務(wù)而言,高可用可能更復(fù)雜,對用戶的服務(wù)可用,不僅僅是能訪問,還需要有正確性保證,因此數(shù)據(jù)庫的高可用需要更加認(rèn)證對待。
MySQL高可用架構(gòu)分類
- MySQL實(shí)現(xiàn)高可用之MMM
- MySQL實(shí)現(xiàn)高可用之MHA
- MySQL實(shí)現(xiàn)高可用之主從架構(gòu)
- MySQL實(shí)現(xiàn)高可用之Cluster模式
MMM的技術(shù)分析
MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。
-
MMM使用Perl語言開發(fā),主要用來監(jiān)控和管理MySQL Master-Master(雙主)復(fù)制,雖然叫做雙主復(fù)制,但是業(yè)務(wù)上同一時(shí)刻只允許對一個(gè)主進(jìn)行寫入,另一臺備選主上提供部分讀服務(wù),以加速在主主切換時(shí)刻備選主的預(yù)熱
-
MMM的監(jiān)控端是會(huì)提供多個(gè)虛擬ip(vip),包括一個(gè)可寫的vip,多個(gè)可讀的vip,通過監(jiān)管的管理,這些ip會(huì)綁定在可用的mysql上,當(dāng)某一臺mysql宕機(jī)時(shí),會(huì)將vip遷移到其他mysql。
-
MMM這套腳本程序一方面實(shí)現(xiàn)了故障切換的功能,另一方面其內(nèi)部附加的工具腳本也可以實(shí)現(xiàn)多個(gè)slave的read負(fù)載均衡。
-
這個(gè)套件也能基于標(biāo)準(zhǔn)的主從配置的任意數(shù)量的從服務(wù)器進(jìn)行讀負(fù)載均衡,所以你可以用它來在一組居于復(fù)制的服務(wù)器啟動(dòng)虛擬ip,除此之外,它還有實(shí)現(xiàn)數(shù)據(jù)備份、節(jié)點(diǎn)之間重新同步功能的腳本。
MMM的基礎(chǔ)組件分析
- mmm_mond:監(jiān)控進(jìn)程,負(fù)責(zé)所有的監(jiān)控工作,決定和處理所有節(jié)點(diǎn)角色活動(dòng)。因此,腳本需要在監(jiān)管上運(yùn)行。
- mmm_agentd:運(yùn)行在每個(gè)msql服務(wù)器上的代理進(jìn)程,完成監(jiān)控的探針工作和執(zhí)行簡單的遠(yuǎn)端服務(wù)設(shè)置。此腳本需要在被監(jiān)管機(jī)上運(yùn)行。
- mmm_control:一個(gè)簡單的腳本,提供管理mmm_mond進(jìn)行的命令。
MMM實(shí)現(xiàn)基本實(shí)現(xiàn)原理
MMM提供了自動(dòng)和手動(dòng)兩種方式移除一組服務(wù)器中復(fù)制延遲較高的服務(wù)器的虛擬ip,同時(shí)它還可以備份數(shù)據(jù),實(shí)現(xiàn)兩節(jié)點(diǎn)之間的數(shù)據(jù)同步等。
MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實(shí)現(xiàn)服務(wù)器的故障轉(zhuǎn)移,從而實(shí)現(xiàn)mysql的高可用。
MMM的使用場景
由于MMM無法完全的保證數(shù)據(jù)一致性,所以MMM適用于對數(shù)據(jù)的一致性要求不是很高,但是又想最大程度的保證業(yè)務(wù)可用性的場景。
對于那些對數(shù)據(jù)的一致性要求很高的業(yè)務(wù),非常不建議采用MMM這種高可用架構(gòu)。
- MMM項(xiàng)目來自 Google:code.google.com/p/mysql-mas…
- 官方網(wǎng)站為:mysql-mmm.org
MHA簡介
MHA(Master High Availability)目前在MySQL高可用方面是一個(gè)相對成熟的解決方案,它由日本DeNA公司的youshimaton(現(xiàn)就職于Facebook公司)開發(fā),是一套優(yōu)秀的作為MySQL高可用性環(huán)境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內(nèi)自動(dòng)完成數(shù)據(jù)庫的故障切換操作,并且在進(jìn)行故障切換的過程中,MHA能在最大程度上保證數(shù)據(jù)的一致性,以達(dá)到真正意義上的高可用。
-
MHA是一款開源的MySQL高可用程序,MHA在監(jiān)控到master節(jié)點(diǎn)故障時(shí),會(huì)自動(dòng)提升其中擁有最新數(shù)據(jù)的slave節(jié)點(diǎn)成為新的master節(jié)點(diǎn)。
-
MHA會(huì)獲取其他節(jié)點(diǎn)的額外信息來避免一致性方面的問題,也就是MHA會(huì)獲取其他從節(jié)點(diǎn)中的數(shù)據(jù)信息,并將信息發(fā)給最接近主節(jié)點(diǎn)的從節(jié)點(diǎn),這樣主節(jié)點(diǎn)故障時(shí)會(huì)提升此從節(jié)點(diǎn)為主節(jié)點(diǎn),而此從節(jié)點(diǎn)擁有其他從節(jié)點(diǎn)所有的數(shù)據(jù)信息。
-
MHA還提供了master節(jié)點(diǎn)的在線切換功能,即按需切換master/slave節(jié)點(diǎn)。
MHA的基礎(chǔ)組件
MHA由兩部分組成:MHA Manager(管理節(jié)點(diǎn))和MHA Node(數(shù)據(jù)節(jié)點(diǎn))。
MHA Manager可以單獨(dú)部署在獨(dú)立的機(jī)器上管理多個(gè)master-slave集群,也可以部署在一臺slave節(jié)點(diǎn)上。
MHA的實(shí)現(xiàn)原理
- MHA Node運(yùn)行在每臺MySQL服務(wù)器上,MHA Manager會(huì)定時(shí)探測集群中的master節(jié)點(diǎn),當(dāng)master出現(xiàn)故障時(shí),它可以自動(dòng)將最新數(shù)據(jù)的slave提升為新的master,然后將所有其他的slave重新指向新的master。整個(gè)故障轉(zhuǎn)移過程對應(yīng)用程序完全透明。
- 在MHA自動(dòng)故障切換過程中,MHA試圖從宕機(jī)的主服務(wù)器上保存二進(jìn)制日志,最大程度的保證數(shù)據(jù)的不丟失,但這并不總是可行的。
- 例如,如果主服務(wù)器硬件故障或無法通過ssh訪問,MHA沒法保存二進(jìn)制日志,只進(jìn)行故障轉(zhuǎn)移而丟失了最新的數(shù)據(jù)。使用MySQL 5.5的半同步復(fù)制,可以降低數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
- MHA可以與半同步復(fù)制結(jié)合起來,如果只有一個(gè)slave已經(jīng)收到了最新的二進(jìn)制日志,MHA可以將最新的二進(jìn)制日志應(yīng)用于其他所有的slave服務(wù)器上,因此可以保證所有節(jié)點(diǎn)的數(shù)據(jù)一致性。
MHA的使用場景
目前MHA主要支持一主多從的架構(gòu)。
-
要搭建MHA,要求一個(gè)復(fù)制集群中必須最少有三臺數(shù)據(jù)庫服務(wù)器,一主二從,即一臺充當(dāng)master,一臺充當(dāng)備用master,另外一臺充當(dāng)從庫。
-
因?yàn)橹辽傩枰_服務(wù)器,出于機(jī)器成本的考慮,淘寶也在該基礎(chǔ)上進(jìn)行了改造,目前淘寶TMHA已經(jīng)支持一主一從。
-
從代碼層面看,MHA就是一套Perl腳本,那么相信以阿里系的技術(shù)實(shí)力,將MHA改成支持一主一從也并非難事。
MySQL主從架構(gòu)
此種架構(gòu),一般初創(chuàng)企業(yè)比較常用,也便于后面步步的擴(kuò)展
此架構(gòu)特點(diǎn)
- 成本低,布署快速、方便
- 讀寫分離
- 還能通過及時(shí)增加從庫來減少讀庫壓力
- 主庫單點(diǎn)故障
- 數(shù)據(jù)一致性問題(同步延遲造成)
- 高可用軟件可使用Heartbeat,全面負(fù)責(zé)VIP、數(shù)據(jù)與DRBD服務(wù)的管理
- 主故障后可自動(dòng)快速切換,并且從庫仍然能通過VIP與新主庫進(jìn)行數(shù)據(jù)同步
- 從庫也支持讀寫分離,可使用中間件或程序?qū)崿F(xiàn)
MySQL Cluster概述
MySQL Cluster技術(shù)在分布式系統(tǒng)中為MySQL提供了冗余特性,增強(qiáng)了安全性,可以的提高系統(tǒng)的可靠性和數(shù)據(jù)的有效性。MySQL集群需要一組計(jì)算機(jī),每臺計(jì)算機(jī)可以理解為一個(gè)節(jié)點(diǎn),這些節(jié)點(diǎn)的功能各不相同。MySQL Cluster按照功能來分,可以分為三種節(jié)點(diǎn):管理節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)和SQL節(jié)點(diǎn)。集群中的某臺計(jì)算機(jī)可以是某一個(gè)節(jié)點(diǎn),也可以是兩種或者三種節(jié)點(diǎn)的集合,這些節(jié)點(diǎn)組合在一起,為應(yīng)用提供具有高可靠性、高性能的Cluster數(shù)據(jù)管理;
目前企業(yè)數(shù)據(jù)量越來越大,所以對MySQL的要求進(jìn)一步提高,以前的大部分高可用方案通常存在一定的缺陷,例如MySQL Replication方案,Master是否存活檢測需要一定的時(shí)間,如果需要主從切換也需要一定的時(shí)間,因此高可用很大的程度上依賴于監(jiān)控軟件和自動(dòng)化管理工具。隨著MySQL Cluster的不斷發(fā)展,終于在性能和高可用上得到了很大的提高;
MySQL Cluster基本概念
MySQL Cluster簡單地講是一種MySQL集群的技術(shù),是由一組計(jì)算機(jī)構(gòu)成,每臺計(jì)算機(jī)可以存放一個(gè)或者多個(gè)節(jié)點(diǎn),其中包括MySQL服務(wù)器,DNB Cluster的數(shù)據(jù)節(jié)點(diǎn),管理其他節(jié)點(diǎn),以及專門的數(shù)據(jù)訪問程序,這些節(jié)點(diǎn)組合在一起,就可以為應(yīng)用提高可高性能、高可用性和可縮放性的Cluster數(shù)據(jù)管理;
MySQL Cluster的訪問過程大致是這樣的,應(yīng)用通常使用一定的負(fù)載均衡算法將對數(shù)據(jù)訪問分散到不同的SQL節(jié)點(diǎn),SQL節(jié)點(diǎn)對數(shù)據(jù)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)訪問并從數(shù)據(jù)節(jié)點(diǎn)返回?cái)?shù)據(jù)結(jié)果,管理節(jié)點(diǎn)僅僅只是對SQL節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)進(jìn)行配置管理;
理解MySQL Cluster節(jié)點(diǎn)
MySQL Cluster按照節(jié)點(diǎn)類型可以分為3種類型的節(jié)點(diǎn),分別是管理節(jié)點(diǎn)、SQL節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn),所有的這些節(jié)點(diǎn)構(gòu)成了一個(gè)完整的MySQL集群體系,事實(shí)上,數(shù)據(jù)保存在NDB存儲(chǔ)服務(wù)器的存儲(chǔ)引擎中,表結(jié)構(gòu)則保存在MySQL服務(wù)器中,應(yīng)用程序通過MySQL服務(wù)器訪問數(shù)據(jù),而集群管理服務(wù)器則通過管理工具ndb_mgmd來管理NDB存儲(chǔ)服務(wù)器;
【1.管理節(jié)點(diǎn)】
管理節(jié)點(diǎn)主要是用來對其他的節(jié)點(diǎn)進(jìn)行管理。通常通過配置config.ini文件來配置集群中有多少需要維護(hù)的副本、配置每個(gè)數(shù)據(jù)節(jié)點(diǎn)上為數(shù)據(jù)和索引分配多少內(nèi)存、IP地址、以及在每個(gè)數(shù)據(jù)節(jié)點(diǎn)上保存數(shù)據(jù)的磁盤路徑;
管理節(jié)點(diǎn)通常管理Cluster配置文件和Cluster日志。Cluster中的每個(gè)節(jié)點(diǎn)從管理服務(wù)器檢索配置信息,并請求確定管理服務(wù)器所在位置的方式。如果節(jié)點(diǎn)內(nèi)出現(xiàn)新的事件的時(shí)候,節(jié)點(diǎn)將這類事件的信息傳輸?shù)焦芾矸?wù)器,將這類信息寫入到Cluster日志中;
一般在MySQL Cluster體系中至少需要一個(gè)管理節(jié)點(diǎn),另外值得注意的是,因?yàn)閿?shù)據(jù)節(jié)點(diǎn)和SQL節(jié)點(diǎn)在啟動(dòng)之前需要讀取Cluster的配置信息,所以通常管理節(jié)點(diǎn)是最先啟動(dòng)的;
【2.SQL節(jié)點(diǎn)】
SQL節(jié)點(diǎn)簡單地講就是mysqld服務(wù)器,應(yīng)用不能直接訪問數(shù)據(jù)節(jié)點(diǎn),只能通過SQL節(jié)點(diǎn)訪問數(shù)據(jù)節(jié)點(diǎn)來返回?cái)?shù)據(jù)。任何一個(gè)SQL節(jié)點(diǎn)都是連接到所有的存儲(chǔ)節(jié)點(diǎn)的,所以當(dāng)人任何一個(gè)存儲(chǔ)節(jié)點(diǎn)發(fā)生故障的時(shí)候,SQL節(jié)點(diǎn)都可以把請求轉(zhuǎn)移到另一個(gè)存儲(chǔ)節(jié)點(diǎn)執(zhí)行。通常來講,SQL節(jié)點(diǎn)越多越好,SQL節(jié)點(diǎn)越多,分配到每個(gè)SQL節(jié)點(diǎn)的負(fù)載就越小,系統(tǒng)的整體性能就越好;
【3.數(shù)據(jù)節(jié)點(diǎn)】
數(shù)據(jù)節(jié)點(diǎn)用來存放Cluster里面的數(shù)據(jù),MySQL Cluster在各個(gè)數(shù)據(jù)節(jié)點(diǎn)之間復(fù)制數(shù)據(jù),任何一個(gè)節(jié)點(diǎn)發(fā)生了故障,始終會(huì)有另外的數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù);
通常這3種不同邏輯的節(jié)點(diǎn)可以分布在不同的計(jì)算機(jī)上面,集群最少有3臺計(jì)算機(jī),為了保證能夠正常維護(hù)集群服務(wù),通常將管理節(jié)點(diǎn)放在一個(gè)單獨(dú)的主機(jī)上;
推薦學(xué)習(xí):mysql視頻教程