0


深入浅出MHA(MySQL Master High Availability)集群:原理、部署与实践

引言

在当今高度依赖数据库的应用场景中,MySQL数据库的高可用性显得尤为重要。MHA(MySQL Master High Availability Manager)作为一种开源的MySQL高可用解决方案,以其自动化故障转移和恢复能力广受业界认可。本文将深入探讨MHA集群的原理、部署步骤及实践要点。

一、MHA集群介绍

(一)什么是MHA

MHA(Master High Availability)是一款专为MySQL设计的开源高可用解决方案,主要用于实现MySQL数据库的故障转移和主从复制管理,从而提高数据库服务的可靠性与可用性。MHA由日本人Yoshinori Matsunobu(后来加入Facebook)开发,特别适用于那些需要在主数据库发生故障时迅速切换到备用节点,同时保持数据一致性的场景。

(二)MHA集群原理

MHA由两部分构成:MHA Manager(管理节点)和MHA Node(数据节点)。在主从复制的MySQL集群中,MHA Manager负责监控主节点的健康状况,当主节点出现故障时,MHA Manager会自动选举出一个从节点升级为主节点,并协调其余从节点重新连接至新的主节点,实现无缝的故障转移。

监控与故障检测:MHA Manager通过心跳检测机制实时监控主节点状态,一旦检测到主节点失效,立即触发故障转移流程。

自动故障转移:基于预定义的故障转移策略,如优先级、数据延迟等指标,MHA会选择一个符合条件的从节点晋升为主节点。

数据一致性保证:MHA支持半同步复制和全局事务ID(GTID)复制,以确保故障转移前后数据的一致性。

(三)同步方式

同步复制:主库在接收到写请求后,会等待所有的从服务器同步完毕之后,才会返回给客户端

异步复制:MySQL主从复制默认采用异步复制方式,主库在接收到写请求后立即返回,无需等待从库确认,这种方式响应速度快,但可能存在一定的数据延迟

半同步复制:至少有一个从库接收到并执行完写操作后,主库才返回成功,提高了数据一致性。

(四)管理节点与数据节点

MHA Manager(管理节点)

MHA Manager是一个中心化的管理组件,通常部署在独立的服务器上,不直接处理数据库的读写请求。

它的主要职责是监控整个MySQL主从集群的健康状态,包括检测主节点是否在线、从节点的复制延迟等。

当主节点出现故障时,MHA Manager会自动执行故障转移流程,选择一个从节点升级为主节点,同时通知其他从节点改变复制源至新的主节点,并确保数据一致性。

MHA Manager还负责处理各种高级特性,比如半同步复制的管理、全局事务标识符(GTID)的支持、以及故障转移过程中的SQL线程暂停和恢复等。

MHA Node(数据节点)

MHA Node指的是参与MySQL主从复制集群中的所有数据库服务器,包括原来的主节点和从节点。

每个MHA Node都运行着MHA的Node Agent,用于与MHA Manager通信,报告自身状态和接收管理指令。

主节点主要负责处理写入请求和生成二进制日志,而从节点则通过复制主节点的二进制日志来保持数据同步,并在必要时准备晋升为主节点。

二、实现MHA

实现MHA高可用,首先是在实现主从复制的基础之上

环境准备
IP地址类型安装软件****安装目录192.168.83.20MySQL主服务器mysql5.7、MHA node 组件/usr/local/mysql192.168.83.40MySQL从服务器1mysql5.7、MHA node 组件/usr/local/mysql192.168.83.60MySQL从服务器2mysql5.7、MHA node 组件/usr/local/mysql192.168.83.100MHA节点服务器MHA node 和 manager 组件/usr/bin192.168.83.200VIP地址

(一)搭建主从复制环境

1.搭建时间同步

在构建MySQL主从复制架构时,确保主从服务器之间的系统时间同步是非常重要的。这是因为MySQL在处理事务和记录二进制日志时依赖于系统时间戳,时间不一致可能会导致主从复制出现问题,如数据不一致或复制中断

##主服务器设置##
yum install ntp -y
#下载ntp服务
 
vim /etc/ntp.conf
--末尾添加--
server 127.127.10.0                            #设置本地是时钟源,注意修改网段
fudge 127.127.10.0 stratum 8                #设置时间层级为8(限制在15内)
 
