MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就任於Facebook公司)開發,是一套優秀的做爲MySQL高可用性環境下故障切換和主從提高的高可用軟件。在MySQL故障切換過程當中,MHA能作到在0~30秒以內自動完成數據庫的故障切換操做,而且在進行故障切換的過程當中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。node
• 自動故障檢測和自動故障轉移
MHA可以在一個已經存在的複製環境中監控MySQL,當檢測到Master故障後可以實現自動故障轉移,經過鑑定出最「新」的Salve的relay log,並將其應用到全部的Slave,這樣MHA就可以保證各個slave之間的數據一致性,即便有些slave在主庫崩潰時尚未收到最新的relay log事件。一個slave節點可否成爲候選的主節點可經過在配置文件中配置它的優先級。因爲master可以保證各個slave之間的數據一致性,因此全部的slave節點都有但願成爲主節點。在一般的replication環境中因爲複製中斷而極容易產生的數據一致性問題,在MHA中將不會發生。
• 交互式(手動)故障轉移
MHA能夠手動地實現故障轉移,而沒必要去理會master的狀態,即不監控master狀態,確認故障發生後可經過MHA手動切換mysql
• 在線切換Master到不一樣的主機
MHA可以在0.5-2秒內實現切換,0.5-2秒的寫阻塞一般是可接受的,因此你甚至能在非維護期間就在線切換master。諸如升級到高版本,升級到更快的服務器之類的工做,將會變得更容易sql
優點:數據庫
• 自動故障轉移快
• 主庫崩潰不存在數據一致性問題
• 配置不須要對當前mysql環境作重大修改
• 不須要添加額外的服務器(僅一臺manager就可管理上百個replication)
• 性能優秀,可工做在半同步複製和異步複製,當監控mysql狀態時,僅須要每隔N秒向master發送ping包(默認3秒),因此對性能無影響。你能夠理解爲MHA的性能和簡單的主從複製框架性能同樣。
• 只要replication支持的存儲引擎,MHA都支持,不會侷限於innodbcentos
組成:bash
MHA由Manager節點和Node節點組成。
MHA Manager能夠單獨部署在一臺獨立的機器上管理多個master-slave集羣,也能夠部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它能夠自動將最新數據的slave提高爲新的master,而後將全部其餘的slave從新指向新的master。整個故障轉移過程對應用程序徹底透明服務器
MHA工做原理:app
• 從宕機崩潰的master保存二進制日誌事件(binlog events);
• 識別含有最新更新的slave;
• 應用差別的中繼日誌(relay log)到其餘的slave;
• 應用從master保存的二進制日誌事件(binlog events);
• 提高一個slave爲新的master;
• 使其餘的slave鏈接新的master進行復制;框架
MHA安裝 (如下以centos7爲例)
準備四個節點,其中一個是管理節點,三個是一主兩從的環境less
1.更換yum源
備份本地yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
獲取阿里yum源配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
更新cache
yum makecache
yum -y update ##可無
2.下載軟件包
連接:https://pan.baidu.com/s/1zguk1j07j6SCX0b3Fm60cw
提取碼:voxa
3. 在全部節點上安裝node節點
yum install –y perl-DBD-MySQL
rpm -ivh mha4mysql-node-0.54-0.noarch.rpm
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/bashrc ;source /etc/bashrc
4.在管理節點上安裝manager節點
安裝依賴 yum install –y perl-*
rpm -ivh mha4mysql-manager-0.55-0.el6.noarch.rpm報錯以下
錯誤:依賴檢測失敗:
perl(Parallel::ForkManager) 被 mha4mysql-manager-0.55-0.el6.noarch 須要
yum install -y perl-Parallel-ForkManager 報錯
沒有可用軟件包 perl-Parallel-ForkManager。
注:先:rpm -ivh epel-release-latest-7.noarch.rpm;而後在執行yum install -y perl-Parallel-ForkManager就能夠了
5.• 在四個節點的/etc/hosts中添加主機內容:
ip+主機名
192.168.237.132 mha
192.168.237.128 master
192.168.237.130 slave1
192.168.237.131 slave2
6.• 在管理節點建立配置文件
cat /etc/app1.cnf
[server default]
# mysql user and password
user=帳號
password=密碼
ssh_user=root
# working directory on the manager
manager_workdir=/var/log/masterha/app1
# working directory on MySQL servers
remote_workdir=/var/log/masterha/app1
repl_user=repl
repl_password=mysql
[server1]
hostname=master
port=3308
master_binlog_dir=/usr/local/mysql/data
[server2]
hostname=slave1
port=3308
master_binlog_dir=/usr/local/mysql/data
[server3]
hostname=slave2
port=3308
master_binlog_dir=/usr/local/mysql/data
7.兩個從庫配置文件
log-bin=mysql-bin
relay_log_purge=0
log-slave-updates=true
注:
MHA在發生切換的過程當中,從庫的恢復過程當中依賴於relay log的相關信息,因此這裏要將relay log的自動清除設置爲OFF,採用手動清除relay log的方式。在默認狀況下,從
服務器上的中繼日誌會在SQL線程執行完畢後被自動刪除。可是在MHA環境中,這些中繼日誌在恢復其餘從服務器時可能會被用到,所以須要禁用中繼日誌的自動刪除功能。
8.各個主機之間祕鑰認證
MHA manager經過SSH訪問全部的node節點,各個node節點也一樣須要經過SSH
來相互發送不一樣的relay log 文件,因此有必要在每個node和manager上配置SSH
無密碼登錄
ssh-keygen -t rsa
cat id_rsa.pub >>authorized_keys
9.設置目錄和軟鏈接
mkdir -p /var/log/masterha/app1
軟鏈接全部的機器都要執行
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
10.【管理節點】檢查ssh鏈接配置是否正常
MHAmanager可經過masterha_check_ssh腳本檢測SSH鏈接是否配置正常
# masterha_check_ssh --conf=/etc/app1.cnf
11.【管理節點】檢查mysql複製配置是否正常
爲了讓MHA正常工做,全部的master和slave必須在配置文件中正確配置,MHA可經過masterha_check_repl 腳本檢測複製是否正確配置
12.• 開啓Manager
nohup masterha_manager --conf=/etc/app1.cnf > /var/log/masterha/app1/mha_manager.log < /dev/null & ##後臺運行
masterha_stop --conf=/etc/app1.cnf ##中止
masterha_check_status --conf=/etc/app1.cnf ##檢查manager狀態是否正常
13.• 測試master的自動故障轉移
[root@master bin]# /etc/init.d/mysql.server stop
Shutting down MySQL............ SUCCESS!
這時候檢查manager的log日誌,看看slave1是否成功成爲新的master,而且slave2從slave1中複製
查看MHA切換日誌
vi /var/log/masterha/app1/mha_manager.log
----- Failover Report -----
app1: MySQL Master failover master to slave1 succeeded
Master master is down!
Check MHA Manager logs at mycat for details.
Started automated(non-interactive) failover.
The latest slave slave1(192.168.237.130:3308) has all relay logs for recovery.
Selected slave1 as a new master.
slave1: OK: Applying all logs succeeded.
slave2: This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
slave2: OK: Applying all logs succeeded. Slave started, replicating from slave1.
slave1: Resetting slave info succeeded.
Master failover to slave1(192.168.237.130:3308) completed successfully.
14.驗證MHA先獲取最新日誌再切換
• 先關閉兩個從庫的slave進程
mysql> stop slave;
• 在主庫上執行插入操做,而從庫沒辦法同步
mysql> insert into temp2 values(5000,'abc');
Query OK, 1 row affected (0.00 sec)
• 主庫MySQL直接關閉,兩個從庫開啓複製進程,依舊沒有最新數據
[root@master ~]# /etc/init.d/mysql.server stop
Shutting down MySQL.... SUCCESS!
mysql> select * from temp2 where id=5000;
Empty set (0.00 sec)
• 開啓mha進程,發現完成主從切換
----- Failover Report -----
app1: MySQL Master failover master to slave1 succeeded
Master master is down!
……
Master failover to slave1(192.168.237.130:3308) completed successfully.
• 查看新的主從上是否有5000這條記錄
mysql> select * from temp2 where id=5000;
+------+------+
| id | name |
+------+------+
| 5000 | abc |
15.手動切換
masterha_master_switch --master_state=dead --conf=/etc/app1.cnf --dead_master_host=master --dead_master_port=3308 --new_master_ip=192.168.237.131 --new_master_port=3308
16.在線切換條件
爲了保證數據徹底一致性,在最快的時間內完成切換,MHA的在線切換必須知足如下條件纔會切換成功,不然會切換失敗。
1.全部slave的IO線程都在運行
2.全部slave的SQL線程都在運行
3.全部的show slave status的輸出中Seconds_Behind_Master參數小於或者等於running_updates_limit秒,若是在切換過程當中不指定running_updates_limit,那麼默認狀況下running_updates_limit爲1秒。
4.在master端,經過show processlist輸出,沒有一個更新花費的時間大於running_updates_limit秒
17.添加VIP實現自動漂移
在master節點上執行ifconfig eno16777736:2 192.168.237.120/24
在監控節點的/etc/app1.cnf中添加此文件
在監控節點上配置/usr/local/bin/master_ip_failover
master_ip_failover_script=/usr/local/bin/master_ip_failover
[root@mha linshi]# cat master_ip_failover #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port ); my $vip = '192.168.237.120/24'; my $key = '2'; my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; GetOptions( 'command=s' => \$command, 'ssh_user=s' => \$ssh_user, 'orig_master_host=s' => \$orig_master_host, 'orig_master_ip=s' => \$orig_master_ip, 'orig_master_port=i' => \$orig_master_port, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, ); exit &main(); sub main { print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if ( $command eq "stop" || $command eq "stopssh" ) { my $exit_code = 1; eval { print "Disabling the VIP on old master: $orig_master_host \n"; &stop_vip(); $exit_code = 0; }; if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) { my $exit_code = 10; eval { print "Enabling the VIP - $vip on the new master - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Checking the Status of the script.. OK \n"; exit 0; } else { &usage(); exit 1; } } sub start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`; } sub stop_vip() { return 0 unless ($ssh_user); `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`; } sub usage { print "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n"; }
腳本須要更改兩個標紅的地方
IP地址
網卡名稱
18.配置參數解釋 ###app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1.log //設置manager的工做目錄
manager_log=/var/log/masterha/app1/manager.log //設置manager的日誌
master_binlog_dir=/data/mysql //設置master 保存binlog的位置,以便MHA能夠找到master的日誌,我這裏的也就是
mysql的數據目錄
master_ip_failover_script= /usr/local/bin/master_ip_failover //設置自動failover時候的切換腳本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change //設置手動切換時候的切換腳本
password=123456 //設置mysql中root用戶的密碼,這個密碼是前文中建立監控用戶的那個密碼
user=root 設置監控用戶root
ping_interval=1 //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有迴應的時候自動進行failover
remote_workdir=/tmp //設置遠端mysql在發生切換時binlog的保存位置
repl_password=123456 //設置複製用戶的密碼
repl_user=repl //設置複製環境中的複製用戶名
report_script=/usr/local/send_report //設置發生切換後發送的報警的腳本
secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02
shutdown_script="" //設置故障發生後關閉故障主機腳本(該腳本的主要做用是關閉主機放在發生腦裂,這裏沒有使用)
ssh_user=root //設置ssh的登陸用戶名
[server1]
hostname=192.168.0.50
port=3306
[server2]
hostname=192.168.0.60
port=3306
candidate_master=1 //設置爲候選master,若是設置該參數之後,發生主從切換之後將會將此從庫提高爲主庫,即便這個
主庫不是集羣中事件最新的
slave check_repl_delay=0 //默認狀況下若是一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave做爲
一個新的master,由於對於這個slave的恢復須要花費很長時間,經過設置check_repl_delay=0,MHA觸發切換在選擇一個
新的master的時候將會忽略複製延時,這個參數對於設置了candidate_master=1的主機很是有用,由於這個候選主在切換
的過程當中必定是新的master
[server3]
hostname=192.168.0.70
port=3306