MySQL基于MHA高可用理論篇

MySQL高可用系統(tǒng)

MySQL高可用阴绢,顧名思義就是當(dāng)MySQL主機(jī)或服務(wù)發(fā)生任何故障時能夠立馬有其他主機(jī)頂替其工作,并且最低要求是要保證數(shù)據(jù)一致性翎朱。因此拇勃,對于一個MySQL高可用系統(tǒng)需要達(dá)到的目標(biāo)有以下幾點(diǎn):

(1)、數(shù)據(jù)一致性保證這個是最基本的同時也是前提已骇,如果主備的數(shù)據(jù)不一致离钝,那么切換就無法進(jìn)行,當(dāng)然這里的一致性也是一個相對的褪储,但是要做到最終一致性卵渴。

(2)、故障快速切換鲤竹,當(dāng)master故障時這里可以是機(jī)器故障或者是實例故障浪读,要確保業(yè)務(wù)能在最短時間切換到備用節(jié)點(diǎn)昔榴,使得業(yè)務(wù)受影響時間最短。

(3)碘橘、簡化日常維護(hù)互订,通過高可用平臺來自動完成高可用的部署、維護(hù)痘拆、監(jiān)控等任務(wù)仰禽,能夠最大程度的解放DBA手動操作,提高日常運(yùn)維效率纺蛆。

(4)吐葵、統(tǒng)一管理,當(dāng)復(fù)制集很多的情況下桥氏,能夠統(tǒng)一管理高可用實例信息温峭、監(jiān)控信息、切換信息等字支。

(5)凤藏、高可用的部署要對現(xiàn)有的數(shù)據(jù)庫架構(gòu)無影響,如果因為部署高可用堕伪,需要更改或者調(diào)整數(shù)據(jù)庫架構(gòu)則會導(dǎo)致成本增加揖庄。

目前MySQL高可用方案可以一定程度上實現(xiàn)數(shù)據(jù)庫的高可用,比如MMM刃跛,heartbeat+drbd抠艾,NDB Cluster等。還有MariaDB的Galera Cluster桨昙,以及MySQL 5.7.17 Group Replication等检号。這些高可用軟件各有優(yōu)劣。在進(jìn)行高可用方案選擇時蛙酪,主要是看業(yè)務(wù)對數(shù)據(jù)一致性方面的要求齐苛。最后出于對數(shù)據(jù)庫的高可用和高可靠的要求,目前推薦使用MHA架構(gòu)桂塞,因為MySQL GP還不能在生產(chǎn)使用凹蜂,但是相信以后慢慢就會被用到生產(chǎn)環(huán)境的。

MHA技術(shù)介紹

MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案阁危,它由日本DeNA公司youshimaton(現(xiàn)就職于Facebook公司)開發(fā)玛痊,是一套優(yōu)秀的作為MySQL高可用性環(huán)境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中狂打,MHA能做到在0~30秒之內(nèi)自動完成數(shù)據(jù)庫的故障切換操作擂煞,并且在進(jìn)行故障切換的過程中,MHA能在最大程度上保證數(shù)據(jù)的一致性趴乡,以達(dá)到真正意義上的高可用对省。除了failover之外蝗拿,MHA還支持在線master切換,非常安全和高效蒿涎,大概只需要(0.5 ~ 2秒)的阻塞寫時間哀托。

該軟件由兩部分組成:MHA Manager(管理節(jié)點(diǎn))和MHA Node(數(shù)據(jù)節(jié)點(diǎn))。MHA Manager可以單獨(dú)部署在一臺獨(dú)立的機(jī)器上管理多個master-slave集群劳秋,也可以部署在一臺slave節(jié)點(diǎn)上仓手。MHA Node運(yùn)行在每臺MySQL服務(wù)器上,MHA Manager會定時探測集群中的master節(jié)點(diǎn)俗批,當(dāng)master出現(xiàn)故障時俗或,它可以自動將最新數(shù)據(jù)的slave提升為新的master市怎,然后將所有其他的slave重新指向新的master岁忘。整個故障轉(zhuǎn)移過程對應(yīng)用程序完全透明。