systemctl start ntpd
#启动服务
 
 
##从服务器设置##
yum install ntp ntpdate -y
 
systemctl start ntpd
#启动服务
 
/usr/sbin/ntpdate 192.168.83.20
#进行时间同步,192.168.83.20为master服务器ip地址
 
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.83.20

2.配置master服务器

2.1 修改配置文件

在/etc/my.cnf文件中添加下图字段,开启二进制日志


server-id = 1
#这个参数是为MySQL服务器分配的一个唯一标识号。在主从复制环境中,无论是主服务器还
#是从服务器,都必须设置一个唯一的server-id。
 
log-bin=master-bin
#log-bin用于开启二进制日志,这是实现MySQL主从复制的关键特性。这里的master-bin是指定
#二进制日志的前缀名称,二进制日志文件将以master-bin.000001,master-bin.000002等格式生成。
 
binlog_format = MIXED
#binlog_format 参数用于设置二进制日志记录格式。可能的值包括 STATEMENT、ROW 和 MIXED。
#MIXED 是一种混合模式,根据实际情况自动在STATEMENT和ROW模式之间切换。
 
log-slave-updates=true
#当设置 log-slave-updates参数为true时,从服务器在执行主服务器传过来的更新时,也会把这些
#更新记录到自己的二进制日志中。这样一来,如果从服务器又被其他从服务器复制,那么这个从服务
#器也可以成为新的主服务器,形成级联复制链。

修改完毕之后重新启动服务:systemctl restart mysqld

grant #SQL命令,用于授予用户特定的权限。
 
replication slave #指定要授予的权限类型,这里是与主从复制相关的权限
 
on *.* #指定了授权范围,*分别代表所有数据库和所有表即此用户在任何数据库的所有表上都有复制权限。
 
'myslave'@'192.168.83.%'
#定义了用户名及其允许连接的IP地址范围。这里创建了一个名为 'myslave' 的用户,并且允许来自
#192.168.83.0/24网段内的任何IP地址连接。百分号 % 表示任意主机名或IP地址。
 
IDENTIFIED BY '123456' 
#设置用户的密码为'123456',当从服务器尝试连接主服务器进行同步时,需要使用该密码进行身份验证。

使用:show master status; 指令查询主服务器二进制日志状态的命令

File:当前二进制日志(Binary Log)文件的名称

Position:在当前二进制日志文件中的下一个事件(event)的位置。这个位置值对于从服务器而言至关重要,因为它需要从这个位置开始读取和执行主服务器上的事件,从而保持数据同步。

3.配置slave服务器

配置从服务器接收

在/etc/my.cnf文件中添加以下字段

server-id = 2
#该从服务器唯一标识符2
 
log_bin = master-bin
#开启二进制日志文件,作为从服务器,同时为备用主服务器,当主服务器宕机时,本服务器替代为
#主服务器,生成二进制日志文件,供其它从服务器同步

relay-log=relay-log-bin
#relay-log用于设置中继日志(Relay Log)的文件名前缀。
#接收到主服务器的二进制日志事件后,这些事件会先写入到中继日志中,然后再从中继日志中读取并执行
#这里设置为relay-log-bin,那么生成的中继日志文件会是类似于relay-log-bin.000001这样的格式。
 
relay-log-index=slave-relay-bin.index
#relay-log-index用于设置中继日志索引文件的名称。中继日志索引文件记录了每个中继日志文件及其
#对应的第一条和最后一条事件的位置信息,便于从服务器快速定位到需要执行的事件。
 
relay_log_recovery = 1
#relay_log_recovery用于决定在从服务器启动时是否自动从最后一个完整的事务处恢复中继日志的执行。
#当设置为1时,从服务器在启动时如果检测到中继日志中有未完成的事务,它会尝试从最后一个完成的事务
#开始继续执行,以保证数据的一致性和完整性。

修改完毕之后重新启动服务:systemctl restart mysqld

另一台从服务器同样操作

slave2配置

注意server-id的值不能与其它MySQL服务器相同,且本服务器不需要开启二进制日志

[root@slave2 ~]#vim  /etc/my.cnf
[root@slave2 ~]#sed -n '18,21p' /etc/my.cnf
server-id = 3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery = 1
[root@slave2 ~]#systemctl restart mysqld

4.主从共同操作

在主服务器与从服务器上进行的操作

4.1 创建软链接

