Mysql数据库:MHA高可用架构

目录

前言

一、MHA概述

1、什么是MHA

2、MHA的特点

3、MHA的组成

4、MHA的工作原理

5、故障切换备选主库的算法

二、部署MHA高可用架构

1、环境部署

2、部署主从同步

2.1 修改主配置文件并创建软链接

2.1.1 master 修改主配置文件并创建软连接

2.1.2 slave1 修改主配置文件并创建软连接 

2.1.3 slave2 修改主配置文件并创建软连接

2.2 配置一主两从机制

2.2.1 所有mysql服务器进行授权

2.2.2  在master主服务器上查看状态

2.2.3 在两个从服务器上执行同步操作

2.2.4 配置读写分离操作

2.3 测试主从同步效果

3、部署 MHA 架构

3.1 安装 MHA 所有组件

3.1.1 所有设备都需安装 node 组件

3.1.2 在 MHA-manager 服务器上安装 manager 组件

3.1.3 manager 组件安装完后其工具详解

3.2 所有设备配置无密码认证

3.3 在manager服务器上配置MHA

3.3.1 复制相关脚本到/usr/local/bin 目录

3.3.2 复制VIP 管理的脚本到规定目录并修改

3.3.3 创建 MHA 软件目录并拷贝配置文件

3.3.4 修改app1.cnf配置文件

3.4 第一次配置需在 master 上手动开启虚拟IP

3.5 在 manager 上测试 ssh 免密登录

3.6 在 manager 上测试 mysql 主从连接情况

3.7 在 manager 服务器上启动 MHA

3.8 查看 MHA 状态 

4、模拟单点故障

5、单点故障修复

5.1 修复master

5.2 修复主从

5.3 在 manager 上修改配置文件app1.cnf

5.4 在manager上重启MHA

5.5 测试主从复制

三、总结

1、MHA的作用

2、 MHA的核心组成

3、 MHA需要配置的文件

4、故障切换MHA会做哪些动作

5、MHA故障问题


前言

在传统的mysql主从复制架构中,存在主服务器的单点故障的问题。由于所有的写操作(包括数据更新、删除和插入)都是在主服务器上进行的,如果主服务器出现故障,整个数据库系统将无法处理任何写请求,直到主服务器恢复或者手动或自动切换到一个新的主服务器为止。这种对单一主服务器的依赖使得它成为整个复制架构中的单点故障

所以MHA(MySQL High Availability)是一个专为MySQL数据库设计的高可用性解决方案。它通过自动化处理故障切换和主从复制管理,旨在最大限度地减少数据库的停机时间,并确保数据的一致性和可用性

一、MHA概述

1、什么是MHA

  • MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件
  • MHA 的出现就是解决MySQL 单点的问题
  • MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作
  • MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用

2、MHA的特点

  • 自动故障切换:在主服务器发生故障时,能够自动选择一个最合适的从服务器提升为新的主服务器
  • 快速恢复: MHA能够快速地实现主从切换,减少数据库不可用的时间,提高系统的可用性
  • 最小化数据丢失:MHA通过复制日志和其他机制来确保在故障切换过程中最小化数据丢失
  • 灵活的配置:支持多种配置选项,可以根据具体需求调整
  • SSH连接保障安全: MHA利用SSH连接来进行节点间的通信和操作,确保通信的安全性。
  • 监控与报警: MHA提供了监控和报警功能,能够实时监测数据库的状态并及时响应故障情况
  • 易于部署和管理:提供了命令行工具和简单的配置文件,使得部署和管理变得简单
  • 架构:目前MHA支持一主多从架构,最少三台服务,即一主两从

3、MHA的组成

  • MHA Node(数据节点)

安装了MHA管理器的所有Mysql服务器节点,运行MHA工具包,参与主从节点的监视与管理

  • MHA Manager(管理节点)

MHA Manager 可单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上
MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明

4、MHA的工作原理

