使用 MHA 實作 MySQL 主從復制高可用
- 一、MHA 概述
- 1.MHA 的主要功能
- 2.MHA 的優勢
- 3.MHA 組成部分
- 4.MHA 作業原理
- 二、部署 MHA 實作 MySQL 主從復制高可用
- 1.配置免密登陸
- 2.安裝 MHA 軟體包
- 1)在各節點上安裝 mha4mysql-node
- 2)在管理節點上安裝 manager 節點
- 3)manager 管理工具
- 3.配置主從復制
- 1)主服務器上配置
- 2)從服務器配置
- 3)建立主從復制
- 4.設定 MySQL 程式及 binglog 程式的軟連接
- 5.在兩臺 Slave 設定臨時只讀和不清除中繼日志
- 6.配置 MHA 作業目錄及組態檔
- 7.檢查 MHA 的環境是否作業正常
- 1)檢測 SSH 連接是否配置正常
- 2)在管理節點檢查復制配置
- 三、MHA 的管理
- 1.啟動 Manager
- 2.檢測 Manager 的作業狀態
- 3.在 MHA 環境中配置 VIP
- 1)在 master 上配置 VIP
- 2)修改 MHA 組態檔,使其支持 VIP
- 3)撰寫 VIP 自動切換腳本
- 4.開啟監控
- 5.驗證故障切換
- 1)關閉 master 上的 資料庫
- 2)查看 Manager 日志
- 3)在 192.168.1.2 主機中查看 MHA VIP 是否漂移
一、MHA 概述
MHA(Master High Availability)是由日本一家公司開發的一套 MySQL 高可用性環境下故障切換和主從提升的高可用軟體,目前在 MySQL 高可用方面是一個相對成熟的的解決方案,在 MySQL 故障切換程序中,MHA 能做到在 0~30 秒之內自動完成資料庫的故障切換操作,并且在進行故障切換的程序中,MHA 能在最大程度上保證資料的一致性,以達到真正意義上的高可用,
1.MHA 的主要功能
- 自動故障檢測和自動故障轉移;
- 互動式(手動)故障轉移;
- 在線切換 Master 到不同的主機;
2.MHA 的優勢
- 自動故障轉移快;
- 主庫崩潰不存在資料一致性問題;
- 配置不需要對當前 MySQL 環境做重大修改;
- 不需要添加額外的服務器(僅一臺 manager 就可管理上百臺 replication);
- 性能優秀,可作業在半同步復制和異步復制;
- 只要 replication 支持的存盤引擎,MHA 都支持,不會局限于 innodb;
3.MHA 組成部分
MHA 由 Manager 節點和 Node 節點組成;MHA Manager 可以單獨部署在一臺獨立的機器上管理多個 master-slave 集群,也可以部署在一臺 slave 節點上,MHA Node 運行在每臺 MySQL 服務器上,
4.MHA 作業原理

- MHA Manager 會定時探測集群中的 Master 節點;
- 當 Master 出現故障時,從宕機崩潰的 Master 保存二進制日志時間(binlog events);
- 識別含有最新更新的 Slave;
- 應用差異的中繼日志(relay log)到其他的 Slave;
- 應用從 Master 保存的二進制日志事件(binlog events);
- 提升一個 Slave 為新的 Master,使其他 Slave 連接新的 Master 進行復制;
二、部署 MHA 實作 MySQL 主從復制高可用
準備作業:
| 主機名 | 作業系統 | IP地址 | 擔任角色 |
| master | CentOS7 | 192.168.1.1 | MySQL-主節點 |
| slave1 | 192.168.1.2 | MySQL-從節點 | |
| slave2 | 192.168.1.3 | MySQL-從節點 | |
| manager | 192.168.1.4 | MHA manager 節點 |
- 如果未安裝 MySQL 資料庫 需看:Centos7安裝Mysql資料庫 來進行安裝,(除了 Manager 不需要安裝,其他機器都需要安裝)
- 實驗所需軟體包從這個連接下載:https://pan.baidu.com/s/1c39hxF-beUxu9Cl_OaZSuQ
- 提取碼:whwo
1.配置免密登陸
由于 MHA manager 通過 SSH 訪問所有的 node 節點,各個 node 節點也同樣通過 SSH 來相互發送不同的 relay log 檔案,所以要在每一個 node 和 manager 上配置 SSH 無密碼登陸,
- 在每個節點上分別生成密鑰對,
[root@master ~]# ssh-keygen -t rsa #一路回車即可
- 每臺節點分別將自己的公鑰發送到另外的三臺節點,(下面以 master 主機為例)
[root@master ~]# ssh-copy-id 192.168.1.2
[root@master ~]# ssh-copy-id 192.168.1.3
[root@master ~]# ssh-copy-id 192.168.1.4
2.安裝 MHA 軟體包
準備作業:四臺機器都要做
[root@manager ~]# mkdir /root/mha
[root@manager ~]# cd /root/mha
[root@manager mha]# ls
mha4mysql-manager-0.57-0.el7.noarch.rpm mhapath.tar.gz mha4mysql-node-0.57-0.el7.noarch.rpm
[root@manager mha]# tar zxf mhapath.tar.gz
[root@manager mha]# cat <<END > /etc/yum.repos.d/CentOS7.repo
[centos]
name=centos7
baseurl=file:///mnt
enabled=1
gpgcheck=0
[mha]
name=mha
baseurl=file:///root/mha/mhapath
enabled=1
gpgcheck=0
END
[root@manager mha]# mount /dev/cdrom /mnt/

