【MySQL數據庫】MySQL 高可用搭建方案——MHA實戰

MHA(Master High Availability)

MHA實戰

    • MHA(Master High Availability)
  • 一、MHA簡介
  • 二、MHA搭建準備
    • 要求:mha集群搭建,4臺服務器,1主2從,1臺mha
    • 2.1實驗思路
    • 2.2實驗準備
  • 三、搭建MySQL+MHA
    • 3.1初始化環境
    • 3.2配置主從復制
      • 1、修改主機名
      • 2、添加域名解析
      • 3、配置主從同步
      • 3.2.1master、Slave1、Slave2 節點上都創建兩個軟鏈接
      • 3.2.2登錄數據庫主從配置授權
      • 3.2.3master 節點查看二進制文件和同步點 、在 slave1、slave2 節點執行同步操作
      • 3.2.4設置兩個從節點 只讀模式
      • 3.2.5驗證主從同步
    • 3.3安裝MHA軟件
      • 1、 安裝 MHA 依賴的環境
      • 2、安裝 MHA NODE軟件包
      • 4、安裝 manager 組件
    • 5、SSH無密碼認證
    • 3.5配置MHA
      • 1、復制相關腳本
      • 2、master_ip_failover
      • 3、app1.cnf配置
      • 4、在master上手動開啟vip
      • 5、測試 ssh 無密碼認證
      • 6、測試 mysql 主從連接情況
      • 7、啟動 MHA
      • 8、查看集群狀態
    • 3.6故障模擬
      • 1、監控MHA日志
      • 2、master 停止mysql服務
    • 3.7故障修復
      • 1、修復原master
      • 3.7.2修復主從
  • 四、總結
  • 五、問題匯總
  • 六、MHA的替代方案


一、MHA簡介

MHA(Master High Availability)是一個用于MySQL數據庫的高可用性解決方案,它能夠自動監控主數據庫的狀態,并在主數據庫發生故障時自動切換到備數據庫以實現高可用性。

MHA集群由三個組件組成:

  1. Manager節點:負責監控主數據庫和備數據庫的狀態,并在主數據庫故障時自動切換到備數據庫。Manager節點也負責管理配置文件和日志。
  2. Master節點:主數據庫。負責處理讀寫操作并將更改同步到備數據庫。
  3. Slave節點:備數據庫。與主數據庫保持同步,并在主數據庫故障時接管其角色。

MHA集群的工作原理如下:

  1. Manager節點通過檢測主數據庫的心跳和復制延遲來監控主數據庫的狀態。
  2. 當主數據庫發生故障或復制延遲過高時,Manager節點會自動執行故障切換操作,將備數據庫提升為主數據庫,并通知其他節點更新配置。
  3. 切換完成后,新的主數據庫會繼續處理讀寫操作,備數據庫會接管復制角色,并與新的主數據庫同步數據。

MHA集群的特點包括:

  1. 自動故障切換:當主數據庫發生故障時,MHA能夠自動將備數據庫提升為主數據庫,實現快速恢復。
  2. 數據一致性:MHA保證主數據庫和備數據庫之間的數據一致性,避免數據丟失或不一致。
  3. 簡單配置:MHA的配置相對簡單,只需在Manager節點上配置主數據庫和備數據庫的信息即可。
  4. 可擴展性:MHA可以同時監控和管理多個主數據庫和備數據庫,以實現更高的可用性和容錯性。

總結:MHA是一個用于MySQL數據庫的高可用性解決方案,通過自動監控和故障切換來實現主數據庫的高可用性,并保證數據一致性。它具有簡單配置、可擴展性和快速恢復等特點。

二、MHA搭建準備

要求:mha集群搭建,4臺服務器,1主2從,1臺mha

2.1實驗思路

MHA架構 :①數據庫安裝 ②一主兩從 ③MHA搭建

故障模擬: ①主庫失效 ②備選主庫成為主庫 ③原故障主庫恢復重新加入到MHA成為從庫

2.2實驗準備

節點服務器系統主機名IP地址安裝服務及工具
MHA manager節點服務器CentOS7.4(64 位)mha192.168.99.119安裝MHA node和manager組件
Master節點服務器CentOS7.4(64 位)master192.168.99.116安裝mysql5.7和MHA node組件
Slave1節點服務器CentOS7.4(64 位)slave1192.168.99.117安裝mysql5.7和MHA node組件
Slave2節點服務器CentOS7.4(64 位)slave2192.168.99.118mysql5.7和MHA node組件