详细过程:

  • 监控主节点状态: MHA通过定期检查主节点的健康状态来监控数据库集群。这包括检查主节点是否正常运行、主从复制是否同步等

  • 故障检测: 当MHA检测到主节点发生故障(例如主节点宕机或不可达),它会立即采取行动以确保数据库的高可用性

  • 自动主从切换: 一旦主节点故障被确认,MHA会自动执行主从切换操作。它会选择一个健康的从节点,将其提升为新的主节点,以继续提供数据库服务

  • 数据同步: 在主从切换后,MHA会确保新的主节点和其他从节点之间的数据同步。它会协调数据复制过程,以确保所有节点都有最新的数据副本

  • 恢复主节点: 一旦原主节点恢复正常,MHA会协助将其重新加入数据库集群,并根据需要重新配置节点角色,以恢复正常的主从架构

  • 自动化管理: MHA通过自动化的流程和决策来管理数据库集群的高可用性,减少了人工干预的需求,提高了系统的稳定性和可靠性

简单过程: 

  • 从宕机崩溃的master 保存二进制日志事件(binlog  events)
  • 识别含有最新的更新 slave 日志
  • 应用差异的中继日志(relay log)到其他的slave
  • 应用从master保存的二进制日志事件
  • 提升一个 salve 为新的master
  • 使其他的slave连接行的master 进行复制

5、故障切换备选主库的算法

  • 一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主
  • 数据一致的情况下,按照配置文件顺序,选择备选主库
  • 设定有权重(candidate_master=1),按照权重强制指定备选主

默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效

如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主

二、部署MHA高可用架构

1、环境部署

MHA架构:一主两从

设备操作系统IP地址所需工具/软件/安装包
MHA manager 服务器CentOS7172.16.12.11MHA node、manager 组件
Master 主点服务器CentOS7172.16.12.10mysql5.7、MHA node 组件
Slave1 从点服务器CentOS7172.16.12.12mysql5.7、MHA node 组件
Slave2 从点服务器CentOS7172.16.12.13mysql5.7、MHA node 组件

 关闭所有设备的防火墙和核心防护

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

修改四台服务器的主机名,方便区分

[root@localhost ~]#hostnamectl set-hostname master
[root@localhost ~]#bash      #修改master服务器主机名

[root@localhost ~]#hostnamectl set-hostname slave1
[root@localhost ~]#bash      #修改slave1服务器主机名

[root@localhost ~]#hostnamectl set-hostname slaver2
[root@localhost ~]#bash      #修改slave2服务器主机名

[root@localhost ~]#hostnamectl set-hostname manager
[root@localhost ~]#bash      #修改MHA-manager服务器主机名

安装master主服务器、slave1从服务器、slave2从服务器的mysql5.7软件 

#master主服务器、slave1从服务器、slave2从服务器都需编译安装的mysql软件
可参考《Mysql数据库概念与安装》:http://t.csdnimg.cn/wkJLr

2、部署主从同步

2.1 修改主配置文件并创建软链接

2.1.1 master 修改主配置文件并创建软连接
[root@master ~]#vim /etc/my.cnf
[mysqld]
server-id = 1
#三台服务器 server-id 不能一样
log_bin = master-bin
#添加,主服务器开启二进制日志
log-slave-updates = true
#添加,允许slave从master复制数据时可以写入到自己的二进制日志
[root@master ~]#systemctl restart mysqld

[root@master ~]#ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@master ~]#ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
#创建软链接

2.1.2 slave1 修改主配置文件并创建软连接 
[root@slave1 ~]#vim /etc/my.cnf
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
[root@slave1 ~]#systemctl restart mysqld

[root@slave1 ~]#ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@slave1 ~]#ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
#创建软链接

2.1.3 slave2 修改主配置文件并创建软连接
[root@slave2 ~]#vim /etc/my.cnf
vim /etc/my.cnf
server-id = 3 
#三台服务器 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@slave2 ~]#systemctl restart mysqld

[root@slave2 ~]#ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@slave2 ~]#ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
#创建软链接

2.2 配置一主两从机制

2.2.1 所有mysql服务器进行授权

master主服务器、slave1从服务器、slave2从服务器都需配置授权操作

