mysql高可用方案MHA介紹

mysql高可用方案MHA介紹

概述

MHA是一位日本MySQL大牛用Perl寫的一套MySQL故障切換方案,來保證數據庫系統的高可用.在宕機的時間內(通常10—30秒內),完成故障切換,部署MHA,可避免主從一致性問題,節約購買新服務器的費用,不影響服務器性能,易安裝,不改變現有部署。
還支持在線切換,從當前運行master切換到一個新的master上面,只需要很短的時間(0.5-2秒內),此時僅僅阻塞寫操作,并不影響讀操作,便于主機硬件維護。
在有高可用,數據一致性要求的系統上,MHA 提供了有用的功能,幾乎無間斷的滿足維護需要。

優點

1 master自動監控和故障轉移

在當前已存在的主從復制環境中,MHA可以監控master主機故障,并且故障自動轉移。
即使有一些slave沒有接受新的relay log events,MHA也會從最新的slave自動識別差異的relay log events,并apply差異的event到其他slaves。因此所有的slave都是一致的。MHA秒級別故障轉移(9-12秒監測到主機故障,任 選7秒鐘關閉電源主機避免腦裂,接下來apply差異relay logs,注冊到新的master,通常需要時間10-30秒即total downtime)。另外,在配置文件里可以配置一個slave優先成為master。因為MHA修復了slave之間的一致性,dba就不用去處理一致 性問題。
當遷移新的master之后,并行恢復其他slave。即使有成千上萬的slave,也不會影響恢復master時間,slave也很快完成。
DeNA公司在150+主從環境中用MHA。當其中一個master崩潰,MHA4秒完成故障轉移,這是主動/被動集群解決方案無法完成的。

2 互動(手動)master故障轉移

MHA可以用來只做故障轉移,而不監測master,MHA只作為故障轉移的交互。

3 非交互式故障轉移

非交互式的故障轉移也提供(不監控master,自動故障轉移)。這個特性很有用,特別是你已經安裝了其他軟件監控master。比如,用Pacemaker(Heartbeat)監測master故障和vip接管,用MHA故障轉移和slave提升。

4 在線切換master到不同主機

在很多情況下,有必要將master轉移到其他主機上(如替換raid控制器,提升master機器硬件等等)。這并不是master崩潰,但 是計劃維護必須去做。計劃維護導致downtime,必須盡可能快的恢復。快速的master切換和優雅的阻塞寫操作是必需的,MHA提供了這種方式。優 雅的master切換, 0.5-2秒內阻塞寫操作。在很多情況下0.5-2秒的downtime是可以接受的,并且即使不在計劃維護窗口。這意味著當需要更換更快機器,升級高版 本時,dba可以很容易采取動作。

5 master crash不會導致主從數據不一致性

當master crash后,MHA自動識別slave間relay logevents的不同,然后應用與不同的slave,最終所有slave都同步。結合通過半同步一起使用,幾乎沒有任何數據丟失。
其他高可用方案

6 MHA部署不影響當前環境設置

MHA最重要的一個設計理念就是盡可能使用簡單。使用與5.0+以上主從環境,其他HA方案需要改變mysql部署設置,MHA不會讓dba做這些部署配置,同步和半同步環境都可以用。啟動/停止/升級/降級/安裝/卸載 MHA都不用改變mysql主從(如啟動/停止)。
當你需要升級MHA到新版本時,不需要停止mysql,僅僅更新HMA版本,然后重新啟動MHAmanger即可。
MHA 支持包含5.0/5/1/5.5(應該也支持5.6,翻譯文檔時MHA開發者沒更新對于5.6版本)。有些HA方案要求特定的mysql版本(如 mysqlcluster,mysql with global transaction id 等),而且你可能不想僅僅為了MasterHA而遷移應用。很多情況下,公司已經部署了許多傳統的mysql應用,開發或dba不想花太多時間遷移到不同 的存儲引擎或新的特性(newer bleeding edge distributions 不知道這個是否該這么翻譯)。

7 不增加服務器費用

