当前位置:网站首页>MySQL之MHA高可用集群
MySQL之MHA高可用集群
2022-07-05 08:12:00 【JackieZhengChina】
目錄
一、MHA概述
1.1.MHA 是什麼
1.MHA(MasterHigh Availability)是一套優秀的MySQL高可用環境下故障切換和主從複制的軟件。
2.MHA 的出現就是解决MySQL 單點的問題。
3.MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換操作。
4.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 的特點
1.自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證數據不丟失。
2.使用半同步複制,可以大大降低數據丟失的風險,如果只有一個slave已經收到了最新的二進制日志,MHA可以將最新的二進制日志應用於其他所有的slave服務器上,因此可以保證所有節點的數據一致性。
3.目前MHA支持一主多從架構,最少三臺服務,即一主兩從。
二、MHA搭建准備
2.1.實驗思路
- MHA架構①數據庫安裝 ②一主兩從 ③MHA搭建
- 故障模擬①主庫失效 ②備選主庫成為主庫 ③原故障主庫恢複重新加入到MHA成為從庫
三、MHA搭建
3.1配置主從複制
1.關閉防火牆、增强功能
###在四臺服務器上都操作
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.修改 Master、Slave1、Slave2 節點的主機名
###在Master上
hostnamectl set-hostname Mysql1
su
###在Slave1
hostnamectl set-hostname Mysql2
su
###在Slave2
hostnamectl set-hostname Mysql3
su
3.在Master、Slave1、Slave2添加域名解析
192.168.40.10 Mysql1
192.168.40.100 Mysql2
192.168.40.30 Mysql3
4.配置主從同步
###修改 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
5.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*
6.登錄數據庫主從配置授權
#################Master、Slave1、Slave2 節點上都授權###################
grant replication slave on *.* to 'myslave'@'192.168.40.%' identified by '123456';
###授權主從用戶
grant all privileges on *.* to 'mha'@'192.168.40.%' identified by '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';
#刷新庫
flush privileges;
注意:主服務器和兩臺從服務器都要授權
7.Master節點查看二進制文件和同步點 、在 Slave1、Slave2 節點執行同步操作
#################在master上##################
show master status;
##############在slave1、slave2節點執行同步操作############
change master to master_host='192.168.400.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1745;
start slave;
show slave status\G;
8.設置兩個從節點 只讀模式
###在兩臺從服務器上設置
set global read_only=1;
9.驗證主從複制
###在主master上創建庫、錶並插入數據
create database test1;
use test1;
insert into info values('小明');
select * from test1.info;
###在slave1、slave2上驗證
select * from test1.info;
3.2.安裝 MHA 軟件
1.所有服務器上都安裝MHA依賴的環境,首先安裝epel源
###在master、slave1、slave2、mha服務器上都安裝
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 組件
##將需要的包下載到/opt下##
##每臺服務器上解壓安裝node組件##
cd /opt
tar zxf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
注意:四臺服務器上都要安裝node組件
3.在MHA-manager節點上安裝 manager 組件
###把需要的包放到opt下
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57/
perl Makefile.PL
make && make install
cd /usr/local/bin/
#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 線程)
4.在所有服務器上配置無密碼認證
###在manager節點上配置到所有數據庫節點的無密碼認證
ssh-keygen -t rsa #一路按回車鍵
ssh-copy-id 192.168.40.10
ssh-copy-id 192.168.40.100
ssh-copy-id 192.168.40.30
####數據庫服務器之間互相導入即可####
###在master上
ssh-keygen -t rsa #一路按回車鍵
ssh-copy-id 192.168.40.100
ssh-copy-id 192.168.40.30
###在slave1上
ssh-keygen -t rsa #一路按回車鍵
ssh-copy-id 192.168.40.10
ssh-copy-id 192.168.40.30
###在slave2上
ssh-keygen -t rsa #一路按回車鍵
ssh-copy-id 192.168.40.10
ssh-copy-id 192.168.40.100
###免密登錄測試###
###在manager節點上
ssh 192.168.40.10
ssh 192.168.40.100
ssh 192.168.40.30
###在master節點上
ssh 192.168.40.100
ssh 192.168.40.30
###在slave1節點上
ssh 192.168.40.10
ssh 192.168.40.30
###在slave2節點上
ssh 192.168.40.10
ssh 192.168.40.100
5.在manager節點上操作
(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/* /usr/local/bin
(3)###修改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.40.188'; #指定vip的地址
my $brdc = '192.168.40.255'; #指定vip的廣播地址
my $ifdev = 'ens33'; #指定vip綁定的網卡
my $key = '1'; #指定vip綁定的虛擬網卡序列號
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代錶此變量值為ifconfig ens33:1 192.168.40.188
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #代錶此變量值為ifconfig ens33:1 192.168.40.188 down
my $exit_code = 0; #指定退出狀態碼為0
#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 ([email protected]) {
warn "Got Error: [email protected]\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 ([email protected]) {
warn [email protected];
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";
}
#删除注釋
:2,87 s/^#//
(4)###創建 MHA 軟件目錄並拷貝配置文件,這裏使用app1.cnf配置文件來管理 mysql 節點服務器
#創建 MHA 軟件目錄並拷貝配置文件
cd /opt/mha4mysql-manager-0.57/samples/conf/
ls
mkdir /etc/masterha
cp app1.cnf /etc/masterha/
#修改app1.cnf配置文件,删除原文所有內容,添加下面的
vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
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=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.250.60 -s 192.168.250.70
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.40.10
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.40.100
port=3306
[server3]
hostname=192.168.40.30
port=3306
(5)###在主節點開啟虛擬IP
ifconfig ens33:1 192.168.40.188/24
(6)###在 manager 節點上測試 ssh 無密碼認證,如果正常最後會輸出 successfully。如下所示
masterha_check_ssh -conf=/etc/masterha/app1.cnf
(7)###在 manager 節點上測試 mysql 主從連接情况,最後出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
masterha_check_repl -conf=/etc/masterha/app1.cnf
(8)###在 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 &
(9)###查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
masterha_check_status --conf=/etc/masterha/app1.cnf
(10)###查看 MHA 日志,也以看到當前的 master 是 192.168.250.118,如下所示。
cat /var/log/masterha/app1/manager.log | grep "current master"
(11)###查看 Mysql1 的 VIP 地址 192.168.250.118 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
ifconfig
//若要關閉 manager 服務,可以使用如下命令。
masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 進程 ID 的方式關閉。
配置文件解釋如下:
[server default]
manager_log=/var/log/masterha/app1/manager.log #manager日志
manager_workdir=/var/log/masterha/app1 #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=123456 #設置複制用戶的密碼
repl_user=myslave #設置複制用戶的用戶
report_script=/usr/local/send_report #設置發生切換後發送的報警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.40.100 -s 192.168.40.30 #指定檢查的從服務器IP地址
shutdown_script="" #設置故障發生後關閉故障主機脚本(該脚本的主要作用是關閉主機防止發生腦裂,這裏沒有使用)
ssh_user=root #設置ssh的登錄用戶名
user=mha #設置監控用戶root
[server1]
hostname=192.168.40.10
port=3306
[server2]
hostname=192.168.40.100
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.40.30
port=3306
(6)###在manager節點上測試 ssh 無密碼認證,如果正常最後會輸出 successfully。如下所示。
(7)###在manager節點上測試 mysql 主從連接情况,最後出現 MySQL Replication Health is OK 字樣說明正常。如下所示。
(8)###在 manager 節點上啟動 MHA
(9)###查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
(10)###查看 MHA 日志,也以看到當前的 master 是 192.168.40.10,如下所示。
(11)查看 Mysql1 的 VIP 地址 192.168.250.188 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。
3.3.故障模擬
###在 manager 節點上監控觀察日志記錄
tail -f /var/log/masterha/app1/manager.log
###在 Master 節點 Mysql1 上停止mysql服務
systemctl stop mysqld
或
pkill -9 mysql
###在slave1,slave2上查看,正常自動切換一次後,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的話,即使落後很多日志,也强制選擇其為備選主。
###在 Master 節點 Mysql1 上停止mysql服務
###在slave1,slave2上查看,查看 mysql2 是否接管 VIP
3.4.故障修複
1.#修複mysql1
systemctl restart mysqld
2.#修複主從
#在現主庫服務器 Mysql2 查看二進制文件和同步點
show master status;
#在原主庫服務器 mysql1 執行同步操作
change master to master_host='192.168.40.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=154;
start slave;
show slave status\G;
3.#在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
vi /etc/masterha/app1.cnf
....
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.40.100 -s 192.168.40.30
....
[server1]
hostname=192.168.40.10
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.40.100
port=3306
[server3]
hostname=192.168.40.30
port=3306
4.#在 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 &
在 manager 節點上修改配置文件app1.cnf(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
4.在 manager 節點上啟動 MHA
四、總結
1.MHA
①作用:MySQL的高可用,故障切換。
②核心部分:(1)MHA組件:manager:主要的功能:做MHA啟動,關閉管理和檢測MySQL的各種健康狀態。 niode:在發生故障時,盡可能的保存二進制日志,並且實現故障切換(VIP地址飄逸)
③MHA需要的配置的文件(2個):
master_ip_failover:命令工具,定義的是基於VIP的檢測和故障轉移(VIP從master ----》新的 master)
appl.conf:MHA的主要配置文件,主要定義了mha的工作目錄、日志mysql二進制日志比特置,使用MHA的登錄MySQL的用戶、密碼使用從服務器。身份同步master的賬號、密碼(五個)。
④故障切換MHA會做哪些動作:
(1)MHA會多次嘗試檢測master的存活狀態。
(2)MHA會多次嘗試,盡可能的保存master的二進制文件
(3)MHA會根據app1.cnf中的配置部分,進行從服務器------》主服務器的比特置
(4)MHA最後會將master的VIP地址切換到從服務器的比特置
(5)MHA再選擇完新的master後,會在其餘的slave上執行change master操作,指向新的master,來保證MySQL集群的健康性。
2.MHA的故障問題
①要做軟鏈接。
②免交互(免密登錄)
③五個賬號授權(其中三個賬號是測試環境需要做的)
④初次運行MHA功能時,需要臨時添加虛擬ip
⑤配置文件 --- 校驗 (master_ip_failover 1個故障切換脚本,appl.cnf.mha的主配置文件)
⑥先安裝node節點,再安裝主節點。
---------------------
作者:H unter
來源:CSDN
原文:https://blog.csdn.net/m0_59579177/article/details/125531603
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件
边栏推荐
- UEFI development learning 5 - simple use of protocol
- Sql Server的存储过程详解
- How to define guid in AMI code
- Hardware and software solution of FPGA key chattering elimination
- DokuWiki deployment notes
- Introduction of air gap, etc
- H264 (I) i/p/b frame gop/idr/ and other parameters
- Management and use of DokuWiki
- Explain task scheduling based on Cortex-M3 in detail (Part 2)
- Why is 1900 not a leap year
猜你喜欢
Summary -st2.0 Hall angle estimation
Hardware and software solution of FPGA key chattering elimination
PMSM dead time compensation
导电滑环磨损快的原因
Drive LED -- GPIO control
The research found that the cross-border e-commerce customer service system has these five functions!
[paper reading] the latest transfer ability in deep learning: a survey in 2022
Carrier period, electrical speed, carrier period variation
Shape template matching based on Halcon learning [VII] reuse_ model. Hdev routine
How to select conductive slip ring
随机推荐
Class of color image processing based on Halcon learning_ ndim_ norm. hdev
Communication standard -- communication protocol
Semiconductor devices (III) FET
VESC Benjamin test motor parameters
UEFI development learning series
After installing the new version of keil5 or upgrading the JLINK firmware, you will always be prompted about the firmware update
Stablq of linked list
String judgment
More than 90% of hardware engineers will encounter problems when MOS tubes are burned out!
C WinForm [realize the previous and next selection pictures] - practice 7
Shape template matching based on Halcon learning [VII] reuse_ model. Hdev routine
Talk about the function of magnetic beads in circuits
My-basic application 1: introduction to my-basic parser
Can't find real-time chat software? Recommend to you what e-commerce enterprises are using!
Define in and define out
Bluetooth hc-05 pairing process and precautions
Why is 1900 not a leap year
Reasons for rapid wear of conductive slip rings
Live555 push RTSP audio and video stream summary (III) flower screen problem caused by pushing H264 real-time stream
Bootloader implementation of PIC MCU