#允许从数据库同步使用
grant replication slave on *.* to 'myslave'@'172.16.12.%' identified by '123456';

#允许manager使用
grant all privileges on *.* to 'mha'@'172.16.12.%' identified by 'manager';

#防止从库通过主机名连接不上主库
grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
flush privileges;    #刷新权限

2.2.2  在master主服务器上查看状态
show master status;
#查询到当前master主服务器二进制日志是master-bin.000001,偏移量是1743

2.2.3 在两个从服务器上执行同步操作
change master to master_host='172.16.12.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1743;
 
#master_host='172.16.12.10':设置主服务器的IP地址为192.168.44.60。
#master_user='myslave':设置用于复制的用户为'myslave',这个用户在主服务器上必须拥有replication slave权限
#master_password='123456':设置复制用户的密码为'123456'。在实际生产环境中,务必使用强密码
#master_log_file='master-bin.000001':指定从哪个二进制日志文件开始复制,这里是从'master-bin.000001'文件开始
#master_log_pos=1743:指定在上述二进制日志文件中的起始位置为1743
 
#执行这个命令之后,从服务器将开始尝试连接主服务器,并从指定的日志文件和位置开始接收并执行主服务器上的数据变更事件,以实现主从复制的功能。在执行此命令前,请确保主服务器的二进制日志配置正确,且从服务器有权访问主服务器。此外,执行完该命令后通常还需要执行START SLAVE命令来启动复制进程

start slave;  #开启主从同步
show slave status\G    #查看从服务器当前状态,必须保证IO和SQL线程工作正常即Yes
 

注:

一般 Slave_IO_Running: No 的可能性(一步步排查):

  • 网络不通
  • my.cnf配置有问题
  • 设置主从同步时:密码、file文件名、pos偏移量不对
  • 防火墙、核心防护没有关闭 
2.2.4 配置读写分离操作

将两个从服务器设置为只读模式,那么两个从服务器只提供客户端的读操作,而客户端的写操作则只有主服务器可主持,这样就实现了读写分离的简单操作

set global read_only=1;
#两个从服务器上配置只读模式

2.3 测试主从同步效果

在 master主服务器 上创建库和表,并插入数据,测试两个从服务器是否同步数据

create database xgy;
use xgy;
create table class(id int(3) primary key,name varchar(15) not null,address varchar(50));
insert into class values(1,'cjdv','江苏南京');
select * from class;

在两个从服务器slave1和slave2上查看是否同步到master主服务器的数据 

3、部署 MHA 架构

3.1 安装 MHA 所有组件

3.1.1 所有设备都需安装 node 组件
#所有服务器设备都需安装epel额外源和依赖包
yum install epel-release.noarch -y

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

对于每个操作系统版本不一样,这里 CentOS7.6选择 0.57 版本。
在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。

#所有设备服务器都需要安装 node 组件
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

3.1.2 在 MHA-manager 服务器上安装 manager 组件
[root@manager ~]#cd /opt
[root@manager opt]#tar zxvf mha4mysql-manager-0.57.tar.gz
[root@manager opt]#cd mha4mysql-manager-0.57
[root@manager mha4mysql-manager-0.57]#perl Makefile.PL
[root@manager mha4mysql-manager-0.57]#make && make install

3.1.3 manager 组件安装完后其工具详解

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 线程)

3.2 所有设备配置无密码认证

(1)在 MHA-manager 服务器上配置到所有主从mysql数据库的无密码认证

[root@manager ~]#ssh-keygen -t rsa
#一路回车到底
[root@manager ~]#ssh-copy-id 172.16.12.10
#输入yes和登录密码
[root@manager ~]#ssh-copy-id 172.16.12.12
[root@manager ~]#ssh-copy-id 172.16.12.13

(2)在 master 主服务器上配置到从服务器 slave1 和 slave2 的免密登录

[root@master ~]#ssh-keygen -t rsa
[root@master ~]#ssh-copy-id 172.16.12.12
[root@master ~]#ssh-copy-id 172.16.12.13

