一 MHA介紹
MHA是一個日本人yoshinorim創建的高可用架構,其實主要就是基於主從複製的一段perl程序,一個shell腳本。
二 安裝
2.1 下載MHA
1、安裝perl環境
sudo yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN*
2、下載mha
本次使用版本爲v0.58。
manager下載地址:
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
node下載地址:
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
wget下載:
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
0.58的更新內容:
幾個錯誤修正
IPV6支持
super_read_only 支持
force_storage_engine 支持
2.2 安裝MHA-node
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
perl Makefile.PL
make && make install
所有節點都執行
2.3 安裝MHA-manager
只有主庫需要安裝
tar -zxvf mha4mysql-node-0.58.tar.gz
tar -zxvf mha4mysql-manager-0.58.tar.gz
perl Makefile.PL
make && make install
manager安裝完成後,使用MHA腳本進行SSH檢測
### 檢測ssh
/usr/local/bin/masterha_check_ssh --conf=/etc/mha/mha.conf
[root@iZm5eh3yfwvy52yb78f6obZ scripts]# /usr/local/bin/masterha_check_ssh --conf=/etc/mha/mha.conf
……
……
……
Tue Mar 31 17:18:44 2020 - [info] All SSH connection tests passed successfully.
使用MHA腳本進行主從檢測
# 檢測主從
/usr/local/bin/masterha_check_repl --conf=/etc/mha/mha.conf
# 檢測主從結果
[root@iZm5eh3yfwvy52yb78f6obZ scripts]# /usr/local/bin/masterha_check_repl --conf=/etc/mha/mha.conf
……
……
……
MySQL Replication Health is OK.
2.4 啓動mha
管理節點:
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
# 查看mha是否啓動成功
masterha_check_status --conf=/etc/mha/mha.conf
[root@iZm5eh3yfwvy52yb78f6obZ ~]# nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
[1] 28153
[root@iZm5eh3yfwvy52yb78f6obZ ~]# masterha_check_status --conf=/etc/mha/mha.conf
mha (pid:28153) is running(0:PING_OK), master:172.31.145.39
三、故障轉移測試
3.1 故障轉移
在主庫上停掉mysql
systemctl stop mysqld
查看日誌,成功轉移
tail -fn100 /usr/local/mha/manager.log
Master failover to 172.31.145.38(172.31.145.38:3306) completed successfully.
在從庫2節點上,進入mysql
show slave status \G;
可以看到Master節點已變成從庫1
……
Master_Host: 172.31.145.38
……
3.2 重新加入集羣
如果node1節點故障已排除,重新添加入集羣,這個節點只能作爲從庫了
systemctl start mysqld
mysql -u root -PZw@369012
# 注意大寫
CHANGE MASTER TO MASTER_HOST='172.31.145.38',MASTER_USER='repl',MASTER_PASSWORD='replZw@1987',MASTER_AUTO_POSITION=1;
start slave;
show slave status \G;
四、添加VIP與自動轉移
4.1、添加虛擬ip
ip addr add 10.0.0.55 dev eth0
# 查看ip
ip addr show
如果設置錯了,可以刪除
# 刪除ip
ip addr del 10.0.0.55 dev eth0
# 查看ip
ip -o -f inet addr show
使用failover腳本中的方式,在管理節點上,用ssh的方式給主節點添加vip,測試下
ssh root@172.31.145.38 /usr/sbin/ip addr add 172.31.145.200 brd 172.31.159.255 dev eth0 label eth0:0;/usr/sbin/arping -q -A -c 1 -I eth0 172.31.145.200;iptables -F;
4.2 添加自動轉移vip腳本
master_ip_failover_script=/usr/local/scripts/master_ip_failover
master_ip_online_change_script=/usr/local/scripts/master_ip_online_change
編輯腳本內容,將manager解壓包中的sample文件下的scripts腳本搬運過來,然後編輯,添加vip內容。
cd /home/mysql/MHA/mha4mysql-manager-0.58/samples/scripts
cp master_ip_failover /usr/local/scripts
cp master_ip_online_change /usr/local/scripts
vim /usr/local/scripts/master_ipfailover
添加如下內容:
# 在my函數前聲明
my $vip = '10.0.0.66/24';
my $key = '2';
…………
# 在sub main 函數下添加內容
sub drop_vip {
my $output = `ssh -o ConnectTimeout=15 -o ConnectionAttempts=3 $orig_master_host /sbin/ip addr del $vip/32 dev $key`;
}
sub add_vip {
my $output = `ssh -o ConnectTimeout=15 -o ConnectionAttempts=3 $new_master_host /sbin/ip addr add $vip/32 dev $key`;
}
另一種ssh的方式,報錯了:
# 在my函數前聲明
my $vip = '10.0.0.66/24';
my $key = '2';
my $ssh_start_vip = "/sbin/ifconfig eno16777736:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eno16777736:$key down";
# 在sub main 函數下添加內容
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 \"`;
}
4.3 切換測試
# 查看mha是否啓動成功
masterha_check_status --conf=/etc/mha/mha.conf
# 當前狀態是NOT_RUNNING
mha is stopped(2:NOT_RUNNING).
# 啓動MHA
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
[1] 2988
# 啓動後再次查看
masterha_check_status --conf=/etc/mha/mha.conf
# master當前是172.31.145.39
mha (pid:2988) is running(0:PING_OK), master:172.31.145.39
node1上停掉master測試,看master、vip是否都自動轉移到172.31.145.38上:
# 在master機器172.31.145.39上停掉mysql
systemctl stop mysql
管理節點查看mha日誌
……
……
……
Failed to activate master IP address for 172.31.145.38(172.31.145.38:3306) with return code 10:0
172.31.145.40(172.31.145.40:3306): OK: Slave started, replicating from 172.31.145.38(172.31.145.38:3306)
172.31.145.38(172.31.145.38:3306): Resetting slave info succeeded.
Master failover to 172.31.145.38(172.31.145.38:3306) completed successfully.
轉移master成功,但是在node2機器上,ip addr show 看了下,vip並沒有轉移成功。
4.4 failover總結
1).配置文件檢查階段,這個階段會檢查整個集羣配置文件
2).宕機的master處理,這個階段包括虛擬ip摘除操作,主機關機操作
3).複製dead master和最新slave相差的relay log,並保存到MHA Manger具體的目錄下
4).識別含有最新更新的slave
5).應用從master保存的二進制日誌事件(binlog events)
6).提升一個slave爲新的master進行復制
7).使其他的slave連接新的master進行復制
4.5 failover報錯
遇到啓動mha、切換vip等失敗錯誤,第一時間需要查看日誌
tail -fn100 /usr/local/mha/manager.log
錯誤1:
Failover error flag file /usr/local/mha/mha.failover.error exis
刪除 /usr/local/mha/mha.failover.error
cd /usr/local/mha/
rm -rf /usr/local/mha/mha.failover.error
# 如果轉移成功的,要重啓,成功日誌也要刪除
rm -rf /usr/local/mha/mha.failover.complete
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
masterha_check_status --conf=/etc/mha/mha.conf
tail -fn100 /usr/local/mha/manager.log
錯誤2:
Unknown option: ssh_user
Died at /usr/local/scripts/master_ip_failover line 270.
錯誤3:
Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/scripts/master_ip_failover line 100.
註釋100行 FIXME_xxx"。
錯誤4:
Unrecognized character \xC2; marked by <-- HERE after <-- HERE near column 1 at /usr/local/scripts/master_ip_failover line 124.
錯誤2、3、4都需要查看文件是哪行報錯了,多數是格式、變量的問題。
五、結語
如果只用MHA的話,VIP這步必不可少,否則就只能啓到集羣的作用,不能負載。
但是如果用了mycat、proxySQL這樣的中間件,實際上就不需要VIP這步了。MHA能做到自動轉移故障就行了。
最後,親測可用的failover腳本、安裝包都可以在公衆號後臺回覆mysql獲取。
MHA+ProxySQL,mysql的高可用集羣+讀寫分離(一)GTID主從複製
mysql性能分析工具
一文了解,mysql高效率備份神器
本文分享自微信公衆號 - 架構師之殤(ysistrue)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。