三、搭建MySQL+MHA

3.1初始化環境

關閉防火墻和增強機制

每臺服務器上

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# selinux配置文件可將selinux項配置為disabled
vim /etc/selinux/config
SELINUX=disabled

3.2配置主從復制

1、修改主機名

Master、Slave1、Slave2上

#在master上(192.168.99.116)
hostnamectl set-hostname master
#在slave1(192.168.99.117)
hostnamectl set-hostname slave1
#在slave2(192.168.99.118)
hostnamectl set-hostname slave2
#在mha(192.168.99.119)
hostnamectl set-hostname mha

2、添加域名解析

master、slave1、slave2上

vim /etc/hosts
192.168.99.116 master
192.168.99.117 slave1
192.168.99.118 lave2
192.168.99.119 mha

3、配置主從同步

Master、Slave1、Slave2上

修改 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 節點##
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
###Slave2 節點##
vim /etc/my.cnf
server-id = 3 
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld

3.2.1master、Slave1、Slave2 節點上都創建兩個軟鏈接

Master、Slave1、Slave2上

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
ls /usr/sbin/mysql*

3.2.2登錄數據庫主從配置授權

Master、Slave1、Slave2上

#tips:master password aaAA@@11
# 由于三臺mysql在出現問題后,slave節點可能會變成master,所以授權賬號都需要給
###master、Slave1、Slave2 節點上都授權###
grant all privileges on *.* to 'root'@'192.168.99.%' identified by 'Admin@123';
#授權主從用戶
grant all privileges on *.* to 'mha'@'192.168.99.%' identified by 'Mha@1234';
grant all privileges on *.* to 'mha'@'master' identified by 'Mha@1234';
grant all privileges on *.* to 'mha'@'slave1' identified by 'Mha@1234';
grant all privileges on *.* to 'mha'@'slave2' identified by 'Mha@1234';#刷新數據庫
flush privileges;

在這里插入圖片描述

3.2.3master 節點查看二進制文件和同步點 、在 slave1、slave2 節點執行同步操作

###在master上###
show master status;###在slave1、slave2節點執行同步操作##
stop slave;
change master to
master_host='192.168.99.116',
master_user='root',
master_password='Admin@123',
master_log_file='mysql-bin.000008',
master_log_pos=154;start slave;
show slave status\G;
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
#兩項均為OK代表主從正常

3.2.4設置兩個從節點 只讀模式

Slave1、Slave2上

set global read_only=1;
set global relay_log_purge=off;
flush privileges;

3.2.5驗證主從同步

##在主master上創建庫##
create database school;
##在slave1、slave2上驗證##
show databases;

在這里插入圖片描述

 create table t1 (id int,name varchar(32));
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| t1               |
+------------------+
1 row in set (0.00 sec)

3.3安裝MHA軟件

1、 安裝 MHA 依賴的環境

所有服務器

yum install epel-release --nogpgcheck -y
#mha所需perl相關依賴
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軟件包

先在所有服務器上必須先安裝 node 組件

對于每個操作系統版本不一樣,這里 CentOS7.4 必須選擇 0.57 版本

在所有服務器上必須先安裝node組件,最后在 MHA-manager 節點上安裝 manager 組件,因為 manager 依賴 node 組件

所有服務器

##將需要的包下載到/opt下####每臺服務器上解壓安裝node組件##
cd /opt
tar zxf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
將需要的包下載到/opt下 

每臺服務器上編譯安裝node組件

node組件安裝后也會在/usr/local/bin 下面會生成幾個腳本(這些工具通常由 MHAManager 的腳本觸發,無需人為操作)主要如下:
save_binary_logs    保存和復制 master 的二進制日志
apply_diff_relay_logs   識別差異的中繼日志事件并將其差異的事件應用于其他的 slave
filter_mysqlbinlog  去除不必要的 ROLLBACK 事件
purge_relay_logs    清除中繼日志(不會阻塞sql線程)

4、安裝 manager 組件

MHA-manager 節點服務器上安裝 manager 組件

