MySQL(10)数据库实现高可用架构之MHA
文章目錄
- 一、MySQL MHA介紹
- 1.1 什么是 MHA?
- 1.2 MHA 的組成
- 1) MHA Node(數據節點)
- 2) MHA Manager(管理節點)
- 1.3 MHA 的特點
- 二、MySQL MHA搭建
- 2.1 MySQL MHA搭建的步驟(理論)
- 2.1.1 搭建步驟
- 1.Master、Slave1、Slave2 節點上安裝 mysql5.7
- 2.修改 Master、Slave1、Slave2 節點的主機名
- 3.修改 Master、Slave1、Slave2 節點的 Mysql主配置文件/etc/my.cnf
- 4.在 Master、Slave1、Slave2 節點上都創建兩個軟鏈接
- 5.配置 mysql 一主兩從
- 6.安裝 MHA 軟件
- 7.在所有服務器上配置無密碼認證
- 8.在 manager 節點上配置 MHA
- 9.第一次配置需要在 Master 節點上手動開啟虛擬IP
- 10.在 manager 節點上測試 ssh 無密碼認證,如果正常最后會輸出 successfully,如下所示。
- 11.在 manager 節點上測試 mysql 主從連接情況,最后出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
- 12.在 manager 節點上啟動 MHA
- 13.查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
- 14 . 查看 MHA 日志,也以看到當前的 master 是 192.168.80.10,如下所示。
- 15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
- 2.1.2 故障模擬
- 2.1.3 故障修復步驟
- 1.修復mysql
- 2.修復主從
- 3.在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
- 4 . 從庫必須設置為只讀模式:當前從庫為mysql
- 5.在 manager 節點上啟動 MHA,并查看VIP是否漂移到mysql2
- 2.2 MySQL MHA搭建具體操作步驟(實操)
- 2.2.1 搭建步驟
- 1.Master、Slave1、Slave2 節點上安裝 mysql5.7
- 2.分別修改 Master、Slave1、Slave2 節點的主機名
- 3.修改 Master、Slave1、Slave2 節點的 Mysql主配置文件/etc/my.cnf
- 4.在 Master、Slave1、Slave2 節點上都創建兩個軟鏈接
- 5.配置 mysql 一主兩從
- 6.安裝 MHA 軟件
- 7.在所有服務器上配置無密碼認證
- 8.在 manager 節點上配置 MHA
- 9.第一次配置需要在 Master 節點上手動開啟虛擬IP
- 10.在 manager 節點上測試 ssh 無密碼認證,如果正常最后會輸出 successfully。如下所示。
- 11.在 manager 節點上測試 mysql 主從連接情況,最后出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
- 12.在 manager 節點上啟動 MHA
- 13.查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
- 14 . 查看 MHA 日志,也以看到當前的 master 是 192.168.80.10,如下所示
- 15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
- 2.2.2 故障模擬
- 1 . 再次開啟MHA,在 manager 節點上tail -f /var/log/masterha/app1/manager.log監控觀察日志記錄
- 2 . 在 Master 節點 Mysql1 上停止mysql服務
- 3 . 查看 mysql2 是否接管 VIP,如下圖已經接管
- 2.2.3 故障修復步驟
- 1.修復mysql,啟動mysql1的服務
- 2.修復主從
- 3.在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
- 4 . 從庫必須設置為只讀模式:當前從庫為mysql
- 5.在 manager 節點上啟動 MHA
一、MySQL MHA介紹
MHA(MasterHigh Availability)是一款開源的 MySQL 的高可用程序,它為 MySQL 主從復制架構提供了 automating master failover 功能。MHA 在監控到 master 節點故障時,會提升其中擁有最新數據的 slave 節點成為新的master 節點,在此期間,MHA 會通過于其它從節點獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節點的在線切換功能,即按需切換 master/slave 節點。
MHA 是由日本人 yoshinorim(原就職于DeNA現就職于FaceBook)開發的比較成熟的 MySQL 高可用方案。MHA 能夠在30秒內實現故障切換,并能在故障切換中,最大可能的保證數據一致性。
1.1 什么是 MHA?
MHA(MasterHigh Availability)是一套優秀的MySQL高可用環境下故障切換和主從復制的軟件。
MHA 的出現就是解決MySQL 單點的問題。
MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換操作。
MHA能在故障切換的過程中最大程度上保證數據的一致性,以達到真正意義上的高可用。
1.2 MHA 的組成
1) MHA Node(數據節點)
MHA Node 運行在每臺 MySQL 服務器上。
2) MHA Manager(管理節點)
MHA Manager 可以單獨部署在一臺獨立的機器上,管理多個 master-slave 集群;也可以部署在一臺 slave 節點上。
MHA Manager 會定時探測集群中的 master 節點。當 master 出現故障時,它可以自動將最新數據的 slave 提升為新的 master, 然后將所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程序完全透明。
1.3 MHA 的特點
自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證數據不丟失;
使用半同步復制,可以大大降低數據丟失的風險,如果只有一個slave已經收到了最新的二進制日志,MHA可以將最新的二進制日志應用于其他所有的slave服務器上,因此可以保證所有節點的數據一致性;
目前MHA支持一主多從架構,最少三臺服務,即一主兩從.
二、MySQL MHA搭建
實驗思路:
1.MHA架構部分
1)數據庫安裝
2)一主兩從
3)MHA搭建
2.故障模擬部分
1)主庫失效
2)備選主庫成為主庫
3)原故障主庫恢復重新加入到MHA成為從庫
3 . 環境準備
服務器類型 系統和IP地址 需要安裝的組件
MHA manager 節點服務器 CentOS7.4(64 位) manager/192.168.80.40 安裝MHA node 和 manager 組件
Master 節點服務器 CentOS7.4(64 位) mysql2/192.168.80.10 安裝mysql5.7、MHA node 組件
Slave1 節點服務器 CentOS7.4(64 位) mysql2/192.168.80.20 安裝mysql5.7、MHA node 組件
Slave2 節點服務器 CentOS7.4(64 位) mysql2/192.168.80.30 安裝mysql5.7、MHA node 組件
2.1 MySQL MHA搭建的步驟(理論)
2.1.1 搭建步驟
關閉防火墻和SElinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.Master、Slave1、Slave2 節點上安裝 mysql5.7
具體安裝步驟見此篇博客:MySQL安裝步驟詳解
2.修改 Master、Slave1、Slave2 節點的主機名
hostnamectl set-hostname Mysql1
hostnamectl set-hostname Mysql2
hostnamectl set-hostname Mysql3
3.修改 Master、Slave1、Slave2 節點的 Mysql主配置文件/etc/my.cnf
##Master 節點##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
systemctl restart mysqld
##Slave1、Slave2 節點##
vim /etc/my.cnf
server-id = 2 #三臺服務器的 server-id 不能一樣
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
4.在 Master、Slave1、Slave2 節點上都創建兩個軟鏈接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
5.配置 mysql 一主兩從
(1)所有數據庫節點進行 mysql 授權
mysql -uroot -p
grant replication slave on . to ‘myslave’@‘192.168.80.%’ identified by ‘123’; #從數據庫同步使用
grant all privileges on . to ‘mha’@‘192.168.80.%’ identified by ‘manager’; #manager 使用
grant all privileges on . to ‘mha’@‘Mysql1’ identified by ‘manager’; #防止從庫通過主機名連接不上主庫
grant all privileges on . to ‘mha’@‘Mysql2’ identified by ‘manager’;
grant all privileges on . to ‘mha’@‘Mysql3’ identified by ‘manager’;
(2)在 Master 節點查看二進制文件和同步點
show master status;
±------------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±------------------±---------±-------------±-----------------±------------------+
| master-bin.000002 | 1745 | | | |
±------------------±---------±-------------±-----------------±------------------+
(3)在 Slave1、Slave2 節點執行同步操作
change master to master_host=‘192.168.80.10’,master_user=‘myslave’,master_password=‘123’,master_log_file=‘master-bin.000002’,master_log_pos=1745;
start slave;
(4)在 Slave1、Slave2 節點查看數據同步結果
show slave status\G
//確保 IO 和 SQL 線程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(5)兩個從庫必須設置為只讀模式:
set global read_only=1;
(6)插入數據測試數據庫同步
##在 Master 主庫插入條數據,測試是否同步##
create database test_db;
use test_db;
create table test(id int);
insert into test(id) values (1);
(7)從庫測試數據庫同步
select * from test_db.test;
±-----+
| id |
±-----+
| 1 |
±-----+
6.安裝 MHA 軟件
(1)所有服務器上都安裝 MHA 依賴的環境,首先安裝 epel 源
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL
perl-Config-Tiny
perl-Log-Dispatch
perl-Parallel-ForkManager
perl-ExtUtils-CBuilder
perl-ExtUtils-MakeMaker
perl-CPAN
(2)安裝 MHA 軟件包,先在所有服務器上必須先安裝 node 組件
對于每個操作系統版本不一樣,這里 CentOS7.4 必須選擇 0.57 版本。
在所有服務器上必須先安裝 node 組件,最后在 MHA-manager 節點上安裝 manager 組件,因為 manager 依賴 node 組件。
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
(3)在 MHA manager 節點上安裝 manager 組件
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
#manager 組件安裝后在/usr/local/bin 下面會生成幾個工具,主要包括以下幾個:
masterha_check_ssh 檢查 MHA 的 SSH 配置狀況
masterha_check_repl 檢查 MySQL 復制狀況
masterha_manger 啟動 manager的腳本
masterha_check_status 檢測當前 MHA 運行狀態
masterha_master_monitor 檢測 master 是否宕機
masterha_master_switch 控制故障轉移(自動或者手動)
masterha_conf_host 添加或刪除配置的 server 信息
masterha_stop 關閉manager
#node 組件安裝后也會在/usr/local/bin 下面會生成幾個腳本(這些工具通常由 MHAManager 的腳本觸發,無需人為操作)主要如下:
save_binary_logs 保存和復制 master 的二進制日志
apply_diff_relay_logs 識別差異的中繼日志事件并將其差異的事件應用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
purge_relay_logs 清除中繼日志(不會阻塞 SQL 線程)
7.在所有服務器上配置無密碼認證
(1)在 manager 節點上配置到所有數據庫節點的無密碼認證
ssh-keygen -t rsa #一路按回車鍵
ssh-copy-id 192.168.80.10
ssh-copy-id 192.168.80.20
ssh-copy-id 192.168.80.30
(2)在 mysql1 上配置到數據庫節點 mysql2 和 mysql3 的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.20
ssh-copy-id 192.168.80.30
(3)在 mysql2 上配置到數據庫節點 mysql1 和 mysql3 的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.10
ssh-copy-id 192.168.80.30
(4)在 mysql3 上配置到數據庫節點 mysql1 和 mysql2 的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.10
ssh-copy-id 192.168.80.20
8.在 manager 節點上配置 MHA
(1)在 manager 節點上復制相關腳本到/usr/local/bin 目錄
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//拷貝后會有四個執行文件
ll /usr/local/bin/scripts/
master_ip_failover #自動切換時 VIP 管理的腳本
master_ip_online_change #在線切換時 vip 的管理
power_manager #故障發生后關閉主機的腳本
send_report #因故障切換后發送報警的腳本
(2)復制上述的自動切換時 VIP 管理的腳本到 /usr/local/bin 目錄,這里使用master_ip_failover腳本來管理 VIP 和故障切換
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)修改內容如下:(刪除原有內容,直接復制并修改vip相關參數)
vim /usr/local/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.80.200’; #指定vip的地址
my $brdc = ‘192.168.80.255’; #指定vip的廣播地址
my $ifdev = ‘ens33’; #指定vip綁定的網卡
my $key = ‘1’; #指定vip綁定的虛擬網卡序列號
my sshstartvip="/sbin/ifconfigens33:ssh_start_vip = "/sbin/ifconfig ens33:sshs?tartv?ip="/sbin/ifconfigens33:key $vip"; #代表此變量值為ifconfig ens33:1 192.168.80.200
my sshstopvip="/sbin/ifconfigens33:ssh_stop_vip = "/sbin/ifconfig ens33:sshs?topv?ip="/sbin/ifconfigens33:key down"; #代表此變量值為ifconfig ens33:1 192.168.80.200 down
my $exit_code = 0; #指定退出狀態碼為0
#my $ssh_start_vip = “/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label ifdev:ifdev:ifdev:key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;”;
#my $ssh_stop_vip = “/usr/sbin/ip addr del $vip/24 dev $ifdev label ifdev:ifdev:ifdev:key”;
##################################################################################
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====sshstopvip==ssh_stop_vip==sshs?topv?ip==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();
KaTeX parse error: Expected 'EOF', got '}' at position 16: 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 - KaTeX parse error: Undefined control sequence: \n at position 17: …ew_master_host \?n?"; &start_vip()…@) {
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 KaTeX parse error: Undefined control sequence: \@ at position 9: ssh_user\?@?new_master_host " $ssh_start_vip "`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh KaTeX parse error: Undefined control sequence: \@ at position 9: 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”;
}
(4)創建 MHA 軟件目錄并拷貝配置文件,這里使用app1.cnf配置文件來管理 mysql 節點服務器
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
vim /etc/masterha/app1.cnf #刪除原有內容,直接復制并修改節點服務器的IP地址
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.20 -s 192.168.80.30
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.80.10
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.80.20
port=3306
[server3]
hostname=192.168.80.30
port=3306
配置文件解釋如下:
[server default]
manager_log=/var/log/masterha/app1/manager.log #manager日志
manager_workdir=/var/log/masterha/app1.log #manager工作目錄
master_binlog_dir=/usr/local/mysql/data/ #master保存binlog的位置,這里的路徑要與master里配置的binlog的路徑一致,以便MHA能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover #設置自動failover時候的切換腳本,也就是上面的那個腳本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change #設置手動切換時候的切換腳本
password=manager #設置mysql中root用戶的密碼,這個密碼是前文中創建監控用戶的那個密碼
ping_interval=1 #設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行failover
remote_workdir=/tmp #設置遠端mysql在發生切換時binlog的保存位置
repl_password=123 #設置復制用戶的密碼
repl_user=myslave #設置復制用戶的用戶
report_script=/usr/local/send_report #設置發生切換后發送的報警的腳本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.20 -s 192.168.80.30 #指定檢查的從服務器IP地址
shutdown_script="" #設置故障發生后關閉故障主機腳本(該腳本的主要作用是關閉主機防止發生腦裂,這里沒有使用)
ssh_user=root #設置ssh的登錄用戶名
user=mha #設置監控用戶root
[server1]
hostname=192.168.80.10
port=3306
[server2]
hostname=192.168.80.20
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.80.30
port=3306
9.第一次配置需要在 Master 節點上手動開啟虛擬IP
/sbin/ifconfig ens33:1 192.168.80.200/24
10.在 manager 節點上測試 ssh 無密碼認證,如果正常最后會輸出 successfully,如下所示。
masterha_check_ssh -conf=/etc/masterha/app1.cnf
Tue Nov 26 23:09:45 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Nov 26 23:09:45 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf…
Tue Nov 26 23:09:45 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf…
Tue Nov 26 23:09:45 2020 - [info] Starting SSH connection tests…
Tue Nov 26 23:09:46 2020 - [debug]
Tue Nov 26 23:09:45 2020 - [debug] Connecting via SSH from root@192.168.80.20(192.168.80.20:22) to root@192.168.80.30(192.168.80.30:22)…
Tue Nov 26 23:09:46 2020 - [debug] ok.
Tue Nov 26 23:09:47 2020 - [debug]
Tue Nov 26 23:09:46 2020 - [debug] Connecting via SSH from root@192.168.80.30(192.168.80.30:22) to root@192.168.80.20(192.168.80.20:22)…
Tue Nov 26 23:09:47 2020 - [debug] ok.
Tue Nov 26 23:09:47 2020 - [info] All SSH connection tests passed successfully.
11.在 manager 節點上測試 mysql 主從連接情況,最后出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
masterha_check_repl -conf=/etc/masterha/app1.cnf
Tue Nov 26 23:10:29 2020 - [info] Slaves settings check done.
Tue Nov 26 23:10:29 2020 - [info]
192.168.80.20(192.168.80.20:3306) (current master)
±-192.168.80.30(192.168.80.30:3306)
Tue Nov 26 23:10:29 2020 - [info] Checking replication health on 192.168.80.30…
Tue Nov 26 23:10:29 2020 - [info] ok.
Tue Nov 26 23:10:29 2020 - [info] Checking master_ip_failover_script status:
Tue Nov 26 23:10:29 2020 - [info] /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.80.20 --orig_master_ip=192.168.80.20 --orig_master_port=3306
IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 192.168.80.200===
Checking the Status of the script… OK
Tue Nov 26 23:10:29 2020 - [info] OK.
Tue Nov 26 23:10:29 2020 - [warning] shutdown_script is not defined.
Tue Nov 26 23:10:29 2020 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
12.在 manager 節點上啟動 MHA
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 &
–remove_dead_master_conf:該參數代表當發生主從切換后,老的主庫的 ip 將會從配置文件中移除。
–manger_log:日志存放位置。
–ignore_last_failover:在缺省情況下,如果 MHA 檢測到連續發生宕機,且兩次宕機間隔不足 8 小時的話,
則不會進行 Failover, 之所以這樣限制是為了避免 ping-pong 效應。該參數代表忽略上次 MHA 觸發切換產生的文件,
默認情況下,MHA 發生切換后會在日志記目錄,也就是上面設置的日志app1.failover.complete文件,
下次再次切換的時候如果發現該目錄下存在該文件將不允許觸發切換,除非在第一次切換后收到刪除該文件,
為了方便,這里設置為–ignore_last_failover。
13.查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
masterha_check_status --conf=/etc/masterha/app1.cnf
14 . 查看 MHA 日志,也以看到當前的 master 是 192.168.80.10,如下所示。
15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
ifconfig
//若要關閉 manager 服務,可以使用如下命令。
masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 進程 ID 的方式關閉。
2.1.2 故障模擬
#在 manager 節點上監控觀察日志記錄
tail -f /var/log/masterha/app1/manager.log
#在 Master 節點 Mysql1 上停止mysql服務
systemctl stop mysqld
或
pkill -9 mysql
#正常自動切換一次后,MHA 進程會退出。HMA 會自動修改 app1.cnf 文件內容,將宕機的 mysql1 節點刪除。查看 mysql2 是否接管 VIP
ifconfig
故障切換備選主庫的算法:
1.一般判斷從庫的是從(position/GTID)判斷優劣,數據有差異,最接近于master的slave,成為備選主。
2.數據一致的情況下,按照配置文件順序,選擇備選主庫。
3.設定有權重(candidate_master=1),按照權重強制指定備選主。
(1)默認情況下如果一個slave落后master 100M的relay logs的話,即使有權重,也會失效。
(2)如果check_repl_delay=0的話,即使落后很多日志,也強制選擇其為備選主。
2.1.3 故障修復步驟
1.修復mysql
systemctl restart mysqld
2.修復主從
#在現主庫服務器 Mysql2 查看二進制文件和同步點
show master status;
#在原主庫服務器 mysql1 執行同步操作
change master to master_host=‘192.168.80.20’,master_user=‘myslave’,master_password=‘123’,master_log_file=‘master-bin.000001’,master_log_pos=1745;
start slave;
3.在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
vi /etc/masterha/app1.cnf
…
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.10 -s 192.168.80.30
…
[server1]
hostname=192.168.80.20
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.80.10
port=3306
[server3]
hostname=192.168.80.30
port=3306
4 . 從庫必須設置為只讀模式:當前從庫為mysql
set global read_only=1;
5.在 manager 節點上啟動 MHA,并查看VIP是否漂移到mysql2
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 &
##查看 MHA 狀態,可以看到當前的 master 是 Mysql2 節點
masterha_check_status --conf=/etc/masterha/app1.cnf
#解決中英字不兼容報錯的問題
dos2unix /usr/local/bin/master_ip_failover
2.2 MySQL MHA搭建具體操作步驟(實操)
2.2.1 搭建步驟
1.Master、Slave1、Slave2 節點上安裝 mysql5.7
2.分別修改 Master、Slave1、Slave2 節點的主機名
3.修改 Master、Slave1、Slave2 節點的 Mysql主配置文件/etc/my.cnf
配置完成記得重啟這三臺服務器!!!!!
4.在 Master、Slave1、Slave2 節點上都創建兩個軟鏈接
5.配置 mysql 一主兩從
(1)所有數據庫節點進行 mysql 授權
(2)在 Master 節點查看二進制文件和同步點
(3)分別在 Slave1、Slave2 節點執行同步操作
(4)在 Slave1、Slave2 節點查看數據同步結果
(5)兩個從庫必須設置為只讀模式:
(6)插入數據測試數據庫同步
(7)從庫測試數據庫同步
6.安裝 MHA 軟件
(1)所有服務器上都安裝 MHA 依賴的環境,首先安裝 epel 源
(2)安裝 MHA 軟件包,先在所有服務器上必須先安裝 node 組件
(3)在 MHA manager 節點上安裝 manager 組件
7.在所有服務器上配置無密碼認證
(1)在 manager 節點上配置到所有數據庫節點的無密碼認證
到所有數據庫節點的無密碼認證,密碼為root密碼
(2)在 mysql1 上配置到數據庫節點 mysql2 和 mysql3 的無密碼認證
(3)在 mysql2 上配置到數據庫節點 mysql1 和 mysql3 的無密碼認證
(4)在 mysql3 上配置到數據庫節點 mysql1 和 mysql2 的無密碼認證
8.在 manager 節點上配置 MHA
(1)在 manager 節點上復制相關腳本到/usr/local/bin 目錄
//拷貝后會有四個執行文件
(2)復制上述的自動切換時 VIP 管理的腳本到 /usr/local/bin 目錄,這里使用master_ip_failover腳本來管理 VIP 和故障切換
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)修改內容如下:(刪除原有內容,直接復制并修改vip相關參數)
(4)創建 MHA 軟件目錄并拷貝配置文件,這里使用app1.cnf配置文件來管理 mysql 節點服務器
9.第一次配置需要在 Master 節點上手動開啟虛擬IP
10.在 manager 節點上測試 ssh 無密碼認證,如果正常最后會輸出 successfully。如下所示。
11.在 manager 節點上測試 mysql 主從連接情況,最后出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
12.在 manager 節點上啟動 MHA
13.查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
14 . 查看 MHA 日志,也以看到當前的 master 是 192.168.80.10,如下所示
15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
在mysql1上查看vip
對manager 節點停止 MHA 服務
在mysql1上再次查看vip,并沒有消失
2.2.2 故障模擬
1 . 再次開啟MHA,在 manager 節點上tail -f /var/log/masterha/app1/manager.log監控觀察日志記錄
2 . 在 Master 節點 Mysql1 上停止mysql服務
3 . 查看 mysql2 是否接管 VIP,如下圖已經接管
在 manager 節點上監控觀察日志記錄也應轉到mysql2
2.2.3 故障修復步驟
1.修復mysql,啟動mysql1的服務
2.修復主從
#在現主庫服務器 Mysql2 查看二進制文件和同步點
#在原主庫服務器 mysql1 執行同步操作
#在原主庫服務器 mysql1 查看數據同步結果,如果失敗參考第二個圖
如果都是正常的話,到這一步失敗的話可以在mysql2上重新授權數據庫同步,然后刷新配置↓↓↓↓↓↓↓↓
3.在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
4 . 從庫必須設置為只讀模式:當前從庫為mysql
5.在 manager 節點上啟動 MHA
總結
以上是生活随笔為你收集整理的MySQL(10)数据库实现高可用架构之MHA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL(9)主从复制与读写分离
- 下一篇: MySQL(11)数据库实现高可用架构之