(3)在 slave1从服务器 上配置到 master主服务器 和 slave2从服务器 的免密登录

[root@slave1 ~]#ssh-keygen -t rsa
[root@slave1 ~]#ssh-copy-id 172.16.12.10
[root@slave1 ~]#ssh-copy-id 172.16.12.13

(4)在 slave2从服务器 上配置到 master主服务器 和 slave1从服务器 的免密登录

[root@slave2 ~]#ssh-keygen -t rsa
[root@slave2 ~]#ssh-copy-id 172.16.12.10
[root@slave2 ~]#ssh-copy-id 172.16.12.12

(4)随便验证,查看能否免密登录 

3.3 在manager服务器上配置MHA

3.3.1 复制相关脚本到/usr/local/bin 目录
[root@manager ~]#cp -a /opt/mha4mysql-manager-0.57/samples/scripts/  /usr/local/bin/
[root@manager ~]#ls /usr/local/bin/scripts/
 
master_ip_failover  		#自动切换时 VIP 管理的脚本
master_ip_online_change 	#在线切换时 vip 的管理
power_manager 				#故障发生后关闭主机的脚本
send_report 				#因故障切换后发送报警的脚本

3.3.2 复制VIP 管理的脚本到规定目录并修改

复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换

[root@manager ~]#cd /usr/local/bin
[root@manager bin]#cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

修改内容如下:(删除原有内容,直接复制并修改vip相关参数)

[root@manager bin]#vim /usr/local/bin/master_ip_failover
#全部删除原有的所有内容,并直接复制以下内容并修改vip相关参数
#要在末行模式输入:set paste,再粘贴

#!/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 = '172.16.12.200';
#指定vip的地址
my $brdc = '172.16.12.255';
#指定vip的广播地址
my $ifdev = 'ens33';
#指定vip绑定的网卡
my $key = '1';
#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; 
#代表此变量值为ifconfig ens33:1 192.168.10.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
#代表此变量值为ifconfig ens33:1 192.168.10.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";
}

3.3.3 创建 MHA 软件目录并拷贝配置文件

创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

[root@manager ~]#mkdir /etc/masterha
[root@manager ~]#cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf  /etc/masterha/

3.3.4 修改app1.cnf配置文件
[root@manager ~]#vim /etc/masterha/app1.cnf						
#删除原有内容,直接复制并修改节点服务器的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=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 172.16.12.12 -s 172.16.12.13
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=172.16.12.10
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=172.16.12.12
port=3306

[server3]
hostname=172.16.12.13
port=3306

#app1.cnf配置文件语句详解