將軟件包mha4mysql-manager-0.57.tar.gz放入/opt目錄下
cd /opt
tar zxf 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
masterha_secondary_check   從遠程服務器建立tcp連接

在這里插入圖片描述

5、SSH無密碼認證

所有服務器上配置SSH無密碼認證

每臺服務器互相之間都需要ssh公鑰無密碼認證

manager節點上

#在 manager 節點上配置到所有數據庫節點的無密碼認證
ssh-keygen -t rsa       #一路按回車鍵
ssh-copy-id 192.168.99.116
ssh-copy-id 192.168.99.117
ssh-copy-id 192.168.99.118
ssh-copy-id 192.168.99.119# 想省事可以根據配置的/etc/hosts里的映射關系直接統一添加
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
ssh-copy-id mha
##(2)在 mysql1 上配置到數據庫節點 mysql2 和 mysql3 的無密碼認證ssh-keygen -t rsassh-copy-id 192.168.99.117  #將公鑰傳給兩個從節點,形成免密碼連接登錄ssh-copy-id 192.168.99.118##(3)在 mysql2 上配置到數據庫節點 mysql1 和 mysql3 的無密碼認證ssh-keygen -t rsassh-copy-id 192.168.99.116ssh-copy-id 192.168.99.118##(4)在 mysql3 上配置到數據庫節點 mysql1 和 mysql2 的無密碼認證ssh-keygen -t rsassh-copy-id 192.168.99.117ssh-copy-id 192.168.99.118

3.5配置MHA

1、復制相關腳本

在 manager 節點上復制相關腳本到/usr/local/bin 目錄

#如果是rpm安裝則忽略此步驟cp -rp /opt/mha4mysql-manager-0.57/samples/scripts/* /usr/local/bin
#拷貝后會有四個執行文件
master_ip_failover    #自動切換時 VIP 管理的腳本
master_ip_online_change  #在線切換時 vip 的管理
power_manager       #故障發生后關閉主機的腳本
send_report     #因故障切換后發送報警的腳本

2、master_ip_failover

修改master_ip_failover 全部刪除,添加以下內容,修改相關參數

 vim /usr/local/bin/master_ip_failover

此處復制時,第一行和其他需要單獨復制粘貼

腳本中的$vip$brdc需要改成對應的vip和廣播地址

1、復制粘貼版

#!/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.99.200';
my $brdc = '192.168.99.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;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() {`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";
}

在這里插入圖片描述

2、說明版

