一、MHA理論
1.1什么是 MHA
MHA(MasterHigh Availability)是一套優(yōu)秀的MySQL高可用環(huán)境下故障切換和主從復制的軟件。
MHA 的出現(xiàn)就是解決MySQL 單點的問題。
MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換操作。
MHA能在故障切換的過程中最大程度上保證數(shù)據(jù)的一致性,以達到真正意義上的高可用。
1.2MHA 的組成
-
MHA Node(數(shù)據(jù)節(jié)點)
MHA Node 運行在每臺 MySQL 服務器上。 -
MHA Manager(管理節(jié)點)
MHA Manager 可以單獨部署在一臺獨立的機器上,管理多個 master-slave 集群;也可以部署在一臺 slave 節(jié)點上。
MHA Manager 會定時探測集群中的 master 節(jié)點。當 master 出現(xiàn)故障時,它可以自動將最新數(shù)據(jù)的 slave 提升為新的 master, 然后將所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程序完全透明。
1.3MHA 的特點
- 自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證數(shù)據(jù)不丟失
- 使用半同步復制,可以大大降低數(shù)據(jù)丟失的風險,如果只有一個slave已經(jīng)收到了最新的二進制日志,MHA可以將最新的二進制日志應用于其他所有的slave服務器上,因此可以保證所有節(jié)點的數(shù)據(jù)一致性
- 目前MHA支持一主多從架構,最少三臺服務,即一主兩從
二、MHA的一主兩從部署
實驗設計
滿足的需求:搭建一個一主二從的高可用讀寫復制mysql集群,當主服務器宕機后,數(shù)據(jù)更新最全的從服務器會取代主服務器,占用VIP,保證正常運行.
實驗組件 :
節(jié)點服務器 | 系統(tǒng) | 主機名 | IP地址 | 安裝工具及服務 |
---|---|---|---|---|
MHA manager 服務器 | CentOS7.9(64 位) | manager | 192.168.44.100 | MHA node 和 manager 組件 |
Master 服務器 | CentOS7.9(64 位) | mysql1 | 192.168.44.101 | MHA node 組件 |
Slave1 服務器 | CentOS7.9(64 位) | mysql2 | 192.168.44.102 | MHA node 組件 |
Slave2 服務器 | CentOS7.9(64 位) | mysql3 | 192.168.44.103 | MHA node 組件 |
VIP地址:192.168.44.150 |
1、時間同步
在主和從服務器上做時間同步(在線時間同步)
2、修改 Master、Slave1、Slave2、manager 節(jié)點的主機名
hostnamectl set-hostname mysql1
hostnamectl set-hostname mysql2
hostnamectl set-hostname mysql3
hostnamectl set-hostname manager
3、關閉所有服務器的防火墻,并修改主和從服務器的hosts文件
4、修改 Master、Slave1、Slave2 節(jié)點的 Mysql主配置文件/etc/my.cnf
##Master 節(jié)點##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
##Slave1、Slave2 節(jié)點##
vim /etc/my.cnf
server-id = 2 #三臺服務器的 server-id 不能一樣
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
5、在 Master、Slave1、Slave2 節(jié)點上都創(chuàng)建兩個軟鏈接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
6、配置 mysql 一主兩從
(1)所有數(shù)據(jù)庫節(jié)點進行 mysql 授權
mysql -uroot -p
grant replication slave on . to ‘myslave’@‘192.168.80.%’ identified by ‘123’; #從數(shù)據(jù)庫同步使用
grant all privileges on . to ‘manager’@‘192.168.80.%’ identified by ‘mha123’; #manager 使用
grant all privileges on . to ‘manager’@‘mysql1’ identified by ‘mha123’; #防止從庫通過主機名連接不上主庫
grant all privileges on . to ‘manager’@‘mysql2’ identified by ‘mha123’;
grant all privileges on . to ‘manager’@‘mysql3’ identified by ‘mha123’;
flush privileges;
(2)在 Master 節(jié)點查看二進制文件和同步點
show master status;
(3)在 Slave1、Slave2 節(jié)點執(zhí)行同步操作
change master to master_host='192.168.44.100',master_user='myslave',master_password='123',master_log_file='mysql-bin.000002',master_log_pos=1761;
start slave;
(4)兩個從庫必須設置為只讀模式:
set global read_only=1;
7、安裝 MHA 軟件
(1)所有服務器上都安裝 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 軟件包,先在所有服務器上必須先安裝 node 組件
對于每個操作系統(tǒng)版本不一樣,這里 CentOS7.4 必須選擇 0.57 版本。
在所有服務器上必須先安裝 node 組件,最后在 MHA-manager 節(jié)點上安裝 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 節(jié)點上安裝 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 運行狀態(tài)
masterha_master_monitor 檢測 master 是否宕機
masterha_master_switch 控制故障轉移(自動或者手動)
masterha_conf_host 添加或刪除配置的 server 信息
masterha_stop 關閉manager
#node 組件安裝后也會在/usr/local/bin 下面會生成幾個腳本(這些工具通常由 MHAManager 的腳本觸發(fā),無需人為操作)主要如下:
save_binary_logs 保存和復制 master 的二進制日志
apply_diff_relay_logs 識別差異的中繼日志事件并將其差異的事件應用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
purge_relay_logs 清除中繼日志(不會阻塞 SQL 線程)
8、在所有服務器上配置無密碼認證
(1)在 manager 節(jié)點上配置到所有數(shù)據(jù)庫節(jié)點的無密碼認證
ssh-keygen -t rsa #一路按回車鍵
yum -y install sshpass #安裝工具
ssh-copy-id 192.168.44.101
ssh-copy-id 192.168.44.102
ssh-copy-id 192.168.44.103
修改/etc/ssh/ssh_conf文件
修改/etc/ssh/ssh_conf文件
(2)在 mysql1 上配置到數(shù)據(jù)庫節(jié)點 mysql2 和 mysql3 的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.44.102
ssh-copy-id 192.168.44.103
(3)在 mysql2 上配置到數(shù)據(jù)庫節(jié)點 mysql1 和 mysql3 的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.44.101
ssh-copy-id 192.168.44.103
(4)在 mysql3 上配置到數(shù)據(jù)庫節(jié)點 mysql1 和 mysql2 的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.44.101
ssh-copy-id 192.168.44.102
9、在 manager 節(jié)點上配置 MHA
(1)在 manager 節(jié)點上復制相關腳本到/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ā)生后關閉主機的腳本
send_report #因故障切換后發(fā)送報警的腳本
(2)復制上述的自動切換時 VIP 管理的腳本到 /usr/local/bin 目錄,這里使用master_ip_failover腳本來管理 VIP 和故障切換
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3)修改內容如下:(刪除原有內容,直接復制并修改vip相關參數(shù)??稍诳截惽拜斎?:set paste 解決vim粘貼亂序問題)
vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $orig_master_host, $orig_master_ip,$ssh_user,
$orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
$orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);
# 這里定義的虛擬IP配置要注意,這個ip必須要與你自己的集群在同一個網(wǎng)段,否則無效
my $vip = '192.168.44.150/24';
my $key = '1';
# 這里的網(wǎng)卡名稱 “ens33” 需要根據(jù)你機器的網(wǎng)卡名稱進行修改
# 如果多臺機器直接的網(wǎng)卡名稱不統(tǒng)一,有兩種方式,一個是改腳本,二是把網(wǎng)卡名稱修改成統(tǒng)一
# 我這邊實際情況是修改成統(tǒng)一的網(wǎng)卡名稱
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";
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,
'orig_master_ssh_port=i' => \$orig_master_ssh_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
'new_master_ssh_port' => \$new_master_ssh_port,
'new_master_user' => \$new_master_user,
'new_master_password' => \$new_master_password
);
exit &main();
sub main {
$ssh_user = defined $ssh_user ? $ssh_user : 'root';
print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
&start_arp();
$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() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub start_arp() {
`ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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é)點服務器
在manager服務器中創(chuàng)建
mkdir -p /opt/mysql-mha/mha
在所有服務器中創(chuàng)建
mkdir -p /opt/mysql-mha/mha-node
在manager服務器中創(chuàng)建文件
vim /opt/mysql-mha/mysql-mha.cnf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
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
user=manager
password=mha123
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=123456
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.44.102 -s 192.168.44.103
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.44.101
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.44.102
port=3306
[server3]
hostname=192.168.44.103
port=3306
[server default]
manager_log=/opt/mysql-mha/manager.log #指定manager日志路徑
manager_workdir=/opt/mysql-mha/mha #指定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 #設置手動切換時候的切換腳本
user=manager #設置mha訪問數(shù)據(jù)庫的賬號
password=mha123 #設置mha訪問數(shù)據(jù)庫的賬號密碼
ping_interval=1 #設置監(jiān)控主庫,發(fā)送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行failover
remote_workdir=/opt/mysql-mha/mha-node #指定mha在遠程節(jié)點上的工作目錄
repl_user=myslave #設置主從復制的用戶
repl_password=123456 #設置主從復制的用戶密碼
report_script=/usr/local/send_report #設置發(fā)生故障切換的時候發(fā)送郵件提醒
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.44.102 -s 192.168.44.103 #指定檢查的從服務器IP地址
shutdown_script=“” #設置故障發(fā)生后關閉故障主機腳本(該腳本的主要作用是關閉主機防止發(fā)生腦裂,這里沒有使用)
ssh_user=root #設置ssh的登錄用戶名
[server1]
hostname=192.168.44.101
port=3306
[server2]
hostname=192.168.44.102
port=3306
candidate_master=1
#設置為候選master,設置該參數(shù)以后,發(fā)生主從切換以后將會將此從庫提升為主庫,即使這個從庫不是集群中最新的slave
check_repl_delay=0
#默認情況下如果一個slave落后master 超過100M的relay logs的話,MHA將不會選擇該slave作為一個新的master, 因為對于這個slave的恢復需要花費很長時間;通過設置check_repl_delay=0,MHA觸發(fā)切換在選擇一個新的master的時候將會忽略復制延時,這個參數(shù)對于設置了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master
[server3]
hostname=192.168.44.103
port=3306
10、在主服務器中添加vip
ifconfig ens33:1 192.168.44.150/24
11、10.在 manager 節(jié)點上測試 ssh 無密碼認證,如果正常最后會輸出 successfully,如下所示。
masterha_check_ssh -conf=/opt/mysql-mha/mysql-mha.cnf
12、在 manager 節(jié)點上測試 mysql 主從連接情況,最后出現(xiàn) MySQL Replication Health is OK 字樣說明正常。如下所示。
masterha_check_repl -conf=/opt/mysql-mha/mysql-mha.cnf
13、12.在 manager 節(jié)點上啟動 MHA
nohup masterha_manager \
--conf=/opt/mysql-mha/mysql-mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
–remove_dead_master_conf:該參數(shù)代表當發(fā)生主從切換后,老的主庫的 ip 將會從配置文件中移除。
–ignore_last_failover:在缺省情況下,如果 MHA 檢測到連續(xù)發(fā)生宕機,且兩次宕機間隔不足 8 小時的話,則不會進行 Failover, 之所以這樣限制是為了避免 ping-pong 效應。該參數(shù)代表忽略上次 MHA 觸發(fā)切換產(chǎn)生的文件,默認情況下,MHA 發(fā)生切換后會在 app1.failover.complete 日志文件中記錄,下次再次切換的時候如果發(fā)現(xiàn)該目錄下存在該文件將不允許觸發(fā)切換, 除非在第一次切換后刪除該文件,為了方便,這里設置為–ignore_last_failover。
●使用&后臺運行程序:結果會輸出到終端;使用Ctrl+C發(fā)送SIGINT信號,程序免疫;關閉session發(fā)送SIGHUP信號,程序關閉。
●使用nohup運行程序:結果默認會輸出到nohup.out;使用Ctrl+C發(fā)送SIGINT信號,程序關閉;關閉session發(fā)送SIGHUP信號,程序免疫。
●使用nohup和&配合來啟動程序nohup ./test &:同時免疫SIGINT和SIGHUP信號。
14、查看 MHA 狀態(tài),可以看到當前的 master 是 mysql1 節(jié)點。
masterha_check_status --conf=/opt/mysql-mha/mysql_mha.cnf
15、查看 MHA 日志,也以看到當前的 master 是 192.168.80.10,如下所示。
cat /opt/mysql-mha/manager.log | grep "current master"
16、查看 mysql1 的 VIP 地址 192.168.80.200 是否存在,這個 VIP 地址不會因為 manager 節(jié)點停止 MHA 服務而消失。
ifconfig
//若要關閉 manager 服務,可以使用如下命令。
masterha_stop --conf=/opt/mysql-mha/mysql_mha.cnf
或者可以直接采用 kill 進程 ID 的方式關閉。
故障模擬
1、在 manager 節(jié)點上監(jiān)控觀察日志記錄
2、在 Master 節(jié)點 mysql1 上停止mysql服務
systemctl stop mysqld
manager日志:
slave1:
slave2:
#正常自動切換一次后,MHA 進程會退出。HMA 會自動修改 app1.cnf 文件內容,將宕機的 mysql1 節(jié)點刪除。查看 mysql2 是否接管 VIP
ifconfig
故障切換備選主庫的算法:
1.一般判斷從庫的是從(position/GTID)判斷優(yōu)劣,數(shù)據(jù)有差異,最接近于master的slave,成為備選主。
2.數(shù)據(jù)一致的情況下,按照配置文件順序,選擇備選主庫。
3.設定有權重(candidate_master=1),按照權重強制指定備選主。
(1)默認情況下如果一個slave落后master 100M的relay logs的話,即使有權重,也會失效。
(2)如果check_repl_delay=0的話,即使落后很多日志,也強制選擇其為備選主。
查看/opt/mysql-mha/mysql-mha.cnf文件
故障修復步驟:
1.修復mysql
systemctl restart mysqld
2.修復主從
#在現(xiàn)主庫服務器 mysql2 查看二進制文件和同步點
show master status;
#在原主庫服務器 mysql1 執(zhí)行同步操作
change master to master_host=‘192.168.44.101’,master_user=‘myslave’,master_password=‘123456’,master_log_file=‘mysql-bin.000001’,master_log_pos=2647;
文章來源:http://www.zghlxwxcb.cn/news/detail-521115.html
start slave;文章來源地址http://www.zghlxwxcb.cn/news/detail-521115.html
到了這里,關于MySQL----MHA高可用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!