1. 程式人生 > >MySQL高可用架構-MHA環境部署記錄

MySQL高可用架構-MHA環境部署記錄

 

一、MHA介紹

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是日本的一位 MySQL專家採用Perl語言編寫的一個指令碼管理工具,該工具僅適用於MySQLReplication(二層)環境,目的在於維持Master主庫的高可用性。是一套優秀的作為MySQL高可用性 環境下故障切換和主從提升的高可用軟體。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成資料庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上
保證資料的一致性,以達到真正意義上的高可用。   MHA是自動的master故障轉移和Slave提升的軟體包.它是基於標準的MySQL複製(非同步/半同步).該軟體由兩部分組成:MHA Manager(管理節點)和MHA Node(資料節點)。 1)MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave叢集,也可以部署在一臺slave節點上。MHA Manager會定時探測叢集中的node節點,當發現master
   出現故障的時候,它可以自動將具有最新資料的slave提升為新的master,然後將所有其它的slave導向新的master上.整個故障轉移過程對應用程式是透明的。 2)MHA Node執行在每臺MySQL伺服器上,它通過監控具備解析和清理logs功能的指令碼來加快故障轉移的。   在MHA自動故障切換過程中,MHA試圖從宕機的主伺服器上儲存二進位制日誌,最大程度的保證資料的不丟失,但這並不總是可行的。例如,如果主伺服器硬體故障或無法通過 ssh 訪問, MHA沒法儲存二進位制日誌,只進行故障轉移而丟失了最新的資料。使用MySQL 5.5的半同步複製,可以大大降低資料丟失的風險。MHA可以與半同步複製結合起來。如果只有一個slave 已經收到了最新的二進位制日誌,MHA可以將最新的二進位制日誌應用於其他所有的slave伺服器上,因此可以保證所有節點的資料一致性。   目前MHA主要支援一主多從的架構,要搭建MHA,要求一個複製叢集中必須最少有三臺資料庫伺服器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至 少需要三臺伺服器,出於機器成本的考慮,淘寶也在該基礎上進行了改造,目前淘寶TMHA已經支援一主一從。

二、MHA工作架構說明

展示瞭如何通過MHA Manager管理多組主從複製。可以將MHA工作原理總結為如下:

1 2 3 4 5 6 7 8 相較於其它HA軟體,MHA的目的在於維持MySQL Replication中Master庫的高可用性,其最大特點是可以修復多個Slave之間的差異日誌,最終使所有Slave保持資料一致, 然後從中選擇一個充當新的Master,並將其它Slave指向它。工作流程主要如下: 1)從宕機崩潰的master儲存二進位制日誌事件(binlog events); 2)識別含有最新更新的slave; 3)應用差異的中繼日誌(relay log)到其他的slave; 4)應用從master儲存的二進位制日誌事件(binlog events); 5)提升一個slave為新的master; 6)使其他的slave連線新的master進行復制;

MHA工作原理

1 2 3 4 5 當master出現故障時,通過對比slave之間I /O 執行緒讀取master binlog的位置,選取最接近的slave做為latest slave。其它slave通過與latest slave對比生成差異中繼日誌。 在latest slave上應用從master儲存的binlog,同時將latest slave提升為master。最後在其它slave上應用相應的差異中繼日誌並開始從新的master開始複製。   在MHA實現Master故障切換過程中,MHA Node會試圖訪問故障的master(通過SSH),如果可以訪問(不是硬體故障,比如InnoDB資料檔案損壞等),會儲存二進位制檔案,以最大程度 保證資料不丟失。MHA和半同步複製一起使用會大大降低資料丟失的危險。

MHA軟體的架構:由兩部分組成,Manager工具包和Node工具包,具體的說明如下。
Manager工具包主要包括以下幾個工具:

1 2 3 4 5 6 7 masterha_check_ssh              檢查MHA的SSH配置狀況 masterha_check_repl             檢查MySQL複製狀況 masterha_manger                 啟動MHA masterha_check_status           檢測當前MHA執行狀態 masterha_master_monitor         檢測master是否宕機 masterha_master_switch          控制故障轉移(自動或者手動) masterha_conf_host              新增或刪除配置的server資訊

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

1 2 3 4 5 6 7 8 9 10 11 12 save_binary_logs(儲存二進位制日誌)             儲存和複製master的二進位制日誌 apply_diff_relay_logs(應用差異中繼日誌)      識別差異的中繼日誌事件並將其差異的事件應用於其他的slave filter_mysqlbinlog                          去除不必要的ROLLBACK事件(MHA已不再使用這個工具) purge_relay_logs(清理中繼日誌)               清除中繼日誌(不會阻塞SQL執行緒) ..................................................................................................... MHA如何保持資料的一致性呢?主要通過MHA node的以下幾個工具實現,但是這些工具由mha manager觸發: save_binary_logs         如果master的二進位制日誌可以存取的話,儲存複製master的二進位制日誌,最大程度保證資料不丟失 apply_diff_relay_logs    相對於最新的slave,生成差異的中繼日誌並將所有差異事件應用到其他所有的slave   注意: 對比的是relay log,relay log越新就越接近於master,才能保證資料是最新的。 purge_relay_logs刪除中繼日誌而不阻塞sql執行緒