将/usr/local/mysql/bin/下的mysql命令与mysqlbinlog命令创建软链接到/usr/sbin目录下,

4.2 用户授权

登录MySQL主服务器,给用户授权

5.从服务操作

5.1 连接主服务器

两台从服务器连接主服务器

通过执行SQL语句,连接到主服务器

master_host='192.168.83.20'
#指定主服务器的IP地址或主机名,这里设置为主服务器的IP地址192.168.83.20。
 
master_user='myslave'
#设置主服务器上用于复制的用户账号名称,这里使用的是名为'myslave'的账户。
 
master_password='123456'
#提供主服务器上的复制用户对应的密码,此处仅为示例,实际环境中请使用安全强度更高的密码。
 
master_log_file='master-bin.000001'
#指定主服务器上从哪里开始复制二进制日志,这里的值'master-bin.000001'是主服务器的一个具
#体的二进制日志文件名。
 
master_log_pos=603
#与master_log_file配合使用,指定从主服务器二进制日志文件的哪个位置开始读取和执行事件,
#这里的值603代表从该文件的第603个字节位置开始。

查看状态时需要确认 IO 和 SQL 线程都是 Yes,代表同步正常

Slave_IO_Running: Yes #负责与主机的I/O通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程

测试同步情况

5.2 设置MHA用户权限

在主服务器上给mha用户授权,使mha节点服务器能够检测到主从服务器

因为现在已经做到主从同步,在主服务上授权,两台从服务器会同步授权

5.3 设置只读模式

将两台从服务器设置为只读模式:set global read_only=1;

(二)安装MHA所有组件

1.安装依赖环境

所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源,而后安装依赖环境

yum  install epel-release.noarch -y 
#下载epel源

yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel
-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

#下载MHA依赖环境

2.安装node软件包

先在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装manager组件,因为 manager依赖node组件

#主服务器
[root@master opt]#ls
mha4mysql-node-0.57.tar.gz  rh
[root@master opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@master opt]#ls
mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@master opt]#cd  mha4mysql-node-0.57/
[root@master mha4mysql-node-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@master mha4mysql-node-0.57]#make && make install

#从服务器1
[root@slave1 opt]#ls
mha4mysql-node-0.57.tar.gz  rh
[root@slave1 opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@slave1 opt]#ls
mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@slave1 opt]#cd  mha4mysql-node-0.57/
[root@slave1 mha4mysql-node-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@slave1 mha4mysql-node-0.57]#make -j 4 && make install

#从服务器2
[root@slave1 opt]#ls
mha4mysql-node-0.57.tar.gz  rh
[root@slave2 opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@slave2 opt]#ls
mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@slave2 opt]#cd  mha4mysql-node-0.57/
[root@slave2 mha4mysql-node-0.57]#ls
AUTHORS  bin  COPYING  debian  inc  lib  Makefile.PL  MANIFEST  META.yml  README  rpm  t
[root@slave2 mha4mysql-node-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@slave2 mha4mysql-node-0.57]#make -j 4 && make install

#MHA manager节点服务器
[root@mha opt]#ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57.tar.gz  rh
[root@mha opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@mha opt]#cd  mha4mysql-node-0.57/
[root@mha mha4mysql-node-0.57]#perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@mha mha4mysql-node-0.57]#make -j 4 &&make install

3.安装manager组件

在 MHA manage 节点服务器上安装 manager 组件,操作方法与安装node节点一样

[root@mha opt]#ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@mha opt]#tar xf  mha4mysql-manager-0.57.tar.gz 
[root@mha opt]#cd  mha4mysql-manager-0.57/
[root@mha mha4mysql-manager-0.57]#ls
AUTHORS  bin  COPYING  debian  inc  lib  Makefile.PL  MANIFEST  META.yml  README  rpm  samples  t  tests
[root@mha mha4mysql-manager-0.57]#perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.627)
- DBD::mysql            ...loaded. (4.023)
- Time::HiRes           ...loaded. (1.9725)
- Config::Tiny          ...loaded. (2.14)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst        ...loaded. (0.57)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager
[root@mha mha4mysql-manager-0.57]#make  -j 4 && 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下生成的脚本脚本文件:
save_binary_logs              #保存和复制 master 的二进制日志
apply_diff_relay_logs         #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog            #去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs              #清除中继日志(不会阻塞 SQL 线程)

#安装node组件生成的工具通常由MHAManager的脚本触发,无需人为操作