MHA 包含MHA Manager和MHA node。MHA node運行在每臺mysql服務器上,Manager可以單獨部署一臺機器,監控100+以上master,總服務器數量不會有太大增加。需要注意的是 Manager也可以運行在slaves中的一臺機器上。

8 性能無影響

當監控master,MHA只是幾秒鐘(默認3秒)發送ping包,不發送大的查詢。主從復制性能不受影響

9 適用任何存儲引擎

Mysql不僅僅適用于事務安全的innodb引擎,在主從中適用的引擎,MHA都可以適用。即使用遺留環境的mysiam引擎,不進行遷移,也可以用MHA。

與其他HA方案比較

Doing everything manually

Mysql replication 是同步或半同步。當master崩潰時,很有可能一些slave還沒有接受最新的relay log events,這意味著每一個slave都相互處在不同的狀態。人為修復一致性問題顯得不再平凡。沒有一致性問題,主從也可能不會啟動(如 duplicate key error)。花費1個多小時重新啟動主從復制顯得不同尋常。

Single master and single slave

在單一主從情況下,一些slave 落后與其他slave的情況將不會發生。其中一個master崩潰,可以輕松的讓應用轉移到一個新的master上面,提供對外服務,故障遷移很簡單。

Master, one candidate master, and multiple slaves雙主多從

雙主多從的架構也很常見。主master掛掉,備用master將接替主master提供服務。某些情況配置為多主架構。
M(RW)-----M2(R) M(RW), promoted from M2
| |
+----+----+ --(master crash)--> +-x--+--x-+
S(R) S2(R) S(?) S(?)
(Fromwhich position should S restart replication?)
但是這并不作為master故障轉移方案。當前master掛掉,剩余slave不一定接受全部relay log events,修復數據一致性還是問題。
這種架構使用廣泛,但是不是所有人都能深刻理解上述問題。當前master掛掉,slave變得不統一或者slave不能從新的master復制數據。
也許雙master,其中一個master只讀,每個master都至少有一個slave也許可能解決問題。
M(RW)--M2(R)
| |
S(R) S2(R)

Pacemaker + DRBD

Pecemaker(Heartbeat)+DRBD+Mysql是一個通用方案。但是這個方案也有以下問題
1 費用問題,特別是跑大量主從環境。Pecemaker+DRBD是主動/被動的解決方案,因此需要一臺被動服務器對外不提供任何應用服務。基本的需要四臺 mysql服務器,one active master,one passive master,two slaves。
2 宕機時間(downtime)。Pacemaker+DRBD是主備集群,主master掛掉,備用master啟用。這可能花費長的時間,特別是沒有用 innodb plugin。即使用innodb plugin,花費幾分鐘開始在備用master上接受連接也不尋常。另外,因為備用master上數據/文件緩存是空的,恢復時間,熱身(填充數據到 data buffer pool)花費不可忽視的時間。實踐中,需要一臺或更多slave提供足夠的讀服務。在熱身時間內,空緩存導致寫性能降低
3 寫問題下降或一致性問題。為了讓主動/被動集群真正的工作,每次提交(commit)后,必須刷新事務日志(binary log和innodb log),也就是必須設置innodb-flush-log-at-trx-commit=1,sync-binlog=1。設置sync- binlog=1會降低寫性能,因為fsync()函數被序列化(sync-binlog=1,group commit失效)。大部分案例中,不設置sync-binlog=1.如果沒有設置sync-binlog=1,活動master crash,新的master(先前被動服務器)可能會丟失一些已經發送到slave的binary log events。假如 master 掛掉,slave A接受到mysqld-bin.000123,位置1500。binlog data刷新到硬盤的位置在1000,那么新的master數據也只能mysqld-bin.000123的1000處,然后在啟動時創建一個新的 binary log mysqld-bin.000124。如果發生這種情況,slave A不能繼續復制,因為新的master 沒有mysqld-bin.000123位置1500.
4 復雜。對多數人來說,安裝/初始化pacemake和DRBD不是容易的事情。相對于其他案例,初始化DRBD需要重新創建系統分 區也不容易。要求dba在DRBD和linux內核層有足夠的技能。如果dba執行了一個錯誤命令(如執行drbdadm–overwrite- data-of-peer primary 在被動節點),那么將會損壞活動的數據。重要的是另外一旦硬盤io層出現問題,多數dba處理這種問題不是容易的。
MySQL Cluster
Mysql cluster是真正的高可用解決方案,但是必須得用NDB存儲引擎。如果你用innodb,將不能發揮mysql cluster集群優勢。
Semi-Synchronous Replication
半同步復制大大降低了binlog event僅僅存在于崩潰master上的這種風險。這非常有用的能避免數據丟失。但是半同步不能解決所有一致性問題,只能保證一個(不是所 有)slave接受到master端的commit的binlog events,其他slave也許還沒有接受全部的binlog events。不能apply不同的binlog events 從新的slave到 其他slave上,也不能保證相互一致性
Global Transaction ID
GlobalTransaction ID所要達到的目的跟MHA相同,但它覆蓋更多。MHA只是兩級復制,但是global transaction id覆蓋任何級別的復制環境,即使第兩級復制失敗,dba也能覆蓋第三級。Check Google'sglobal transaction id project for details。