目前MHA主要支持一主多從的架構(gòu)区匠,要搭建MHA干像,要求一個復(fù)制集群中必須最少有三臺數(shù)據(jù)庫服務(wù)器,一主二從驰弄,即一臺充當(dāng)master麻汰,一臺充當(dāng)備用master,另外一臺充當(dāng)slave戚篙。當(dāng)然五鲫,如果你處于成本考慮,也可以使用兩個節(jié)點(diǎn)的MHA岔擂,一主一從(實測過的)位喂。

總結(jié)一下,MHA提供了如下功能:

(1)master自動監(jiān)控乱灵,故障轉(zhuǎn)移一體化(Automated master monitoring and failover)

(2)MHA可以在一個復(fù)制組中監(jiān)控master的狀態(tài)塑崖,如果掛了,就可以自動的做failover痛倚。

(3)MHA通過所有slave的差異relay-log來保證數(shù)據(jù)的一致性规婆。

(4)MHA在做故障轉(zhuǎn)移,日志補(bǔ)償這些動作的時候蝉稳,通常只需要10~30秒抒蚜。

(5)通常情況下,MHA會選擇最新的slave作為new master耘戚,但是你也可以指定哪些是候選maser嗡髓,那么新master選舉的時候,就從這些host里面挑毕莱。

(6)導(dǎo)致復(fù)制環(huán)境中斷的一致性問題器贩,在MHA中是不會發(fā)生的颅夺,請放心使用。

在MHA自動故障切換過程中蛹稍,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)險声功。MHA可以與半同步復(fù)制結(jié)合起來烦却。如果只有一個slave已經(jīng)收到了最新的二進(jìn)制日志,MHA可以將最新的二進(jìn)制日志應(yīng)用于其他所有的slave服務(wù)器上先巴,因此可以保證所有節(jié)點(diǎn)的數(shù)據(jù)一致性其爵。

(7)手工-交互式master故障轉(zhuǎn)移(Interactive manually initiated Master Failover)

MHA可以配置成手工-交互式方式進(jìn)行故障轉(zhuǎn)移,不支持監(jiān)控master的狀態(tài)伸蚯。

(8)非交互式master故障轉(zhuǎn)移 (Non-interactive master failover)

非交互式摩渺,自動的故障轉(zhuǎn)移,不提供監(jiān)控master狀態(tài)功能剂邮,監(jiān)控可以交給其他組件做(如:Pacemaker heartbeat)摇幻。

(9)在線master切換 (Online switching master to a different host)

如果你有更快,更好的master挥萌,計劃要將老master替換成新的master绰姻,那么這個功能特別適合這樣的場景。

這不是master真的掛掉了瑞眼,只是我們有很多需求要進(jìn)行master例行維護(hù)龙宏。

MHA的優(yōu)點(diǎn)

1. master failover和slave promotion非常快速伤疙。

  1. 自動探測银酗,多重檢測,切換過程中支持調(diào)用其他腳本的接口徒像。

3. master crash不會導(dǎo)致數(shù)據(jù)不一致黍特,自動補(bǔ)齊數(shù)據(jù),維護(hù)數(shù)據(jù)一致性锯蛀。

4. 不需要修改復(fù)制的任何設(shè)置灭衷,簡單易部署,對現(xiàn)有架構(gòu)無影響旁涤。

5. 不需要增加很多額外的機(jī)器來部署MHA翔曲,支持多實例集中管理迫像。

6. 沒有任何性能影響。

7. 支持在線切換瞳遍。

8. 跨存儲引擎闻妓,支持任何引擎。

官方介紹:https://code.google.com/p/mysql-master-ha

MHA工作流程

下圖展示了如何通過MHA Manager管理多組主從復(fù)制掠械,可以將MHA工作原理總結(jié)為如下:

image

1由缆、MHA如何監(jiān)控master和故障轉(zhuǎn)移?

1.1 驗證復(fù)制設(shè)置以及確認(rèn)當(dāng)前master狀態(tài)

連接所有hosts猾蒂,MHA自動來確認(rèn)當(dāng)前master是哪個均唉,配置文件中無需指定哪個是master。