4.配置ssh免密登录

需要在所有的服务器上配置ssh免密登录,用于快速进行文件交互以及互相替换等操作

4.1 配置manager

在 manager 节点上配置到所有数据库节点的无密码认证

[root@mha ~]#ssh-copy-id 192.168.83.20
#向master服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.40
#向slave1服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.60
#向slave2服务器传输密钥,达到免密效果

远程连接测试是否成功

4.2 配置master服务器

master服务器上配置到salve1服务器、salve2服务器的无密码认证

[root@mha ~]#ssh-keygen -t rsa
#生成密钥文件
[root@mha ~]#ssh-copy-id 192.168.83.40
#向slave1服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.60
#向slave2服务器传输密钥,达到免密效果

4.3 配置salve1服务器

salve1服务器上配置到master服务器、salve2服务器的无密码认证

[root@mha ~]#ssh-keygen -t rsa
#生成密钥文件
[root@mha ~]#ssh-copy-id 192.168.83.20
#向master服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.60
#向slave2服务器传输密钥,达到免密效果

4.4 配置salve2服务器

salve2服务器上配置到master服务器、salve1服务器的无密码认证

[root@mha ~]#ssh-keygen -t rsa
#生成密钥文件
[root@mha ~]#ssh-copy-id 192.168.83.20
#向master服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.40
#向slave1服务器传输密钥,达到免密效果

5.在manager节点上配置MHA

5.1 复制脚本

在manager节点上复制相关脚本到/usr/local/bin 目录

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                 #因故障切换后发送报警的脚本

复制master_ip_failover脚本到/usr/local/bin 目录

修改该脚本文件

[root@mha local]#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.83.200';                                    #指定vip的地址
my $brdc = '192.168.83.255';                                #指定vip的广播地址
my $ifdev = 'ens33';                                        #指定vip绑定的网卡
my $key = '1';                                                #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";        #代表此变量值为ifconfig ens33:1 192.168.83.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";        #代表此变量值为ifconfig ens33:1 192.168.83.200 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 ($@) {
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";
}

6.创建MHA软件目录

将源码包中的配置文件app1.cnf复制到新建的MHA软件目录,这个文件包含了MHA集群中各个MySQL服务器的详细信息,包括主机名、端口、SSH连接信息等。并将文件中的内容替换为以下内容