1)在各節點上安裝 mha4mysql-node
[root@manager ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager --skip-broken --nogpgcheck
[root@manager ~]# rpm -ivh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm

2)在管理節點上安裝 manager 節點
[root@manager ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
[root@manager ~]# rpm -ivh /root/mha/mha4mysql-manager-0.57-0.el7.noarch.rpm

3)manager 管理工具
在 manager 節點安裝完成后會生成一些管理工具,manager 的主要管理工具有:
masterha_check_ssh:檢查 MHA 的 SSH 配置狀況,masterha_check_repl:檢查 MySQL 復制狀況,masterha_manager:啟動 MHA,masterha_check_status:檢查當前 MHA 運行狀態,masterha_master_monitor:檢查 Master 是否宕機,masterha_master_switch:控制故障轉移(自動或者手動),masterha_conf_host:添加或洗掉配置的 server 資訊,
3.配置主從復制
1)主服務器上配置
[root@master ~]# cat <<END >> /etc/my.cnf
log-bin=mysql-bin-master
server-id=1
END
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to root@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit

2)從服務器配置
[root@slave1 ~]# cat <<END >> /etc/my.cnf
log-bin=mysql-slave1 #slave2改為2
server-id=2 #slave2改為3
log_slave_updates=1
END
[root@slave1 ~]# systemctl restart mysqld
[root@slave1 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to root@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit
3)建立主從復制
兩臺從節點操作一致
[root@slave1 ~]# mysql -uroot -p123456
mysql> change master to
master_host='192.168.1.1',
master_user='repl',
master_password='123456';
mysql> start slave;
mysql> show slave status\G;

4.設定 MySQL 程式及 binglog 程式的軟連接
[root@master ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
[root@master ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
5.在兩臺 Slave 設定臨時只讀和不清除中繼日志
[root@slave1 ~]# mysql -uroot -p123456 -e 'set global read_only=1'
[root@slave1 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'

6.配置 MHA 作業目錄及組態檔
[root@manager ~]# mkdir -p /etc/masterha
[root@manager ~]# mkdir -p /var/log/masterha/app1
[root@manager ~]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1 #設定 manager 的作業目錄
manager_log=/var/log/masterha/app1/manager.log #設定 manager 的日志檔案
master_binlog_dir=/usr/local/mysql/data/ #設定 master 保存 binlog 的位置,以便 MHA 可以找到 master 的日志
user=root #設定監控 mysql 的用戶
password=123456 #設定監控 mysql 用戶的密碼
ping_interval=1 #設定監控主庫,發送 ping 包的時間間隔
remote_workdir=/tmp #設定遠端 mysql 在發生切換時 binlog 的保存位置
repl_user=repl #設定 mysql 中用于復制的用戶
repl_password=123456 #設定 mysql 中用于復制的用戶密碼
ssh_user=root #設定 ssh 的登錄用戶名
[server1]
hostname=192.168.1.1
port=3306
[server2]
hostname=192.168.1.2
port=3306
candidate_master=1 #設定當前節點為候選的 master
check_repl_delay=0 #當落后 master 100M 的 relay logs 時,MHA 將不會選擇該 slave 作為一個新的 master
[server3]
hostname=192.168.1.3
port=3306
7.檢查 MHA 的環境是否作業正常
1)檢測 SSH 連接是否配置正常
[root@manager ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

2)在管理節點檢查復制配置
- 為了讓 MHA 正常作業,所有的 master 和 slave 必須在組態檔中正確配置,
[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

三、MHA 的管理
MySQL 中主從的作業狀態檢測及切換是由 manager 節點來完成的,MHA 安裝完成以及檢測通過后就可以根據自己的需求開啟以及停止 manager,
1.啟動 Manager
Manager 是通過 masterha_manager 命令開啟,啟動后需要將它放在后臺運行,
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf \
--remove_dead_master_conf --ignore_last_failover < /dev/null > \
/var/log/masterha/app1/manager.log 2>&1 &

2.檢測 Manager 的作業狀態
當 MHA manager 啟動監控以后,如果沒有例外則不會列印任何資訊,我們可通過 masterha_check_status 命令檢查 manager 的狀態,
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

3.在 MHA 環境中配置 VIP
通過 MHA 進行故障轉以后,連接 MySQL 資料庫的服務并不知道 MySQL 復制環境中進行了故障的轉移,同時連 MySQL 的服務也無法知曉主節點是哪一個,此時,可以通過配置 VIP 的方式讓所有的應用程式連接 VIP,當 MySQL 故障切換時,VIP 會自動漂移到新的主節點,
1)在 master 上配置 VIP
[root@master ~]# ifconfig ens33:1 192.168.1.188 netmask 255.255.255.0 up
[root@master ~]# ifconfig ens33:1

2)修改 MHA 組態檔,使其支持 VIP
[root@manager ~]# vim /etc/masterha/app1.cnf
在 [server default] 項下面添加:
master_ip_failover_script=/usr/bin/master_ip_failover
3)撰寫 VIP 自動切換腳本
[root@master ~]# vim /usr/bin/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.1.188/24';
my $key = '1';
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";
}
[root@manager ~]# chmod +x /usr/bin/master_ip_failover #添加可執行權限
再次檢測,結果應該和上面檢測結果一樣才對
[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

4.開啟監控
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf \
--remove_dead_master_conf --ignore_last_failover < /dev/null > \
/var/log/masterha/app1/manager.log 2>&1 &
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

5.驗證故障切換
1)關閉 master 上的 資料庫
[root@master ~]# systemctl stop mysqld
2)查看 Manager 日志
[root@manager ~]# tail -n10 /var/log/masterha/app1/manager.log

3)在 192.168.1.2 主機中查看 MHA VIP 是否漂移
[root@slave1 ~]# ifconfig ens33:1

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241986.html
標籤:其他
下一篇:預測師的架構入門學習總結
