MySQL(10)数据库实现高可用架构之MHA
文章目錄
- 一、MySQL MHA介紹
- 1.1 什么是 MHA?
- 1.2 MHA 的組成
- 1) MHA Node(數(shù)據(jù)節(jié)點(diǎn))
- 2) MHA Manager(管理節(jié)點(diǎn))
- 1.3 MHA 的特點(diǎn)
- 二、MySQL MHA搭建
- 2.1 MySQL MHA搭建的步驟(理論)
- 2.1.1 搭建步驟
- 1.Master、Slave1、Slave2 節(jié)點(diǎn)上安裝 mysql5.7
- 2.修改 Master、Slave1、Slave2 節(jié)點(diǎn)的主機(jī)名
- 3.修改 Master、Slave1、Slave2 節(jié)點(diǎn)的 Mysql主配置文件/etc/my.cnf
- 4.在 Master、Slave1、Slave2 節(jié)點(diǎn)上都創(chuàng)建兩個軟鏈接
- 5.配置 mysql 一主兩從
- 6.安裝 MHA 軟件
- 7.在所有服務(wù)器上配置無密碼認(rèn)證
- 8.在 manager 節(jié)點(diǎn)上配置 MHA
- 9.第一次配置需要在 Master 節(jié)點(diǎn)上手動開啟虛擬IP
- 10.在 manager 節(jié)點(diǎn)上測試 ssh 無密碼認(rèn)證,如果正常最后會輸出 successfully,如下所示。
- 11.在 manager 節(jié)點(diǎn)上測試 mysql 主從連接情況,最后出現(xiàn) MySQL Replication Health is OK 字樣說明正常。如下所示。
- 12.在 manager 節(jié)點(diǎn)上啟動 MHA
- 13.查看 MHA 狀態(tài),可以看到當(dāng)前的 master 是 Mysql1 節(jié)點(diǎn)。
- 14 . 查看 MHA 日志,也以看到當(dāng)前的 master 是 192.168.80.10,如下所示。
- 15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因?yàn)?manager 節(jié)點(diǎn)停止 MHA 服務(wù)而消失。
- 2.1.2 故障模擬
- 2.1.3 故障修復(fù)步驟
- 1.修復(fù)mysql
- 2.修復(fù)主從
- 3.在 manager 節(jié)點(diǎn)上修改配置文件app1.cnf(再把這個記錄添加進(jìn)去,因?yàn)樗鼨z測掉失效時候會自動消失)
- 4 . 從庫必須設(shè)置為只讀模式:當(dāng)前從庫為mysql
- 5.在 manager 節(jié)點(diǎn)上啟動 MHA,并查看VIP是否漂移到mysql2
- 2.2 MySQL MHA搭建具體操作步驟(實(shí)操)
- 2.2.1 搭建步驟
- 1.Master、Slave1、Slave2 節(jié)點(diǎn)上安裝 mysql5.7
- 2.分別修改 Master、Slave1、Slave2 節(jié)點(diǎn)的主機(jī)名
- 3.修改 Master、Slave1、Slave2 節(jié)點(diǎn)的 Mysql主配置文件/etc/my.cnf
- 4.在 Master、Slave1、Slave2 節(jié)點(diǎn)上都創(chuàng)建兩個軟鏈接
- 5.配置 mysql 一主兩從
- 6.安裝 MHA 軟件
- 7.在所有服務(wù)器上配置無密碼認(rèn)證
- 8.在 manager 節(jié)點(diǎn)上配置 MHA
- 9.第一次配置需要在 Master 節(jié)點(diǎn)上手動開啟虛擬IP
- 10.在 manager 節(jié)點(diǎn)上測試 ssh 無密碼認(rèn)證,如果正常最后會輸出 successfully。如下所示。
- 11.在 manager 節(jié)點(diǎn)上測試 mysql 主從連接情況,最后出現(xiàn) MySQL Replication Health is OK 字樣說明正常。如下所示。
- 12.在 manager 節(jié)點(diǎn)上啟動 MHA
- 13.查看 MHA 狀態(tài),可以看到當(dāng)前的 master 是 Mysql1 節(jié)點(diǎn)。
- 14 . 查看 MHA 日志,也以看到當(dāng)前的 master 是 192.168.80.10,如下所示
- 15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因?yàn)?manager 節(jié)點(diǎn)停止 MHA 服務(wù)而消失。
- 2.2.2 故障模擬
- 1 . 再次開啟MHA,在 manager 節(jié)點(diǎn)上tail -f /var/log/masterha/app1/manager.log監(jiān)控觀察日志記錄
- 2 . 在 Master 節(jié)點(diǎn) Mysql1 上停止mysql服務(wù)
- 3 . 查看 mysql2 是否接管 VIP,如下圖已經(jīng)接管
- 2.2.3 故障修復(fù)步驟
- 1.修復(fù)mysql,啟動mysql1的服務(wù)
- 2.修復(fù)主從
- 3.在 manager 節(jié)點(diǎn)上修改配置文件app1.cnf(再把這個記錄添加進(jìn)去,因?yàn)樗鼨z測掉失效時候會自動消失)
- 4 . 從庫必須設(shè)置為只讀模式:當(dāng)前從庫為mysql
- 5.在 manager 節(jié)點(diǎn)上啟動 MHA
一、MySQL MHA介紹
MHA(MasterHigh Availability)是一款開源的 MySQL 的高可用程序,它為 MySQL 主從復(fù)制架構(gòu)提供了 automating master failover 功能。MHA 在監(jiān)控到 master 節(jié)點(diǎn)故障時,會提升其中擁有最新數(shù)據(jù)的 slave 節(jié)點(diǎn)成為新的master 節(jié)點(diǎn),在此期間,MHA 會通過于其它從節(jié)點(diǎn)獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節(jié)點(diǎn)的在線切換功能,即按需切換 master/slave 節(jié)點(diǎn)。
MHA 是由日本人 yoshinorim(原就職于DeNA現(xiàn)就職于FaceBook)開發(fā)的比較成熟的 MySQL 高可用方案。MHA 能夠在30秒內(nèi)實(shí)現(xiàn)故障切換,并能在故障切換中,最大可能的保證數(shù)據(jù)一致性。
1.1 什么是 MHA?
MHA(MasterHigh Availability)是一套優(yōu)秀的MySQL高可用環(huán)境下故障切換和主從復(fù)制的軟件。
MHA 的出現(xiàn)就是解決MySQL 單點(diǎn)的問題。
MySQL故障切換過程中,MHA能做到0-30秒內(nèi)自動完成故障切換操作。
MHA能在故障切換的過程中最大程度上保證數(shù)據(jù)的一致性,以達(dá)到真正意義上的高可用。
1.2 MHA 的組成
1) MHA Node(數(shù)據(jù)節(jié)點(diǎn))
MHA Node 運(yùn)行在每臺 MySQL 服務(wù)器上。
2) MHA Manager(管理節(jié)點(diǎn))
MHA Manager 可以單獨(dú)部署在一臺獨(dú)立的機(jī)器上,管理多個 master-slave 集群;也可以部署在一臺 slave 節(jié)點(diǎn)上。
MHA Manager 會定時探測集群中的 master 節(jié)點(diǎn)。當(dāng) master 出現(xiàn)故障時,它可以自動將最新數(shù)據(jù)的 slave 提升為新的 master, 然后將所有其他的 slave 重新指向新的 master。整個故障轉(zhuǎn)移過程對應(yīng)用程序完全透明。
1.3 MHA 的特點(diǎn)
自動故障切換過程中,MHA試圖從宕機(jī)的主服務(wù)器上保存二進(jìn)制日志,最大程度的保證數(shù)據(jù)不丟失;
使用半同步復(fù)制,可以大大降低數(shù)據(jù)丟失的風(fēng)險,如果只有一個slave已經(jīng)收到了最新的二進(jìn)制日志,MHA可以將最新的二進(jìn)制日志應(yīng)用于其他所有的slave服務(wù)器上,因此可以保證所有節(jié)點(diǎn)的數(shù)據(jù)一致性;
目前MHA支持一主多從架構(gòu),最少三臺服務(wù),即一主兩從.
二、MySQL MHA搭建
實(shí)驗(yàn)思路:
1.MHA架構(gòu)部分
1)數(shù)據(jù)庫安裝
2)一主兩從
3)MHA搭建
2.故障模擬部分
1)主庫失效
2)備選主庫成為主庫
3)原故障主庫恢復(fù)重新加入到MHA成為從庫
3 . 環(huán)境準(zhǔn)備
服務(wù)器類型 系統(tǒng)和IP地址 需要安裝的組件
MHA manager 節(jié)點(diǎn)服務(wù)器 CentOS7.4(64 位) manager/192.168.80.40 安裝MHA node 和 manager 組件
Master 節(jié)點(diǎn)服務(wù)器 CentOS7.4(64 位) mysql2/192.168.80.10 安裝mysql5.7、MHA node 組件
Slave1 節(jié)點(diǎn)服務(wù)器 CentOS7.4(64 位) mysql2/192.168.80.20 安裝mysql5.7、MHA node 組件
Slave2 節(jié)點(diǎn)服務(wù)器 CentOS7.4(64 位) mysql2/192.168.80.30 安裝mysql5.7、MHA node 組件
2.1 MySQL MHA搭建的步驟(理論)
2.1.1 搭建步驟
關(guān)閉防火墻和SElinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.Master、Slave1、Slave2 節(jié)點(diǎn)上安裝 mysql5.7
具體安裝步驟見此篇博客:MySQL安裝步驟詳解
2.修改 Master、Slave1、Slave2 節(jié)點(diǎn)的主機(jī)名
hostnamectl set-hostname Mysql1
hostnamectl set-hostname Mysql2
hostnamectl set-hostname Mysql3
3.修改 Master、Slave1、Slave2 節(jié)點(diǎn)的 Mysql主配置文件/etc/my.cnf
##Master 節(jié)點(diǎn)##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
systemctl restart mysqld
##Slave1、Slave2 節(jié)點(diǎn)##
vim /etc/my.cnf
server-id = 2 #三臺服務(wù)器的 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 節(jié)點(diǎn)上都創(chuàng)建兩個軟鏈接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
5.配置 mysql 一主兩從
(1)所有數(shù)據(jù)庫節(jié)點(diǎn)進(jìn)行 mysql 授權(quán)
mysql -uroot -p
grant replication slave on . to ‘myslave’@‘192.168.80.%’ identified by ‘123’; #從數(shù)據(jù)庫同步使用
grant all privileges on . to ‘mha’@‘192.168.80.%’ identified by ‘manager’; #manager 使用
grant all privileges on . to ‘mha’@‘Mysql1’ identified by ‘manager’; #防止從庫通過主機(jī)名連接不上主庫
grant all privileges on . to ‘mha’@‘Mysql2’ identified by ‘manager’;
grant all privileges on . to ‘mha’@‘Mysql3’ identified by ‘manager’;
(2)在 Master 節(jié)點(diǎn)查看二進(jìn)制文件和同步點(diǎn)
show master status;
±------------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±------------------±---------±-------------±-----------------±------------------+
| master-bin.000002 | 1745 | | | |
±------------------±---------±-------------±-----------------±------------------+
(3)在 Slave1、Slave2 節(jié)點(diǎn)執(zhí)行同步操作
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 節(jié)點(diǎn)查看數(shù)據(jù)同步結(jié)果
show slave status\G
//確保 IO 和 SQL 線程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(5)兩個從庫必須設(shè)置為只讀模式:
set global read_only=1;
(6)插入數(shù)據(jù)測試數(shù)據(jù)庫同步
##在 Master 主庫插入條數(shù)據(jù),測試是否同步##
create database test_db;
use test_db;
create table test(id int);
insert into test(id) values (1);
(7)從庫測試數(shù)據(jù)庫同步
select * from test_db.test;
±-----+
| id |
±-----+
| 1 |
±-----+
6.安裝 MHA 軟件
(1)所有服務(wù)器上都安裝 MHA 依賴的環(huán)境,首先安裝 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 軟件包,先在所有服務(wù)器上必須先安裝 node 組件
對于每個操作系統(tǒng)版本不一樣,這里 CentOS7.4 必須選擇 0.57 版本。
在所有服務(wù)器上必須先安裝 node 組件,最后在 MHA-manager 節(jié)點(diǎn)上安裝 manager 組件,因?yàn)?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 節(jié)點(diǎn)上安裝 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 復(fù)制狀況
masterha_manger 啟動 manager的腳本
masterha_check_status 檢測當(dāng)前 MHA 運(yùn)行狀態(tài)
masterha_master_monitor 檢測 master 是否宕機(jī)
masterha_master_switch 控制故障轉(zhuǎn)移(自動或者手動)
masterha_conf_host 添加或刪除配置的 server 信息
masterha_stop 關(guān)閉manager
#node 組件安裝后也會在/usr/local/bin 下面會生成幾個腳本(這些工具通常由 MHAManager 的腳本觸發(fā),無需人為操作)主要如下:
save_binary_logs 保存和復(fù)制 master 的二進(jìn)制日志
apply_diff_relay_logs 識別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
purge_relay_logs 清除中繼日志(不會阻塞 SQL 線程)
7.在所有服務(wù)器上配置無密碼認(rèn)證
(1)在 manager 節(jié)點(diǎn)上配置到所有數(shù)據(jù)庫節(jié)點(diǎn)的無密碼認(rèn)證
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 上配置到數(shù)據(jù)庫節(jié)點(diǎn) mysql2 和 mysql3 的無密碼認(rèn)證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.20
ssh-copy-id 192.168.80.30
(3)在 mysql2 上配置到數(shù)據(jù)庫節(jié)點(diǎn) mysql1 和 mysql3 的無密碼認(rèn)證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.10
ssh-copy-id 192.168.80.30
(4)在 mysql3 上配置到數(shù)據(jù)庫節(jié)點(diǎn) mysql1 和 mysql2 的無密碼認(rèn)證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.10
ssh-copy-id 192.168.80.20
8.在 manager 節(jié)點(diǎn)上配置 MHA
(1)在 manager 節(jié)點(diǎn)上復(fù)制相關(guān)腳本到/usr/local/bin 目錄
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//拷貝后會有四個執(zhí)行文件
ll /usr/local/bin/scripts/
master_ip_failover #自動切換時 VIP 管理的腳本
master_ip_online_change #在線切換時 vip 的管理
power_manager #故障發(fā)生后關(guān)閉主機(jī)的腳本
send_report #因故障切換后發(fā)送報警的腳本
(2)復(fù)制上述的自動切換時 VIP 管理的腳本到 /usr/local/bin 目錄,這里使用master_ip_failover腳本來管理 VIP 和故障切換
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)修改內(nèi)容如下:(刪除原有內(nèi)容,直接復(fù)制并修改vip相關(guān)參數(shù))
vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => ‘a(chǎn)ll’;
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
#############################添加內(nèi)容部分#########################################
my $vip = ‘192.168.80.200’; #指定vip的地址
my $brdc = ‘192.168.80.255’; #指定vip的廣播地址
my $ifdev = ‘ens33’; #指定vip綁定的網(wǎng)卡
my $key = ‘1’; #指定vip綁定的虛擬網(wǎng)卡序列號
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; #指定退出狀態(tài)碼為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)創(chuàng)建 MHA 軟件目錄并拷貝配置文件,這里使用app1.cnf配置文件來管理 mysql 節(jié)點(diǎn)服務(wù)器
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
vim /etc/masterha/app1.cnf #刪除原有內(nèi)容,直接復(fù)制并修改節(jié)點(diǎn)服務(wù)器的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 #設(shè)置自動failover時候的切換腳本,也就是上面的那個腳本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change #設(shè)置手動切換時候的切換腳本
password=manager #設(shè)置mysql中root用戶的密碼,這個密碼是前文中創(chuàng)建監(jiān)控用戶的那個密碼
ping_interval=1 #設(shè)置監(jiān)控主庫,發(fā)送ping包的時間間隔,默認(rèn)是3秒,嘗試三次沒有回應(yīng)的時候自動進(jìn)行failover
remote_workdir=/tmp #設(shè)置遠(yuǎn)端mysql在發(fā)生切換時binlog的保存位置
repl_password=123 #設(shè)置復(fù)制用戶的密碼
repl_user=myslave #設(shè)置復(fù)制用戶的用戶
report_script=/usr/local/send_report #設(shè)置發(fā)生切換后發(fā)送的報警的腳本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.20 -s 192.168.80.30 #指定檢查的從服務(wù)器IP地址
shutdown_script="" #設(shè)置故障發(fā)生后關(guān)閉故障主機(jī)腳本(該腳本的主要作用是關(guān)閉主機(jī)防止發(fā)生腦裂,這里沒有使用)
ssh_user=root #設(shè)置ssh的登錄用戶名
user=mha #設(shè)置監(jiān)控用戶root
[server1]
hostname=192.168.80.10
port=3306
[server2]
hostname=192.168.80.20
port=3306
candidate_master=1
#設(shè)置為候選master,設(shè)置該參數(shù)以后,發(fā)生主從切換以后將會將此從庫提升為主庫,即使這個從庫不是集群中最新的slave
check_repl_delay=0
#默認(rèn)情況下如果一個slave落后master 超過100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,
因?yàn)閷τ谶@個slave的恢復(fù)需要花費(fèi)很長時間;通過設(shè)置check_repl_delay=0,MHA觸發(fā)切換在選擇一個新的master的
時候?qū)雎詮?fù)制延時,這個參數(shù)對于設(shè)置了candidate_master=1的主機(jī)非常有用,因?yàn)檫@個候選主在切換的過程中一定是新的master
[server3]
hostname=192.168.80.30
port=3306
9.第一次配置需要在 Master 節(jié)點(diǎn)上手動開啟虛擬IP
/sbin/ifconfig ens33:1 192.168.80.200/24
10.在 manager 節(jié)點(diǎn)上測試 ssh 無密碼認(rèn)證,如果正常最后會輸出 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 節(jié)點(diǎn)上測試 mysql 主從連接情況,最后出現(xiàn) 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 節(jié)點(diǎn)上啟動 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:該參數(shù)代表當(dāng)發(fā)生主從切換后,老的主庫的 ip 將會從配置文件中移除。
–manger_log:日志存放位置。
–ignore_last_failover:在缺省情況下,如果 MHA 檢測到連續(xù)發(fā)生宕機(jī),且兩次宕機(jī)間隔不足 8 小時的話,
則不會進(jìn)行 Failover, 之所以這樣限制是為了避免 ping-pong 效應(yīng)。該參數(shù)代表忽略上次 MHA 觸發(fā)切換產(chǎn)生的文件,
默認(rèn)情況下,MHA 發(fā)生切換后會在日志記目錄,也就是上面設(shè)置的日志app1.failover.complete文件,
下次再次切換的時候如果發(fā)現(xiàn)該目錄下存在該文件將不允許觸發(fā)切換,除非在第一次切換后收到刪除該文件,
為了方便,這里設(shè)置為–ignore_last_failover。
13.查看 MHA 狀態(tài),可以看到當(dāng)前的 master 是 Mysql1 節(jié)點(diǎn)。
masterha_check_status --conf=/etc/masterha/app1.cnf
14 . 查看 MHA 日志,也以看到當(dāng)前的 master 是 192.168.80.10,如下所示。
15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因?yàn)?manager 節(jié)點(diǎn)停止 MHA 服務(wù)而消失。
ifconfig
//若要關(guān)閉 manager 服務(wù),可以使用如下命令。
masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 進(jìn)程 ID 的方式關(guān)閉。
2.1.2 故障模擬
#在 manager 節(jié)點(diǎn)上監(jiān)控觀察日志記錄
tail -f /var/log/masterha/app1/manager.log
#在 Master 節(jié)點(diǎn) Mysql1 上停止mysql服務(wù)
systemctl stop mysqld
或
pkill -9 mysql
#正常自動切換一次后,MHA 進(jìn)程會退出。HMA 會自動修改 app1.cnf 文件內(nèi)容,將宕機(jī)的 mysql1 節(jié)點(diǎn)刪除。查看 mysql2 是否接管 VIP
ifconfig
故障切換備選主庫的算法:
1.一般判斷從庫的是從(position/GTID)判斷優(yōu)劣,數(shù)據(jù)有差異,最接近于master的slave,成為備選主。
2.數(shù)據(jù)一致的情況下,按照配置文件順序,選擇備選主庫。
3.設(shè)定有權(quán)重(candidate_master=1),按照權(quán)重強(qiáng)制指定備選主。
(1)默認(rèn)情況下如果一個slave落后master 100M的relay logs的話,即使有權(quán)重,也會失效。
(2)如果check_repl_delay=0的話,即使落后很多日志,也強(qiáng)制選擇其為備選主。
2.1.3 故障修復(fù)步驟
1.修復(fù)mysql
systemctl restart mysqld
2.修復(fù)主從
#在現(xiàn)主庫服務(wù)器 Mysql2 查看二進(jìn)制文件和同步點(diǎn)
show master status;
#在原主庫服務(wù)器 mysql1 執(zhí)行同步操作
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 節(jié)點(diǎn)上修改配置文件app1.cnf(再把這個記錄添加進(jìn)去,因?yàn)樗鼨z測掉失效時候會自動消失)
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 . 從庫必須設(shè)置為只讀模式:當(dāng)前從庫為mysql
set global read_only=1;
5.在 manager 節(jié)點(diǎn)上啟動 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 狀態(tài),可以看到當(dāng)前的 master 是 Mysql2 節(jié)點(diǎn)
masterha_check_status --conf=/etc/masterha/app1.cnf
#解決中英字不兼容報錯的問題
dos2unix /usr/local/bin/master_ip_failover
2.2 MySQL MHA搭建具體操作步驟(實(shí)操)
2.2.1 搭建步驟
1.Master、Slave1、Slave2 節(jié)點(diǎn)上安裝 mysql5.7
2.分別修改 Master、Slave1、Slave2 節(jié)點(diǎn)的主機(jī)名
3.修改 Master、Slave1、Slave2 節(jié)點(diǎn)的 Mysql主配置文件/etc/my.cnf
配置完成記得重啟這三臺服務(wù)器!!!!!
4.在 Master、Slave1、Slave2 節(jié)點(diǎn)上都創(chuàng)建兩個軟鏈接
5.配置 mysql 一主兩從
(1)所有數(shù)據(jù)庫節(jié)點(diǎn)進(jìn)行 mysql 授權(quán)
(2)在 Master 節(jié)點(diǎn)查看二進(jìn)制文件和同步點(diǎn)
(3)分別在 Slave1、Slave2 節(jié)點(diǎn)執(zhí)行同步操作
(4)在 Slave1、Slave2 節(jié)點(diǎn)查看數(shù)據(jù)同步結(jié)果
(5)兩個從庫必須設(shè)置為只讀模式:
(6)插入數(shù)據(jù)測試數(shù)據(jù)庫同步
(7)從庫測試數(shù)據(jù)庫同步
6.安裝 MHA 軟件
(1)所有服務(wù)器上都安裝 MHA 依賴的環(huán)境,首先安裝 epel 源
(2)安裝 MHA 軟件包,先在所有服務(wù)器上必須先安裝 node 組件
(3)在 MHA manager 節(jié)點(diǎn)上安裝 manager 組件
7.在所有服務(wù)器上配置無密碼認(rèn)證
(1)在 manager 節(jié)點(diǎn)上配置到所有數(shù)據(jù)庫節(jié)點(diǎn)的無密碼認(rèn)證
到所有數(shù)據(jù)庫節(jié)點(diǎn)的無密碼認(rèn)證,密碼為root密碼
(2)在 mysql1 上配置到數(shù)據(jù)庫節(jié)點(diǎn) mysql2 和 mysql3 的無密碼認(rèn)證
(3)在 mysql2 上配置到數(shù)據(jù)庫節(jié)點(diǎn) mysql1 和 mysql3 的無密碼認(rèn)證
(4)在 mysql3 上配置到數(shù)據(jù)庫節(jié)點(diǎn) mysql1 和 mysql2 的無密碼認(rèn)證
8.在 manager 節(jié)點(diǎn)上配置 MHA
(1)在 manager 節(jié)點(diǎn)上復(fù)制相關(guān)腳本到/usr/local/bin 目錄
//拷貝后會有四個執(zhí)行文件
(2)復(fù)制上述的自動切換時 VIP 管理的腳本到 /usr/local/bin 目錄,這里使用master_ip_failover腳本來管理 VIP 和故障切換
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)修改內(nèi)容如下:(刪除原有內(nèi)容,直接復(fù)制并修改vip相關(guān)參數(shù))
(4)創(chuàng)建 MHA 軟件目錄并拷貝配置文件,這里使用app1.cnf配置文件來管理 mysql 節(jié)點(diǎn)服務(wù)器
9.第一次配置需要在 Master 節(jié)點(diǎn)上手動開啟虛擬IP
10.在 manager 節(jié)點(diǎn)上測試 ssh 無密碼認(rèn)證,如果正常最后會輸出 successfully。如下所示。
11.在 manager 節(jié)點(diǎn)上測試 mysql 主從連接情況,最后出現(xiàn) MySQL Replication Health is OK 字樣說明正常。如下所示。
12.在 manager 節(jié)點(diǎn)上啟動 MHA
13.查看 MHA 狀態(tài),可以看到當(dāng)前的 master 是 Mysql1 節(jié)點(diǎn)。
14 . 查看 MHA 日志,也以看到當(dāng)前的 master 是 192.168.80.10,如下所示
15 . 查看 Mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因?yàn)?manager 節(jié)點(diǎn)停止 MHA 服務(wù)而消失。
在mysql1上查看vip
對manager 節(jié)點(diǎn)停止 MHA 服務(wù)
在mysql1上再次查看vip,并沒有消失
2.2.2 故障模擬
1 . 再次開啟MHA,在 manager 節(jié)點(diǎn)上tail -f /var/log/masterha/app1/manager.log監(jiān)控觀察日志記錄
2 . 在 Master 節(jié)點(diǎn) Mysql1 上停止mysql服務(wù)
3 . 查看 mysql2 是否接管 VIP,如下圖已經(jīng)接管
在 manager 節(jié)點(diǎn)上監(jiān)控觀察日志記錄也應(yīng)轉(zhuǎn)到mysql2
2.2.3 故障修復(fù)步驟
1.修復(fù)mysql,啟動mysql1的服務(wù)
2.修復(fù)主從
#在現(xiàn)主庫服務(wù)器 Mysql2 查看二進(jìn)制文件和同步點(diǎn)
#在原主庫服務(wù)器 mysql1 執(zhí)行同步操作
#在原主庫服務(wù)器 mysql1 查看數(shù)據(jù)同步結(jié)果,如果失敗參考第二個圖
如果都是正常的話,到這一步失敗的話可以在mysql2上重新授權(quán)數(shù)據(jù)庫同步,然后刷新配置↓↓↓↓↓↓↓↓
3.在 manager 節(jié)點(diǎn)上修改配置文件app1.cnf(再把這個記錄添加進(jìn)去,因?yàn)樗鼨z測掉失效時候會自動消失)
4 . 從庫必須設(shè)置為只讀模式:當(dāng)前從庫為mysql
5.在 manager 節(jié)點(diǎn)上啟動 MHA
總結(jié)
以上是生活随笔為你收集整理的MySQL(10)数据库实现高可用架构之MHA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL(9)主从复制与读写分离
- 下一篇: MySQL(11)数据库实现高可用架构之