[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=123            
#设置复制用户的密码
repl_user=myslave            
#设置复制用户的用户
report_script=/usr/local/send_report     
#设置发生切换后发送的报警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.83.40 -s 192.168.83.60
#指定检查的从服务器IP地址
shutdown_script=""            
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root                
#设置ssh的登录用户名
user=mha                    
#设置监控用户root

[server1]
hostname=192.168.83.20
port=3306
#指定master服务器的IP地址与端口号

[server2]
candidate_master=1  #表示此节点可作为候选主库。
check_repl_delay=0   
#设置在故障转移前检查复制延迟的最大限制(单位:秒),
#这里设置为0,表示不检查复制延迟,立即进行故障转移。
hostname=192.168.83.40
port=3306
#指定salve1服务器的IP地址与端口号

[server3]
hostname=192.168.83.60
port=3306
#指定salve2服务器的IP地址与端口号

7.设置虚拟VIP

在MHA节点服务器上设置虚拟VIP,客户端通过该地址访问数据库,当master服务器宕机后,会将该地址转移到备用主服务器上(slave1服务器),不会影响客户体验

8.进行环境测试

8.1 测试ssh免密认证

执行:masterha_check_ssh -conf=/etc/masterha/app1.cnf 命令

masterha_check_ssh 
#是MHA工具集中的一个命令,用于检查在MHA配置文件中定义的各个服务器之间的SSH连接是否
#正常,确保在故障转移时,MHA Manager能够通过SSH无密码登录到各个MySQL服务器进行管理和操作。

-conf=/etc/masterha/app1.cnf 
#参数指定了要使用的MHA配置文件路径

执行此命令时,MHA会读取该配置文件并尝试通过SSH连接到每个服务器,如果所有连接都能成功建立,会显示successfully 。则说明SSH连接配置正确,为后续的主从切换和故障转移操作做好了前提准备。如果出现连接失败的情况,MHA会输出相应的错误信息,帮助管理员排查问题。

8.2 测试主从复制情况

在测试之前,确保你的MySQL配置文件(/etc/my.cnf)的 [client] 字段没有default-character-set=utf8这个参数,因为这个参数在较早版本的MySQL或mysqlbinlog工具中,可能并不支持在命令行中直接设置字符集变量。

执行:masterha_check_repl -conf=/etc/masterha/app1.cnf 命令

masterha_check_repl:
#这是一个MHA提供的命令行工具,用于检查MySQL主从复制集群的健康状态

-conf=/etc/masterha/app1.cnf:
#指定了MHA的配置文件路径。

9.启动MHA

在manager节点上启动 MHA

nohup:
#Linux命令,用于让命令在后台运行,并忽略所有挂断信号即使用户退出登录,命令也继续执行。

masterha_manager
#是MHA工具集中用于管理MySQL主从复制集群的命令,它负责监控主从复制状态,处理故障转移等任务。

--conf=/etc/masterha/app1.cnf:
#指定MHA使用的配置文件

--remove_dead_master_conf
#这是一个MHA Manager的参数,表示在故障转移后自动移除原主库的相关配置,
#以便在未来的故障转移中不再考虑已失效的主库。

--ignore_last_failover
#告诉MHA Manager在启动时忽略上次的故障转移状态,即使上次的故障转移未完成或失败,
#也要尝试启动新的故障转移监控。

< /dev/null
#标准输入重定向到/dev/null,意味着命令运行时不接收任何键盘输入。

> /var/log/masterha/app1/manager.log
#标准输出重定向到指定的文件,即MHA Manager的输出信息将被记录到/var/log/masterha/app1/manager.log日志文件中。

2>&1
#错误输出(标准错误(stderr))重定向到标准输出(stdout)

&        #将整个命令放入后台执行。

10.查看信息

通过命令或者查看日志的方式,查看当前的master是谁

11.模拟故障

关闭master的mysql服务:systemctl stop mysqld

可以在/var/log/masterha/app1/manager.log日志中看到从服务器1成为master的信息

VIP地址也成功转移到slave1服务器上

12.故障恢复

12.1 修改原master服务器

修改配置文件//etc/my.cnf,开启中继日志

重启原master服务器,并将原master服务器设置为slave服务器

重新启动MySQL服务:systemctl start mysqld

12.2 修改manager节点配置文件

修改manager节点的/etc/masterha/app1.cnf 配置文件

重新启动manager节点

进行测试

总结

MHA集群是实现MySQL服务主从复制高可用的重要环节

MySQL作为生产环境中最常用,也是非常重要的服务,它的优化也非常重要。

本章主要了解主从复制的原理,MHA集群原理,以及同步的方式等等,尤其是在配置文件方面,需要配置的信息较多,所以出现的报错信息可能也会比较频繁。

架构

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
MHA Manager负责监控主从复制状态,处理故障转移、主从切换、配置更新等工作。
MHA Node部署在每个MySQL服务器上,用于收集并报告数据库状态信息,执行MHA Manager下发的命令。

故障检测与转移:

MHA Manager通过心跳检测判断主库是否宕机,并根据预设策略选取合适的从库晋升为主库。
使用半同步复制或全局事务标识符(GTID)确保数据一致性。
故障转移过程中,MHA Manager会执行一系列操作,如停止原主库的写入、更新从库复制源、执行主从切换脚本等。

配置文件:

MHA的配置文件(如app1.cnf)中包含了集群中所有MySQL服务器的详细信息,如主机名、端口、复制用户、密码、SSH连接信息等。

命令行工具:

masterha_check_repl:检查主从复制的健康状态和一致性。
masterha_manager:启动MHA Manager守护进程,负责集群的监控和管理。
masterha_check_ssh:检查MHA Manager与各个MySQL服务器之间的SSH连接。

日志与监控:

MHA Manager可以输出详细的日志信息,方便调试和故障排查。
可以通过配置文件指定日志文件路径,记录MHA的运行状态和错误信息。

安全性与权限:

MHA Manager在执行故障转移等操作时需要具备足够的MySQL权限,如SUPER权限。

标签: 数据库

本文转载自: https://blog.csdn.net/hy199707/article/details/137131942
版权归原作者 智能运维探索者 所有, 如有侵权,请联系我们删除。

“深入浅出MHA(MySQL Master High Availability)集群:原理、部署与实践”的评论:

还没有评论