MHA+ProxySQL,mysql的高可用集羣+讀寫分離(二)MHA搭建與VIP策略


一 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源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章