如果其中有任何一個slave掛了肚菠,腳本立即退出舔箭,停止監(jiān)控。

如果有一些必要的腳本沒有在MHA Node節(jié)點(diǎn)安裝案糙,那么MHA在這個階段終止限嫌,且停止監(jiān)控靴庆。

1.2 監(jiān)控master

監(jiān)控master时捌,直到master掛了。

這個階段炉抒,MHA不會監(jiān)控slave奢讨,Stopping/Restarting/Adding/Removing操作在slave上,不會影響當(dāng)前的MHA監(jiān)控進(jìn)程焰薄。當(dāng)你添加或者刪除slave的時候拿诸,請更新好配置文件,最好重啟MHA塞茅。

1.3 檢測master是否失敗

如果MHA Manger三次間隔時間都沒辦法連接master server亩码,就會進(jìn)入這個階段。

如果你設(shè)置了secondary_check_script 野瘦,那么MHA會調(diào)用腳本做二次檢測來判斷master是否是真的掛了描沟。

接下來的步驟,就是masterha_master_switch的工作流程了鞭光。

1.4 再次驗證slave的配置

如果發(fā)現(xiàn)任何不合法的復(fù)制配置(有些slave的master不是同一個)吏廉,那么MHA會停止監(jiān)控,且報錯惰许∠玻可以設(shè)置ignore_fail忽略。

這一步是處于安全考慮汹买,很有可能佩伤,復(fù)制的配置文件已經(jīng)被改掉了聊倔,所以double check是比較推薦的做法。

檢查最后一次failover(故障轉(zhuǎn)移)的狀態(tài)

如果上一次的failover報錯生巡,或者上一次的failover結(jié)束的太近(默認(rèn)3天)方库,MHA停止監(jiān)控,停止failover障斋,那么在masterha_manager命令中設(shè)置ignore_last_failover纵潦,wait_on_failover_error來改變這一檢測。這么做垃环,也是出于安全考慮邀层。頻繁的failover,檢查下是否網(wǎng)絡(luò)出問題遂庄,或者其他錯誤呢寥院?

1.5 關(guān)掉失敗的master的服務(wù)器(可選)

如果在配置文件中定義了master_ip_failover_script and/or shutdown_script ,MHA會調(diào)用這些的腳本涛目。

關(guān)閉dead master秸谢,避免腦裂(值得商榷)。

1.6 恢復(fù)一臺新master

從crashed master服務(wù)器上保存binlog到Manager(如果可以的話

如果dead master可以SSH的話霹肝,拷貝binary logs從最新的slave上的end_log_pos(Read_Master_Log_Pos)位置開始拷貝估蹄。

選舉新master

一般根據(jù)配置文件的設(shè)置來決定選舉誰,如果想設(shè)置一些候選master沫换,設(shè)置candidate_master=1臭蚁;如果想設(shè)置一些host,永遠(yuǎn)都不會選舉讯赏,設(shè)置no_master=1垮兑;確認(rèn)最新的slave (這臺slave擁有最新的relay-log)。

恢復(fù)和提升新master

根據(jù)老master binlog生成差異日志漱挎,應(yīng)用日志到new master系枪,如果這一步發(fā)生錯誤(如:duplicate key error),MHA停止恢復(fù)磕谅,并且其余的slave也停止恢復(fù)私爷。

2)MHA如何在線快速切換master?

下面的步驟怜庸,就是masterha_master_switch—master_state=alive做的事情当犯。

2.1 驗證復(fù)制設(shè)置以及確認(rèn)當(dāng)前master狀態(tài)

連接配置文件中列出的所有hosts,MHA自動來確認(rèn)當(dāng)前master是哪個割疾,配置文件中無需指定哪個是master嚎卫。

執(zhí)行 flush tables 命令在master上(可選). 這樣可以縮短FLUSH TABLES WITH READ LOCK的時間。

既不監(jiān)控master,也不會failover拓诸。

檢查下面的條件是否滿足侵佃。

A. IO線程是否在所有slave上都是running。

B. SQL線程是否在所有slave上都是running奠支。

C. Seconds_Behind_Master 是否低于2秒(—running_updates_limit=N)馋辈。

