MySQL高可用架構-MHA環境部署記錄
阿新 • • 發佈:2018-11-21
一、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
|