MHA的優勢

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1)故障切換快 在主從複製叢集中,只要從庫在複製上沒有延遲,MHA通常可以在數秒內實現故障切換。9-10秒內檢查到master故障,可以選擇在7-10秒關閉master以避免出現裂腦,幾秒鐘內, 將差異中繼日誌(relay log)應用到新的master上,因此總的宕機時間通常為10-30秒。恢復新的master後,MHA並行的恢復其餘的slave。即使在有數萬臺slave,也不會 影響master的恢復時間。   DeNA在超過150個MySQL(主要5.0 /5 .1版本)主從環境下使用了MHA。當mater故障後,MHA在4秒內就完成了故障切換。在傳統的主動/被動叢集解決方案中,4秒內完成故障切換是不可能的。   2)master故障不會導致資料不一致 當目前的master出現故障時,MHA自動識別slave之間中繼日誌(relay log)的不同,並應用到所有的slave中。這樣所有的salve能夠保持同步,只要所有的slave處於存活 狀態。和Semi-Synchronous Replication一起使用,(幾乎)可以保證沒有資料丟失。   3)無需修改當前的MySQL設定 MHA的設計的重要原則之一就是儘可能地簡單易用。MHA工作在傳統的MySQL版本5.0和之後版本的主從複製環境中。和其它高可用解決方法比,MHA並不需要改變MySQL的部署環境。 MHA適用於非同步和半同步的主從複製。   啟動/停止/升級/降級/安裝/解除安裝MHA不需要改變(包擴啟動/停止)MySQL複製。當需要升級MHA到新的版本,不需要停止MySQL,僅僅替換到新版本的MHA,然後重啟MHA Manager 就好了。   MHA執行在MySQL 5.0開始的原生版本上。一些其它的MySQL高可用解決方案需要特定的版本(比如MySQL叢集、帶全域性事務ID的MySQL等等),但並不僅僅為了master的高可用才遷移應用的。在大多數情況下,已經部署了比較舊MySQL應用,並且不想僅僅為了實現Master的高可用,花太多的時間遷移到不同的儲存引擎或更新的前沿發行版。MHA工作的包括5.0 /5 .1 /5 .5的原生版本的MySQL上,所以並不需要遷移。   4)無需增加大量的伺服器 MHA由MHA Manager和MHA Node組成。MHA Node執行在需要故障切換/恢復的MySQL伺服器上,因此並不需要額外增加伺服器。MHA Manager執行在特定的伺服器上,因此需要 增加一臺(實現高可用需要2臺),但是MHA Manager可以監控大量(甚至上百臺)單獨的master,因此,並不需要增加大量的伺服器。即使在一臺slave上執行MHA Manager也是 可以的。綜上,實現MHA並沒用額外增加大量的服務。   5)無效能下降 MHA適用與非同步或半同步的MySQL複製。監控master時,MHA僅僅是每隔幾秒(預設是3秒)傳送一個 ping 包,並不傳送重查詢。可以得到像原生MySQL複製一樣快的效能。   6)適用於任何儲存引擎 MHA可以執行在只要MySQL複製執行的儲存引擎上,並不僅限制於InnoDB,即使在不易遷移的傳統的MyISAM引擎環境,一樣可以使用MHA。

三、MHA高可用環境部署記錄

1)機器環境

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ip地址             主機名           角色 182.48.115.236    Node_Master     寫入,資料節點 182.48.115.237    Node_Slave      讀,資料節點,備選Master(candicate master) 182.48.115.238    Manager_Slave   讀,資料節點,也作為Manager server(即也作為manager節點) ........................................................................................................ 為了節省機器,這裡選擇只讀的從庫182.48.115.237(從庫不對外提供讀的服務)作為候選主庫,即candicate master,或是專門用於備份 同樣,為了節省機器,這裡選擇182.48.115.238這臺從庫作為manager server(實際生產環節中,機器充足的情況下, 一般是專門選擇一臺機器作為Manager server) ........................................................................................................   關閉三臺機器的iptables和selinux   部署節點之間 ssh 無密碼登陸的信任關係(即在所有節點上做 ssh 免密碼登入,包括對節點本機的信任) [[email protected]_Master ~] # ssh-copy-id 182.48.115.236 [[email protected]_Master ~] # ssh-copy-id 182.48.115.237 [[email protected]_Master ~] # ssh-copy-id 182.48.115.238   [[email protected]_Slave ~] # ssh-copy-id 182.48.115.236 [[email protected]_Slave ~] # ssh-copy-id 182.48.115.237 [[email protected]_Slave ~] # ssh-copy-id 182.48.115.238   [[email protected]_Slave ~] # ssh-copy-id 182.48.115.236 [[email protected]_Slave ~] # ssh-copy-id 182.48.115.237 [[email protected]_Slave ~] # ssh-copy-id 182.48.115.238   現在3臺節點已經能實現兩兩互相 ssh 通了,不需要輸入密碼即可。如果不能實現任何兩臺主機互相之間可以無密碼登入,後面的環節可能會有問題。