#!/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.99.200';									#指定vip的地址
my $brdc = '192.168.99.255';								#指定vip的廣播地址
my $ifdev = 'ens33';										#指定vip綁定的網卡
my $key = '1';												#指定vip綁定的虛擬網卡序列號
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此變量值為ifconfig ens33:1 192.168.99.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此變量值為ifconfig ens33:1 192.168.99.200 down
my $exit_code = 0;											#指定退出狀態碼為0
# ip命令的方式添加vip
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $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:$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====$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 \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`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";
}

3、app1.cnf配置

創建 MHA 軟件目錄并復制配置文件,使用app1.cnf配置文件來管理 mysql 節點服務器,配置文件一般放在/etc/目錄下

需要修改的信息主要包括
master_binlog_dir=/var/lib/mysql   user=mha
password=Mha@1234
repl_password=Admin@123   #設置主從復制用戶的密碼
repl_user=root   #設置主從復制用戶的用戶
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.99.117 -s 192.168.99.118
#S1-3的IP地址
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
#刪除原有內容,直接復制并修改節點服務器的IP地址,直接創建app1.cnf亦可echo '' > /etc/masterha/app1.cnf
vim /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/masterha/app1/manager.log      #manager日志
manager_workdir=/var/log/masterha/app1            #manager工作目錄
master_binlog_dir=/var/lib/mysql        #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=mha        #設置監控用戶root
password=Mha@1234    #設置mysql監控用戶的密碼,這個密碼是前文中創建監控用戶的那個密碼
ping_interval=1    #設置監控主庫,ping的時間間隔,默認3秒,嘗試三次沒有回應的時候自動進行failover
remote_workdir=/tmp     #設置遠端mysql在發生切換時binlog的保存位置
repl_password=Admin@123    #設置主從復制用戶的密碼
repl_user=root #設置主從復制用戶的用戶
report_script=/usr/local/send_report     #設置發生切換后發送的報警的腳本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.99.117 -s 192.168.99.118 #指定檢查的從服務器IP地址
shutdown_script=""      #設置故障發生后關閉故障主機腳本(該腳本的主要作用是關閉主機防止發生腦裂,這里沒有使用)
ssh_user=root    #設置ssh的登錄用戶名
user=mha        #設置監控用戶root
[server1]
hostname=192.168.99.116
port=3306
[server2]
hostname=192.168.99.117
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.99.118
port=3306
echo '' > /etc/masterha/app1.cnf
vim /etc/masterha/app1.cnf[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha
password=Mha@1234
ping_interval=1
remote_workdir=/tmp
repl_password=Admin@123
repl_user=root
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.99.117 -s 192.168.99.118
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.99.116
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.99.117
port=3306
[server3]
hostname=192.168.99.118
port=3306

4、在master上手動開啟vip

首次需要在master服務器手動開啟vip,添加完成后ifconfig查看會多一個ens33:1網卡

ifconfig ens33:1 192.168.99.200/24

5、測試 ssh 無密碼認證

在 manager 節點上測試 ssh 無密碼認證,如果正常最后會輸出 successfully

masterha_check_ssh -conf=/etc/masterha/app1.cnf

在這里插入圖片描述

6、測試 mysql 主從連接情況

在 manager 節點上測試 mysql 主從連接情況,最后出現 MySQL Replication Health is OK 字樣說明正常。

masterha_check_repl -conf=/etc/masterha/app1.cnf

在這里插入圖片描述

7、啟動 MHA

#啟動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

8、查看集群狀態

#查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點
masterha_check_status --conf=/etc/masterha/app1.cnf#查看 MHA 日志,也可以看到當前的 master 是 192.168.99.116 
cat /var/log/masterha/app1/manager.log | grep "current master"#查看 master 的 VIP 地址 192.168.99.200  是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失
ifconfig

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

#若要關閉 manager 服務,可以使用如下命令。
masterha_stop --conf=/etc/masterha/app1.cnf
#或者可以直接采用 kill 進程 ID 的方式關閉

3.6故障模擬

1、監控MHA日志

在 manager 節點上監控觀察日志記錄

tail -f /var/log/masterha/app1/manager.log

在這里插入圖片描述

2、master 停止mysql服務

master 節點停止mysql服務

systemctl stop mysqld

正常自動切換一次后,MHA 進程會退出。MHA 會自動修改 app1.cnf 文件內容,將宕機的 master 節點刪除

故障切換備選主庫的算法:

1.一般判斷從庫的是從(position/GTID)判斷優劣,數據有差異,最接近于master的slave,成為備選主。

2.數據一致的情況下,按照配置文件順序,選擇備選主庫。

3.設定有權重(candidate_master=1),按照權重強制指定備選主。

(1)默認情況下如果一個slave落后master 100M的relay logs的話,即使有權重,也會失效。

(2)如果check_repl_delay=0的話,即使落后很多日志,也強制選擇其為備選主

查看slave1 是否接管 VIP
在這里插入圖片描述

查看manager節點動態日志

----- Failover Report -----app1: MySQL Master failover 192.168.99.116(192.168.99.116:3306) to 192.168.99.117(192.168.99.117:3306) succeededMaster 192.168.99.116(192.168.99.116:3306) is down!Check MHA Manager logs at mha:/var/log/masterha/app1/manager.log for details.Started automated(non-interactive) failover.
Invalidated master IP address on 192.168.99.116(192.168.99.116:3306)
The latest slave 192.168.99.117(192.168.99.117:3306) has all relay logs for recovery.
Selected 192.168.99.117(192.168.99.117:3306) as a new master.
192.168.99.117(192.168.99.117:3306): OK: Applying all logs succeeded.
192.168.99.117(192.168.99.117:3306): OK: Activated master IP address.
192.168.99.118(192.168.99.118:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.99.118(192.168.99.118:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.99.117(192.168.99.117:3306)
192.168.99.117(192.168.99.117:3306): Resetting slave info succeeded.
Master failover to 192.168.99.117(192.168.99.117:3306) completed successfully.

3.7故障修復

1、修復原master

systemctl restart mysqld

3.7.2修復主從

1、在現主庫服務器 slave1 查看二進制文件和同步點

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     18216 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在這里插入圖片描述

2、在原主庫服務器 master 執行同步操作(從地址)

stop slave;
change master to
master_host='192.168.99.117',
master_user='root',
master_password='Admin@123',
master_log_file='mysql-bin.000001',
master_log_pos=18216;start slave;
show slave status\G;

在這里插入圖片描述

3、在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)

sever1會被刪除
在這里插入圖片描述

vim /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.99.116 -s 192.168.99.118
......
[server1]
hostname=192.168.99.117
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.99.116
port=3306
[server3]
hostname=192.168.99.118
port=3306

4、在 manager 節點上啟動 MHA

# 停止
masterha_stop --conf=/etc/masterha/app1.cnf
# 啟動
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 &
# 查看狀態
masterha_check_status --conf=/etc/masterha/app1.cnf

在這里插入圖片描述

tip:

#解決中英字不兼容報錯的問題
dos2unix /usr/local/bin/master_ip_failover 

四、總結

MHA的作用:解決mysql的高可用和故障切換;mha的核心部分由manager和node倆部分組成:manager:主要功能:做MHA啟動、關閉、管理和檢測mysql各種健康狀態、node:在發生故障時,盡可能的保存二進制日志,并且實現故障切換(vip地址飄移)。

故障切換MHA會做哪些工作:

Mha會多次嘗試檢測master存活狀態

Mha會多次嘗試、盡可能的保存master的二進制文件

Mha會根據app1.cnf中的配置部分,進行從服務器—>主服務器的位置

Mha最后會將master的vip地址作為切換到從服務器的位置

Mha在選擇完新的master之后,會在其余的slave上執行change master操作,指向新的master,來保證mysql的集群的健康

Mha故障問題:

①軟連接必須都有

②免交互登錄

③5個賬號授權(其中三個賬號是測試環境需要做的)

④初次運行mha功能時需要臨時添加虛擬ip

⑤配置文件需要校驗(master_ip_failover 1個故障切換腳本,app1.cnf mha的主配置文件)

⑥先安裝node節點,在安裝主節點

五、問題匯總

1、由于強行卸載mariadb導致libmysqlclient缺失

故障

2:postfix-2.10.1-6.el7.x86_64 有缺少的需求 libmysqlclient.so.18()(64bit)

解決

安裝(mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm)

2、perl軟件包無法安裝

故障

perl-Log-Dispatch和perl-Parallel-ForkManager軟件包找不到

解決

rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
epl-release版本問題,更新epl-release版本后安裝該perl軟件包即可

tips

#mysql源碼包下載
wget http://dev.mysql.com/get/mysql-5.7.20.tar.gz

六、MHA的替代方案

然而,隨著技術的發展,市場上出現了多種可以替代MHA的高可用解決方案,這些方案在功能、易用性或成本等方面可能提供不同的優勢。以下是一些MHA的替代方案:

  1. Percona XtraDB Cluster (PXC)
    Percona XtraDB Cluster是基于Galera Cluster的MySQL高可用方案,它支持多主復制,允許集群內的多個節點同時接受寫操作,數據在節點間自動同步,確保數據的一致性。PXC在故障時能夠自動切換,且提供了豐富的監控和管理工具。

  2. MariaDB Galera Cluster
    MariaDB Galera Cluster是MariaDB數據庫的原生多主復制解決方案,類似于Percona XtraDB Cluster,它基于Galera技術,提供了高可用性和數據一致性。它適合需要強一致性和高并發寫操作的應用場景。

  3. Vitess
    Vitess最初由YouTube開發,后來開源,現在由Google維護。Vitess是一個用于水平分區和復制的數據庫中間件,支持MySQL和MariaDB。它不僅提供高可用性,還支持數據庫的水平擴展,適用于需要大規模數據分片和跨數據中心部署的場景。

  4. ProxySQL
    ProxySQL是一個高性能的數據庫代理,可以實現讀寫分離、負載均衡和故障切換等功能。它可以根據查詢類型智能地將請求路由到不同的MySQL實例,提高數據庫系統的整體可用性和響應速度。

  5. Tungsten Replicator
    Tungsten Replicator是Continuent公司的產品,提供了一種靈活的復制框架,支持MySQL和其他數據庫的復制。它提供了強大的數據轉換和過濾功能,以及高可用性和災難恢復解決方案。

  6. Orchestrator
    Orchestrator是MySQL復制管理工具,雖然本身不提供故障切換功能,但它提供了可視化的復制拓撲管理,使管理員能夠更容易地理解和控制復制關系。配合其他工具或手動操作,可以實現高可用性。

  7. MySQL InnoDB Cluster
    MySQL InnoDB Cluster是Oracle提供的官方高可用解決方案,它結合了InnoDB的數據存儲引擎和Group Replication技術,支持多主復制,自動故障檢測和恢復,以及動態添加和刪除成員節點的能力。

每種方案都有其特點和適用場景,選擇時應根據自己的業務需求、數據量大小、預期的讀寫比例、運維團隊的技術棧等因素綜合考慮。在實施高可用方案之前,建議進行充分的測試和評估,以確保方案能夠滿足預期的目標。


在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21353.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21353.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21353.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日一題31:數據統計之即時配送食物

一、每日一題 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | order_date …

HTML5常用標簽表格

04-08、表格標簽table 概述 表格&#xff1a;是一種行和列組合而成的單元格。一般應用于后臺網頁設計管理數據使用。 表格的架構部分&#xff1a; tabletable head 表格頭 theadtable body - 表格體 tbodytable foot -表格的頁腳 tfoot 表格的基本組成部分&#xff1a; t…

Bluetooth Profiles,藍牙配置文件對應設備

下面的常量是藍牙各種配置文件的標識符。 每個常量代表一個特定的藍牙配置文件&#xff0c;這些配置文件定義了藍牙設備之間通信的特定方式。以下是每個常量的解釋&#xff1a; HEADSET (1): 代表耳機和免提配置文件&#xff0c;通常用于藍牙耳機或車載免提系統。A2DP (2): 代…

opencv-python(三)

馬賽克 face img[162:428,297:527] # 人臉坐標區域face face[::10,::10] # 每10個中取出一個像素&#xff0c;馬賽克face np.repeat(face, 10, axis0) # 行方向重復10次face np.repeat(face, 10, axis1) # 列方向重復10次img[162:428,297:527] face[:266,:230] # 填充&a…

計算機科學與技術和軟件工程專業有什么區別?應該怎么選?

計算機科學與技術和軟件工程都是就業前景較好的計算機類專業&#xff0c;二者密切相關但側重點不同&#xff0c;同學們應該如何選擇呢&#xff1f; 一、學習內容 1.學科定位 ● 計算機科學與技術 側重于計算機科學的理論研究和基礎技術&#xff0c;包括算法、數據結構、人工…

lnmp平臺部署web應用,安裝Discuz社區平臺詳細文章——更新中

Nginx網站service 詳細相關介紹-特點-http狀態碼-配置文件、將nginx添加永久環境變量 訪問網站404是什么&#xff1f;_nginx 穩定版-CSDN博客文章瀏覽閱讀1.2k次&#xff0c;點贊33次&#xff0c;收藏24次。開源Web服務器軟件。_nginx 穩定版https://blog.csdn.net/2301_771619…

數據結構--數組(詳細分析)

目錄 &#x1f349;引言 &#x1f349;數組 &#x1f348;數組的特性 &#x1f348;數組的優缺點 &#x1f34d;優點&#xff1a; &#x1f34d;缺點&#xff1a; &#x1f348;數組的聲明與初始化 &#x1f348;數組的常見操作 &#x1f34d; 插入操作 &#x1f34d;…

Touch Camera PRO 2024 Easy Mobile Desktop Camera Controller(觸控相機專業版)

一個真正易于使用的移動+臺式攝像機控制器,具有視角切換功能! Touch Camera PRO 是一款非常易于使用的移動+桌面相機控制器,具有透視切換功能!它在 Home Designer、Runtime Level Editor 和 Floor Map Designer 等其他插件中使用! 在桌面和移動設備上工作! 一個干…

WIireShark使用教程

文章目錄 目錄 文章目錄 一.入門抓包示例 一.入門抓包示例 先介紹一下如何使用wireshark抓取相應網卡的流量&#xff0c;讓讀者可以先上手操作感受一下抓包的具體過程。 1.打開wireshark的主界面如下 2.選擇需要抓包的網卡&#xff0c;鼠標左鍵雙擊&#xff0c;即可抓取該網…

Mysql常見問題總結

1、MySQL初始化報錯 mysqld --initialize --usermysql --console 2024-06-02T15:52:22.645557Z 0 [System] [MY-013169] [Server] D:\installSoft\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 8980 2024-06-02T15:52:2…

02-2.3.2_1 單鏈表的插入和刪除

喜歡《數據結構》部分筆記的小伙伴可以訂閱專欄&#xff0c;今后還會不斷更新。 此外&#xff0c;《程序員必備技能》專欄和《程序員必備工具》專欄&#xff08;該專欄暫未開設&#xff09;日后會逐步更新&#xff0c; 插入 按位序插入 &#xff08;1&#xff09;帶頭結點 L…

量子加速超級計算簡介

本文轉載自&#xff1a;量子加速超級計算簡介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目錄 一、概述二、量子計算機的構建塊&#xff1a;QPU 和量子位三、量子計算硬件和算法四、…

代碼隨想錄算法訓練營第三十七 | ● 738.單調遞增的數字 ● 968.監控二叉樹

738.單調遞增的數字 講解鏈接&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html class Solution { public:int monotoneIncreasingDigits(int n) {//整數轉字符串&#xff0c;變為字符串訪問比諸位取出數字要…

項目集成過程中的makefile記錄

項目集成過程中的makefile記錄 文章目錄 項目集成過程中的makefile記錄1.基礎概念注釋打印賦值方式常用變量$ 偽目標函數wildcard 多目錄、文件操作 2.思路梳理**需求分析**目錄結構 3.可行示例 持續更新中1.基礎概念 注釋 # 示例&#xff1a; # 項目名稱打印 echo "H…

控制臺相關

輸入輸出 輸出 Console.WriteLine("123123");//光標空行 Console.Write("123123123123");//不空行輸入 string str Console.ReadLine(); //如果在ReadKey(true)不會把輸入的內容顯示在控制臺上 char c Console.ReadKey(true).KeyChar; Console.WriteL…

ACM實訓第25天

第四套 第一道&#xff08;修改&#xff09; #include<stdio.h> #include<string.h> int cnt[10]; void count_digits(int n,int* cnt){for(int i1;i<n;i){int numi;while(num){cnt[num%10];num/10;}} } int main(){int t;scanf("%d\n",&t);whi…

力扣刷題--2553. 分割數組中數字的數位【簡單】

題目描述 給你一個正整數數組 nums &#xff0c;請你返回一個數組 answer &#xff0c;你需要將 nums 中每個整數進行數位分割后&#xff0c;按照 nums 中出現的 相同順序 放入答案數組中。 對一個整數進行數位分割&#xff0c;指的是將整數各個數位按原本出現的順序排列成數…

名為投資實為借貸,如何處理

投資近百萬參與號稱“高回報、零風險”的內部商鋪投資項目&#xff0c;與公司簽訂商鋪投資合同及租賃合同。本想投資商鋪收取租金&#xff0c;沒想到不僅租金沒拿到手&#xff0c;連本金都要不回來。 2019年底&#xff0c;原告何某&#xff08;乙方&#xff09;與被告祁東縣某…

QSettings注冊表 json雙模式配置文件

qt QSettings 類可用來保存軟件設置&#xff0c;json文件也是保存軟件設置的很好的方式&#xff0e; 這里結合json文件和QSettings注冊表來保存軟件設置&#xff0e;區別在于json文件在軟件目錄&#xff0c;每次更新時會被覆蓋&#xff0c;注冊表中設置持久有效&#xff0c;…

14.FreeRTOS 消息緩存 Message Buffer

FreeRTOS 消息緩存&#xff08;Message Buffer&#xff09;的使用 介紹 在實時操作系統&#xff08;RTOS&#xff09;中&#xff0c;任務之間的通信是一個非常重要的方面。FreeRTOS 提供了多種機制來實現任務間通信&#xff0c;其中之一就是消息緩存&#xff08;Message Buffe…