來源:?http://blog.csdn.net/wulantian/article/details/11770159


來自為知筆記(Wiz)


轉載于:https://www.cnblogs.com/pangguoping/p/5589802.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255080.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL遞歸查詢(with as)

SQL遞歸查詢(with cte as) with cte as( select Id,Pid,DeptName,0 as lvl from Department where Id 2 union all select d.Id,d.Pid,d.DeptName,lvl1 from cte c inner join Department d on c.Id d.Pid)select * from cte1 表結構Id Pid …

庖丁解牛TLD(一)——開篇

最近在網上多次看到有關Zdenek Kalal的TLD的文章,說他做的工作如何的帥,看了一下TLD的視頻,感覺確實做的很好,有人夸張的說他這個系統可以和Kniect媲美,我倒是兩者的工作可比性不大,實現的方法也不同。但這…

Arduino從DHT11讀取溫濕度數據并顯示在1602LCD

硬件清單 Arduino NANO1602LCD PCF8574T模塊YL-47 DHT11模塊 連線 1. 連接LCD: PCF8574T模塊4pin(Gnd, Vcc, SDA i2c數據, SCL i2c時鐘) 連接至Arduino接口 Gnd -> Gnd, Vcc -> Vcc, SDA -> A4, SDL -> A52. 連接YL-47 DHT11: Gnd -> Gnd, Vcc -> Vcc, Data…

服務器性能測試

淺談服務器性能測試的全生命周期——從測試、結果分析到優化策略 原創 2016-06-16 Micheal 騰訊WeTest測試開發者的共同關注!作者:Micheal,騰訊資深后臺開發工程師。WeTest導讀 服務器性能測試是一項非常重要而且必要的工作,本文是…

庖丁解牛TLD(二)——初始化工作(為算法的準備)

我說的初始化,還不是算法的初始化工作,而是讀入圖像,響應鍵盤鼠標之類的工作。作者提供的代碼中的工作包含了從攝像頭讀取和從文件中讀取兩種輸入方案。這里介紹一下從文件輸入的辦法。因為OpenCV從視頻讀取圖像序列的辦法有很好的demo&#…

(轉載)Qt中MOC的一些限制

無意中發現在Qt的文檔里有一篇關于moc工具的limitation的文章,里頭的東西值得學習一下。 Qt一個鏈接的錯誤, 程序結構很簡單, 就是designer設計主界面,在代碼里用多重繼承方式使用, 奇怪的錯誤信息如下: mo…

庖丁解牛TLD(三)——算法初始化

上一講我提到對于算法的初始化工作主要是在tldInit這個函數里實現的。主要分為如下幾大步驟,1)初始化Detector。2)初始化Trajectory。3)訓練Detector 1)初始化Detector 其中bb_scan為掃描grid區域,該函數輸入為boundin…

Web測試容易忽略的地方