D. master上是否沒有長的更新語句大于2秒。

2.2 確認(rèn)新master

新master需要設(shè)置: –new_master_host參數(shù)倍谜。

原來的master和新的master必須要有同樣的復(fù)制過濾條件(binlog-do-db and binlog-ignore-db)迈螟。

2.3 當(dāng)前master停寫

如果你在配置中定義了master_ip_online_change_script,MHA會調(diào)用它尔崔〈鸷粒可以通過設(shè)置SET GLOBAL read_only=1來完美的阻止寫入。

在老master上執(zhí)行FLUSH TABLES WITH READ LOCK來阻止所有的寫(–skip_lock_all_tables可以忽略這一步)季春。

2.4 等待其他slave追上當(dāng)前master洗搂,同步無延遲

調(diào)用這個函數(shù)MASTER_LOG_POS()。

2.5 確保新master可寫

執(zhí)行SHOW MASTER STATUS來確定新master的binary log文件名和position载弄。

如果設(shè)置了master_ip_online_change_script耘拇,會調(diào)用它∮罟ィ可以創(chuàng)建寫權(quán)限的用戶惫叛,SET GLOBAL read_only=0。

2.6 讓其他slave指向新master

并行執(zhí)行CHANGE MASTER, START SLAVE尺碰。

MHA組件介紹

MHA軟件由兩部分組成挣棕,Manager工具包和Node工具包,具體的說明如下亲桥。

Manager工具包主要包括以下幾個工具:

(1)masterha_check_ssh #檢查MHA的SSH配置狀況;

(2)masterha_check_repl #檢查MySQL復(fù)制狀況;

(3)masterha_manger #啟動MHA;

(4)masterha_check_status #檢測當(dāng)前MHA運(yùn)行狀態(tài);

(5)masterha_master_monitor #檢測master是否宕機(jī);

(6)masterha_master_switch #控制故障轉(zhuǎn)移(自動或者手動);

(7)masterha_conf_host #添加或刪除配置的server信息;

Node工具包(這些工具通常由MHA Manager的腳本觸發(fā),無需人為操作)主要包括以下幾個工具:

(1)save_binary_logs #保存和復(fù)制master的二進(jìn)制日志;

(2)apply_diff_relay_logs #識別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的slave;

(3)purge_relay_logs #清除中繼日志(不會阻塞SQL線程);

注意:為了盡可能的減少主庫硬件損壞宕機(jī)造成的數(shù)據(jù)丟失固耘,因此在配置MHA的同時建議配置成MySQL半同步復(fù)制题篷。關(guān)于半同步復(fù)制原理各位自己進(jìn)行查閱(不是必須)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厅目,一起剝皮案震驚了整個濱河市番枚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌损敷,老刑警劉巖葫笼,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拗馒,居然都是意外死亡路星,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門诱桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋丐,“玉大人呈昔,你說我怎么就攤上這事∮丫” “怎么了堤尾?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迁客。 經(jīng)常有香客問我郭宝,道長,這世上最難降的妖魔是什么掷漱? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任剩蟀,我火速辦了婚禮,結(jié)果婚禮上切威,老公的妹妹穿的比我還像新娘育特。我一直安慰自己,他們只是感情好先朦,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布缰冤。 她就那樣靜靜地躺著,像睡著了一般喳魏。 火紅的嫁衣襯著肌膚如雪棉浸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天刺彩,我揣著相機(jī)與錄音迷郑,去河邊找鬼。 笑死创倔,一個胖子當(dāng)著我的面吹牛嗡害,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畦攘,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼霸妹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了知押?” 一聲冷哼從身側(cè)響起叹螟,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎台盯,沒想到半個月后罢绽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡静盅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年良价,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡棚壁,死狀恐怖杯矩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袖外,我是刑警寧澤史隆,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站曼验,受9級特大地震影響泌射,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鬓照,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一熔酷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豺裆,春花似錦拒秘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔑歌,卻和暖如春羹应,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背次屠。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工园匹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劫灶。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓裸违,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浑此。 傳聞我的和親對象是個殘疾皇子累颂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容