[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
#设置复制用户的用户
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 172.16.12.12 -s 172.16.12.13
#指定检查的从服务器IP地址
shutdown_script=""
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root
#设置ssh的登录用户名
user=mha
#设置监控用户root
 
[server1]
hostname=172.16.12.10
port=3306
 
[server2]
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
hostname=172.16.12.12
port=3306
 
[server3]
hostname=172.16.12.13
port=3306

3.4 第一次配置需在 master 上手动开启虚拟IP

[root@master ~]#ifconfig ens33:1 172.16.12.200/24
[root@master ~]#ip a

3.5 在 manager 上测试 ssh 免密登录

在 manager服务器上测试 ssh 免密登录,如果正常最后会输出 successfully

[root@manager ~]#masterha_check_ssh -conf=/etc/masterha/app1.cnf

3.6 在 manager 上测试 mysql 主从连接情况

在 manager 服务器上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常

[root@manager ~]#masterha_check_repl -conf=/etc/masterha/app1.cnf

典型错误:未知变量'default-character-set=utf8' 

解决方法: 删除所有mysql主从服务器的主配置文件(/etc/my.cnf)中的[client]模块下的default-character-set=utf8

再重新测试 mysql 主从连接情况:出现MySQL Replication Health is OK就成功了

3.7 在 manager 服务器上启动 MHA

[root@manager ~]#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 &

#解释
这条命令是在Linux环境下启动MHA(MySQL Master High Availability)管理器并执行特定操作的一个示例。让我们逐部分解析这个命令:
 
nohup: nohup 是一个Unix/Linux命令,用于运行另一个命令并在后台运行,即使用户注销系统,命令也将继续运行。通过nohup启动程序可以使其在终端断开连接后仍然运行。
 
masterha_manager: 这是MHA工具的一部分,用于管理和监控MySQL主从复制集群,以及在主库出现问题时进行故障切换。
 
--conf=/etc/masterha/app1.cnf: 这个参数指定MHA使用的配置文件路径,里面包含了MHA管理的MySQL集群的各项信息,如主库、从库列表、复制用户、SSH连接信息等。
 
--remove_dead_master_conf: 这个参数指示MHA在检测到主库失效后,从配置文件中移除失效主库的相关配置。
 
--ignore_last_failover: 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover
 
< /dev/null: 这表示输入来源是空设备文件/dev/null,也就是说不从标准输入读取任何数据。
 
> /var/log/masterha/app1/manager.log: 这是输出重定向,MHA管理器的所有标准输出(stdout)将被写入到指定的这个日志文件中,方便查看MHA的操作记录和状态信息。
 
2>&1: 这是错误输出重定向,将标准错误输出(stderr)也重定向到标准输出,所以这里的stderr同样会被写入到上面提到的日志文件中。
 
&: 最后的符号表明整个命令将在后台运行,不影响当前终端的交互。
 
总的来说,这条命令的作用是启动MHA管理器,在后台运行,根据给定的配置文件对MySQL集群进行监控,并在检测到主库失效时移除失效主库的配置,同时忽略上一次的故障切换结果,所有输出(包括标准输出和错误输出)都将被记录到指定的日志文件中。

#若要关闭 manager 服务,可以使用如下命令
masterha_stop --conf=/etc/masterha/app1.cnf
#查看当前MHA状态
masterha_check_status --conf=/etc/masterha/app1.cnf

3.8 查看 MHA 状态 

[root@manager ~]#masterha_check_status --conf=/etc/masterha/app1.cnf
#查看 MHA 状态,可以看到当前的 master
[root@manager ~]#cat /var/log/masterha/app1/manager.log | grep "current master"
#查看 MHA 日志,也能看到当前的 master

4、模拟单点故障

(1)模拟旧master故障,查看slave1是否自动替换成新的master

在manager服务器实时监控日志记录,等会模拟master出现故障,相应的记录也会随之出现

[root@manager ~]#tailf /var/log/masterha/app1/manager.log

[root@master ~]#systemctl stop mysqld.service  
#模拟master故障,即关闭master主服务器的mysql服务

当旧master出现故障,manager服务器将自动把slave1从服务器替换成新的master主服务器 

(2)验证旧slave1(新的master)是否接管虚拟VIP

(3)查看app1.cnf配置文件内容,是否将故障的旧master删除

正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将故障的旧master 删除

[root@manager ~]#cat /etc/masterha/app1.cnf

5、单点故障修复

一般旧master的故障修复好,是不会去抢占优先级再次成为master,而是会作为新的slave添加到MHA高可用集群里

5.1 修复master

上次关闭mysql服务导致故障,这次开启mysql服务即可,但在现实环境中,需要根据各个复杂的情况来进行修复

[root@master ~]#systemctl restart mysqld

5.2 修复主从

(1)在现主服务器 slave1(172.16.12.12) 查看二进制日志和偏移量

show master status;

reset slave;

change master to master_host='172.16.12.12',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=154;
#旧master服务器变成从服务器,进行同步操作,记得修改二进制日志和偏移量

start slave;
show slave status\G

5.3 在 manager 上修改配置文件app1.cnf

在 manager 节点上修改配置文件/etc/masterha/app1.cnf(再把这个旧master(新slave)的记录添加进去,因为它检测掉失效时候会自动消失) 

[root@manager ~]#vim /etc/masterha/app1.cnf 
……
[server1]
hostname=172.16.12.10
port=3306
……

5.4 在manager上重启MHA

[root@manager ~]#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 &

[root@manager ~]#masterha_check_status --conf=/etc/masterha/app1.cnf

5.5 测试主从复制

在新master(旧slave1)服务器上创建新数据,查看新添加的从服务器(旧master)能否同步数据

use xgy;
insert into class values(2,'sjf','江苏无锡');
select * from class;

测试从服务器能否同步到数据,尤其是新slave(旧master)服务器

三、总结

1、MHA的作用

MySQL的高可用+故障切换

2、 MHA的核心组成

  • MHA Node(数据节点)

安装了MHA管理器的所有Mysql服务器节点;在发生故障的时候,会尽可能的保存二进制日志文件,并且实现故障切换(VIP的漂移)

  • MHA Manager(管理节点)

MHA Manager 可单独部署在一台独立的机器上,管理多个 master-slave 集群,也可以部署在一台 slave 节点上;做MHA的启动、关闭、管理和检测MySQL的各种健康检查

3、 MHA需要配置的文件

  • master_ip_failover

命令工具,定义的是基于VIP漂移的检测和故障转移(VIP从Master---->新的Master)

  • app1.conf

MHA的主要配置文件,主要定义了MHA的工作目录、日志

4、故障切换MHA会做哪些动作

  • MHA会多次尝试连接多测master的存活状态
  • MAH会多次尝试、尽可能地保存Master的二进制日志文件
  • MHA会根据配置文件app1.cnf中的配置部分,从服务器-------->主服务器的位置
  • MHA最后会将Master的VIP地址作为切换到从服务器的位置
  • MHA在选择完新的Master之后会在其余的Slave上执行change master操作,指向新的Master,来保证MySQL的群集的健康性

5、MHA故障问题

①软连接问题
②免交互登录
③五个用户授权(其中3个账号是测试环境需要做的)
④初次运行MHA功能时需要临时添加VIP地址
⑤配置文件-----需要校验
⑥先安装node节点,再安装主节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504804.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE】类和对象详解(下)

前言 面向对象程序的三大特性&#xff1a;封装、继承、多态~ 书接上回 类和对象&#xff08;上&#xff09;~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 封装 private public 快速生成可访问封装的方法 包…

ubuntu16.04 不支持 gcc-11,g++11

总结 ubuntu16.04 不支持 gcc-11&#xff0c;需要升级 18.04 或更高的版本。 背景 最近需要在我的 ubuntu16.04 电脑上安装 gcc-11&#xff0c;g-11&#xff0c;使用更高的版本来编译代码。根据网上查到的方式是添加以下的源并进行安装 sudo add-apt-repository ppa:ubuntu…

数据库之MyBatisPlus详解

MyBatisPlus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网地址&#xff1a;https://baomidou.com/ 一、入门案…

微信公众号迁移公证书在哪?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;很多小伙伴想做公众号迁移&#xff0c;但是不知道公众号迁移有什么作用&#xff0c;今天跟大家具体讲解一下。首先公众号迁移最主要的就是修改公众号的主体了&#xff0c;比如我们公众号原来是A公司的&#xff0c;现…

Ruoyi-Cloud-Plus_使用Docker部署分布式微服务系统_环境准备_001---SpringCloud工作笔记200

1.首先安装docker: 如果以前安装过首先执行: yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 去卸载docker 2.安装dokcer需要的工具包…

linux下minio部署和nginx配置

1 下载minio wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio #启动minio&#xff0c;文件数据存放在/data目录 ./minio server /data2 部署minio 下载minio后赋予可执行权限就可以运行了&#xff0c;这里我整理了遇到的坑和解决问题的最终配置…

大模型面试准备(九):简单透彻理解MoE

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

【洛谷】P9241 [蓝桥杯 2023 省 B] 飞机降落

挺有意思的一道题&#xff0c;分享给大家 题目链接 P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 输入格式 输出格式 输入输出样例 说明/提示 思路 一开始尝试贪心能不能做&#xff0c;但是不好确定飞机的顺序 因为这题的数…

第5篇:挖矿病毒(一)

0x00 前言 ​ 随着虚拟货币的疯狂炒作&#xff0c;挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。病毒传播者可以利用个人电脑或服务器进行挖矿&#xff0c;具体现象为电脑CPU占用率高&#xff0c;C盘可使用空间骤降&#xff0c;电脑温度升高&#xff0c;风扇噪声增大…

金融衍生品市场

金融衍生品市场 衍生金融品的作用衍生金融工具远期合约期货合约期权 衍生金融品的作用 套期保值&#xff08;Hedging&#xff09; 组合多头头寸(long position)与空头头寸(short position)例&#xff1a;股票与股指期货 投机 衍生金融工具 远期合约 定义&#xff1a;在将来…

C语言数组详解

一维数组 创建和初始化 数组就是一组相同元素的集合。 他的创建&#xff1a; char arr[10]; int arr1[5]; 数组创建中 [] 里不能是变量&#xff0c;但是在c99标准之后就可以了被称为变长数组&#xff0c;但是不常用&#xff0c;而且变长数组不能初始化。 初始化&#xff…

这两个比较经典的LVS问题怎么解?

今日景芯SoC VIP学员遇到的LVS问题&#xff0c;比较经典&#xff0c;大家先思考下。然后本文末尾分享下2.5GHz A72训练营的LVS解法&#xff1a; 问题1&#xff1a; 问题2&#xff1a; 修改后&#xff1a; 具体修改方案参见知识星球&#xff0c;接下来分享下2.5GHz A72项目的LV…

如何使用固定公网地址远程访问内网Axure RP生成的网站原型web页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

StructStreaming Batch mode和Continuous mode

StructStreaming Batch mode和Continuous mode 让我们把目光集中到 Structured Streaming&#xff0c;也就是流处理引擎本身。Structured Streaming 与 Spark MLlib 并列&#xff0c;是 Spark 重要的子框架之一。值得一提的是&#xff0c;Structured Streaming 天然能够享受 S…

C语言刷题总结

1.网购问题 &#xff08;1)这道题目需要分多种情况进行考虑&#xff1a;双11还是双12&#xff0c;有无优惠券&#xff0c;是否会出现优惠券的面值大于购买商品的单价&#xff08;这个时候直接按0元进行处理&#xff09;&#xff1b; &#xff08;2&#xff09;在对于优惠券的分…

Ansible-3

block任务块&#xff1a;可以通过block关键字&#xff0c;将多个任务组合到一起&#xff1b;将整个block任务组一起控制是否要执行。 如果test组中的主机系统发行版是Redhat则安装并启动httpd。原本这是需要两个任务安装和执行&#xff0c;通过block整合为一个任务执行。 rescu…

PyLMKit(9):ChatTable与你的表格聊天,表格问答

功能介绍 与你的结构化数据聊天&#xff1a;支持主流数据库、表格型excel等数据&#xff01; ChatDB&#xff1a;支持数据库问答ChatTable&#xff1a;支持txt,excel,csv等pandas dataframe表格的问答 1.下载安装 pip install pylmkit -U pip install pandasql2.ChatTable实…

阿里云ECS服务器经济型e实例详解,CPU性能测评

阿里云服务器ECS经济型e系列是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;CPU处理器采用Intel Xeon Platinum架构处理器&#xff0c;支持1:1、1:2、1:4多种处理器内存配比&#xff0c…

STM32——超声测距HC_SR04记录

一、HC_SR04简述 HC-SR04超声波测距模块可提供 2cm-400cm的非接触式距离感测功能&#xff0c;测距精度可达高到 3mm&#xff1b;模块包括超声波发射器、接收器与控制电路。 基本工作原理&#xff1a; (1)采用IO 口TRIG 触发测距&#xff0c;给最少10us 的高电平信呈。 (2)模块…

C/C++函数字符串和数字的互相转化(比赛超实用)

字符串和数字相互转化: 1 数字转字符串: 实现方法:to_string函数 存在头文件: string 实现代码: #include<iostream> #include<string> using namespace std; int main() {int a 114514;string s to_string(a);cout << s[0] << endl;cout <<…