2)實現主機名hostname登入(在三臺節點上都需要執行)(這一步不是必須要操作的)

1 2 3 4 5 6 7 8 9 分別設定三臺節點機器的主機名(主機名上面已提出),並繫結hosts. 三臺機器的 /etc/hosts 檔案的繫結資訊如下: [[email protected]_Master ~] # vim /etc/hosts ....... 182.48.115.236    Node_Master 182.48.115.237    Node_Slave 182.48.115.238    Manager_Slave   相互驗證下使用主機名登陸是否正常,是否可以相互使用主機名 ssh 無密碼登陸到對方。

3)準備好Mysql主從環境

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 架構如下,一主二從的架構: 主庫:182.48.115.236    從庫:182.48.115.237 主庫:182.48.115.236    從庫:182.48.115.238   Mysql主從環境部署可以參考:http: //www .cnblogs.com /kevingrace/p/6256603 .html ....................................................................................... ------主庫配置------ server- id =1       log-bin=mysql-bin    binlog-ignore-db=mysql  sync_binlog = 1     binlog_checksum = none  binlog_format = mixed ------從庫1配置------- server- id =2   log-bin=mysql-bin   binlog-ignore-db=mysql       // 千萬要注意:主從同步中的過濾欄位要一致,否則後面使用masterha_check_repl 檢查複製時就會出錯! slave-skip-errors = all ------從庫2配置------- server- id =3 log-bin=mysql-bin   binlog-ignore-db=mysql   slave-skip-errors = all   然後主庫授權給從庫連線的許可權,設定後,最好在從庫上驗證下是否能使用授予的許可權連線主庫。 然後在從庫上根據主庫的“show master status;” 信心進行change master.....同步設定。   注意: 主從設定時,如果設定了bbinlog-ignore-db 和 replicate-ignore-db 過濾規則,則主從必須相同。即要使用binlog-ignore-db過濾欄位,則主從配置都使用這個, 要是使用replicate-ignore-db過濾欄位,則主從配置都使用這個,千萬不能主從配置使用的過濾欄位不一樣!因為MHA 在啟動時候會檢測過濾規則,如果過濾規則不同,MHA 不啟動監控和故障轉移。 .......................................................................................

4)建立使用者mha管理的賬號(在三臺節點上都需要執行)

1 2 3 4 5 6 7 8 9 10 11 12 mysql> GRANT SUPER,RELOAD,REPLICATION CLIENT,SELECT ON *.* TO [email protected] '182.48.115.%' IDENTIFIED BY 'manager_1234' ; Query OK, 0 rows affected (0.06 sec)   mysql> GRANT CREATE,INSERT,UPDATE,DELETE,DROP ON*.* TO [email protected] '182.48.115.%' ; Query OK, 0 rows affected (0.05 sec)   建立主從賬號(在三臺節點上都需要執行): mysql> GRANT RELOAD, SUPER, REPLICATION SLAVE ON*.* TO 'repl' @ '182.48.115.%' IDENTIFIED BY 'repl_1234' ; Query OK, 0 rows affected (0.09 sec)   mysql> flush privileges; Query OK, 0 rows affected (0.06 sec)

5)開始安裝mha
mha包括manager節點和data節點,其中:
data節點包括原有的MySQL複製結構中的主機,至少3臺,即1主2從,當master failover後,還能保證主從結構;只需安裝node包。
manager server:執行監控指令碼,負責monitoring 和 auto-failover;需要安裝node包和manager包。

5.1)在所有data資料節點機上安裝安裝MHA node

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 下載mha4mysql-node-0.56. tar .gz 下載地址:http: //pan .baidu.com /s/1cphgLo 提取密碼:7674      [[email protected]_Master ~] # yum -y install perl-DBD-MySQL      //先安裝所需的perl模組 [[email protected]_Master ~] # tar -zvxf mha4mysql-node-0.56.tar.gz [[email protected]_Master ~] # cd mha4mysql-node-0.56 [[email protected]_Master mha4mysql-node-0.56] # perl Makefile.PL ................................................................................................................ 這一步可能報錯如下: 1)Can't locate ExtUtils /MakeMaker .pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 ...... 解決辦法: [[email protected]_Master mha4mysql-node-0.56] # yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker   2)Can't locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5 .... 解決辦法: [[email protected]_Master mha4mysql-node-0.56] # yum install -y perl-CPAN ................................................................................................................ [[email protected]_Master mha4mysql-node-0.56] # make && make install

5.2)在manager節點(即182.48.115.238)上安裝MHA Manager(注意manager節點也要安裝MHA node)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 首先下載第三方yum源 [[email protected]_Slave ~] # rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm   安裝perl的mysql包: [[email protected]_Slave ~] # yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles perl-Time-HiRes -y   安裝MHA Manager軟體包: 下載地址:https: //pan .baidu.com /s/1slyfXN3 提取密碼:86wb [[email protected]_Slave ~] # tar -vxf mha4mysql-manager-0.56.tar [[email protected]_Slave ~] # cd mha4mysql-manager-0.56     [[email pro