1.瀏覽器的后退按鈕 提交表單一條已經成功提交的記錄,back后再提交,看系統會如何處理。檢查多次使用back健的情況在有back的地方,back,回到原來的頁面,再back,重復幾次,看是否會報錯。 2.通過修…

[Android]你不知道的Android進程化(4)--進程通信AIDL框架

大家好,我系蒼王。以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。[Android]如何做一個崩潰率少于千分之三噶應用app--章節列表Google爸爸,聽說要將一些插件化hook系統的變量屬性禁用,…

在未啟動程序情況 點擊視圖設計器 彈出未將對象引用窗體的解決方案

請問下 在未運行程序情況 點擊視圖設計器 彈出未將對象引用窗體 解決方案:1.看后臺進程是不是相關的進程在啟動,如果有關閉進程;重啟vs,即可2.重啟電腦轉載于:https://www.cnblogs.com/yang12311/p/5593838.html

圖像配準的步驟

目前,很難找到一種普適的方法能夠應對所有的配準情況,任何一種配準算法都必須考慮圖像的成像原理、幾何變形、噪聲影響、配準精度等因素。不過,從原理上將,配準算法可以大致分為以下四個步驟: (1&#xff0…

Jm86中的encode_one_macroblock注釋

Jm86中的encode_one_macroblock注釋 /*! ************************************************************************************** /brief* Mode Decision for a macroblock* //該函數的作用是編碼一個宏塊(包括幀間、幀內、幀內預測的方式)。*…

Python之路【第十七篇】:裝飾器

寫代碼的時候有一個原則,開放封閉原則(面向對象):對某些東西開放,對某些封閉,在裝飾器這里,函數內部是封閉的,不允許改變函數的內部。 裝飾器用來裝飾函數,可以讓函數在執行之前或者執行之后&am…

HALCON示例程序measure_chip.hdev芯片封裝檢測

HALCON示例程序measure_chip.hdev芯片封裝檢測 示例程序源碼(加注釋) 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘die_on_chip’) get_image_size (Image, Width, Height) dev_close_window () dev_open_window (0, 0, Width * 2, He…

工業機器人智能發展:視覺和觸覺感應簡化

機器人工業協會(Robotic Industries Association)指出,從2003到2005年間,北美機器人工業以20%的平均年增長率發展。在汽車市場需求疲軟以及外國廠商的壓力不斷增加的背景下,這一成就是如何取得的?成本的普遍…

ASP站點無法訪問怎么辦

確保啟用了目錄瀏覽功能 轉載于:https://www.cnblogs.com/acetaohai123/p/6571257.html

五、案例-指令參考-freemarker指令、表達式

案例-指令參考描述&#xff1a;本人自己測試寫了一遍&#xff0c;如有錯的地方&#xff0c;懂freemarker的朋友望指點指點&#xff01; 案例-指令參考 表達式 一、 Assign 1、<#assign name1"北京" name2"上海" name3"廣東"> 調用&#xf…

PartitionMotionSearch()函數

encode_one_macroblock()函數中的運動估計分為兩大塊&#xff0c;對于宏塊級的三種模式&#xff0c;分塊后直接對patition依次調用PartitionMotionSearch()函數&#xff1b;而對于亞宏塊級的&#xff08;含8x8, 8x4,4x8,4x4&#xff09;模式&#xff0c;首先將宏塊拆分為4個88子…

201521123017 《Java程序設計》第4周學習總結

1. 本周學習總結 2. 書面作業 Q1.注釋的應用 使用類的注釋與方法的注釋為前面編寫的類與方法進行注釋&#xff0c;并在Eclipse中查看。(截圖) Q2.面向對象設計(大作業1&#xff0c;非常重要) 2.1 將在網上商城購物或者在班級博客進行學習這一過程&#xff0c;描述成一個故事。…

完整的VAL3程序

start() begin//延時10秒 delay(5)//初始化變量call init()//清空原有運動堆棧resetMotion()//建立上電任務taskCreate "robotpower",100,robotpower()wait(isPowered())//建立生產任務taskCreate "ProductionCycle",10,ProductionCycle()//建立安全區域…