MHA高可用配置及故障切换

引言

MySQL 服务器中,单台服务器无法承载服务量就配置多台MySQL服务器,多台 MySQL 服务器或者MySQL 服务器无冗余的情况下,配置主从复制。 MySQL服务器的读和写的压力不均衡可使用 MySQL 的读写分离,MySQL的读写分离中 Msater 存在单点故障,就得用到 MHA。

一、MHA概念

1、什么是MHA?

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

2、MHA有哪些组件组成

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

3、MHA的特点

  • 自动故障切换过程中,MHA视图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失风险,如果只有一个slave已经收到最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
  • 目前MHA支持一主多从架构,最少三台服务器,即一主两从

MHA :为了解决的是故障切换、数据尽可能的保存,以及所有节点日志的一致性

4、MHA工作原理

MHA Manager 管理多组主从复制

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

5、数据同步方式

1.异步复制

  • 只要master完成客户端提交的事务,就会立刻返回给客户端消息,从不关心从服务器是否同步到数据

2.同步复制

  • 等客户端提交事务的时候,master要等所有从服务器同步完,才返回给客户端

3.半同步复制

  • 客户端提交事务的时候master会等其中一个slave同步完数据之后,才返回给客户端

二、部署MySQL  MHA

MHA :为了解决的了是故障切换、数据尽可能的保存,以及所有节点日志的一致性

实验思路

MHA架构

  1. 数据库安装
  2. 一主两从
  3. MHA搭建

故障模拟

  1. 主库失效
  2. 备选主库成为主库
  3. 原故障主库恢复重新加入到MHA成为从库

实验环境

主机 IP地址
Master 192.168.10.100
Slave1 192.168.10.101
Slave2 192.168.10.102
MHA  Manager 192.168.10.103

关闭防火墙及核心防护

systemctl stop firewalld           ##关闭防火墙
systemctl disable firewalld        ##开机不自启
setenforce 0                       ##关闭核心防护

1、Master、Slave1、Slave2节点上安装MYSQL

netstat -natp | grep 3306

2、修改Master、Slave1、Slave2、MHA Master节点的主机名

hostnamectl set-hostname Master
hostnamectl set-hostname Slave1
hostnamectl set-hostname Slave2
hostnamectl set-hostname manager

3、修改Master、Slave1、Slave2节点的MySQL主配置文件/etc/my.cnf

1.master节点服务器配置

###master 节点
vim /etc/my.cnf

[mysqld]
server-id = 1              ##开启二进制日志
log_bin=master-bin         ##允许slave从master复制数据时可以写入到自己的二进制日志
log-slave-updates=true

systemctl restart  mysqld  ##重启MySQL

2.slave1节点服务器配置

vim /etc/my.cnf

[mysqld]
server-id = 2
log_bin=master-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

3.slave2节点服务器配置

server-id = 3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

4、在master、slave1、slave2节点上都创建两个软链接

将mysql命令和日志软链接到/usr/sbin,便于系统识别

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

5、配置MySQL一主两从

1.在 Master、Slave1、Slave2 节点上都进行主从同步的授权

##master

grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123456';   ##从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';   ###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.在Master节点查看二进制文件和同步点

show master status;  ##查看主服务器信息状态

3.在Slave1、Slave2节点执行同步操作

change master to master_host='192.168.10.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1745;

start slave;

show slave status\G

4.Slave1、Slave2节点设置为只读模式

set global read_only=1;

5.验证主从同步

在 Master 主库插入条数据,测试是否同步

##主服务器Master
create database njzh;
use njzh;
create table kysw (id int,name varchar(15));
insert into kysw values(1,'zhangsan');

6、安装 MHA  软件

1.所有服务器上都安装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

注:所有服务器都要安装依赖环境,包括MHA manager服务器

2.配置/etc/hosts

192.168.10.100 master
192.168.10.101 slave1
192.168.10.102 slave2
192.168.10.103 manager

3.安装 MHA 软件包

在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装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节点上安装manager组件

ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
tar xf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57/
perl Makefile.PL
make && make install

7、在所有服务器上配置无密码认证

1. 在 manager 节点上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa    ###一路按回车键
ssh-copy-id 192.168.10.100     #master
ssh-copy-id 192.168.10.101     #slave1
ssh-copy-id 192.168.10.102     #slave2

2.在master上配置到数据库节点slave1和slave2的无密钥认证

ssh-keygen -t rsa    ###一路按回车键
ssh-copy-id 192.168.10.101     #slave1
ssh-copy-id 192.168.10.102     #slave2

3. 在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证

ssh-keygen -t rsa    ###一路按回车键
ssh-copy-id 192.168.10.100     #master
ssh-copy-id 192.168.10.102     #slave2

4. 在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证

ssh-keygen -t rsa    ###一路按回车键
ssh-copy-id 192.168.10.100     #master
ssh-copy-id 192.168.10.101     #slave1

8、在manager节点上配置MHA

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

cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

#复制后会有四个执行文件
ll /usr/local/bin/scripts/

 

2.复制自动切换时 VIP 管理的脚本到 /usr/local/bin 目录

这里使用master_ip_failover脚本来管理 VIP 和故障切换

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

3.修改脚本master_ip_failover脚本

删除原有内容,直接复制并修改vip相关参数

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.10.200';									#指定vip的地址
my $brdc = '192.168.10.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";
}

4.创建MHA 软件目录并复制配置文件

使用app1.cnf配置文件来管理 mysql 节点服务器,配置文件一般放在/etc/目录下

mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha

删除原有配置,进行新配置 

[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 192.168.10.14 -s 192.168.10.15
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.10.100
port=3306

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

[server3]
hostname=192.168.10.102
port=3306

9、在Master服务器上手动开启vip

ifconfig ens33:1 192.168.10.200/24
ifconfig

10、在 manager 节点上测试 ssh 无密码认证

如果正常最后会输出 successfully,。

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

11、在 manager 节点上测试 mysql 主从连接情况

最后出现 MySQL Replication Health is OK 字样说明正常。

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

12、在 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 &

1.查看 MHA 状态,可以看到当前的 master

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

2.查看 MHA 日志,可以看到当前的 master

cat /var/log/masterha/app1/manager.log | grep "current master"

3.如果要关闭 manager 服务

masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 进程 ID 的方式关闭

三、故障模拟

1、在 manager 节点上监控观察日志记录

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

2、模拟master节点故障关闭服务

正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。

##Master
ifconfig ens33:1          ##此时有ens33:1地址
systemctl stop  mysqld    ##模拟master节点故障关闭服务


##Slave1
ifconfig ens33:1          ##此时有Slave1接管ens33:1地址

3、查看manager节点动态日志

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

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

默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主

四、故障修复

1、修复master

systemctl restart mysqld

2、修复主从

 在现主库服务器 Slave1(192.168.10.101) 查看二进制文件和同步点

mysql -u root -p
show master status;

在原主库服务器 mysql1(192.168.10.100)执行同步操作

change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='master-bin.000005',master_log_pos=154;

start slave;
show slave status\G

3、在 manager 节点上修改配置文件app1.cnf

再把这个记录添加进去,因为它检测掉失效时候会自动消失

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 192.168.109.12 -s 192.168.109.14
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.10.100
port=3306

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

[server3]
hostname=192.168.10.102
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

总结:

1、mha

作用:mysql的高可用+故障切换

核心部分:
MHA组件:

  • manager:主要功能:做MHA的启动、关闭管理和检测mysql各种健康状态
  • node:在发生故障时,尽可能地保存二进制日志,并且实现故障切换(VIP地址漂移)

MHA需要配置的文件:
master ip failover:命令工具,定义的是基于VIP的检测和故障转移(VIP从master—>到新的master)
app1.cnf:mha的主要配置文件,主要定义了mba的工作目录、日志
mysql二进制日志位置

使用mha的登录mysql的用户、密码使用从服务器
身份同步master的账号、密码(5个)

故障切换mba会做那些动作?

  • mha会多次尝试检测master的存活状态
  • mha会多次尝试尽可能的保存master的二进制日志
  • mha会根据app1.cnf中的配置部分,进行从服务器—》主服务器
  • mha最后会将master的VIP作为切换到从服务器的位置
  • mha在选择完新的master之后,会在其余的slave上执行change master操作,指向新的master,来保证mysql的集群健康性

2、mha的故障问题

  1. 软链接必须得做
  2. 免交互登录
  3. 5个账号授权(其中3个账号是测试环境需要做的)
  4. 初次运行mha的功能时,需要临时添加虚拟IP
  5. 配置文件需要校验(master ip_failover 1个故障切换的脚本,app1.cnf mha的主配置文件)

相关推荐

  1. MHA 可用部署

    2024-03-31 22:18:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 22:18:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 22:18:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 22:18:02       82 阅读
  4. Python语言-面向对象

    2024-03-31 22:18:02       91 阅读

热门阅读

  1. 微微科技遇到的问题总结

    2024-03-31 22:18:02       44 阅读
  2. 设计模式之命令模式 ,Php高级编程

    2024-03-31 22:18:02       40 阅读
  3. 正则表达式

    2024-03-31 22:18:02       38 阅读
  4. Leetcode 232:用栈实现队列

    2024-03-31 22:18:02       41 阅读
  5. leetcode 55.跳跃游戏

    2024-03-31 22:18:02       45 阅读
  6. C#使用Stopwatch类来实现计时功能

    2024-03-31 22:18:02       38 阅读
  7. LEETCODE-DAY38

    2024-03-31 22:18:02       35 阅读
  8. FPGA_mipi

    2024-03-31 22:18:02       39 阅读
  9. 享元模式

    2024-03-31 22:18:02       38 阅读
  10. Rust常用库之处理hex数据hex-literal

    2024-03-31 22:18:02       38 阅读
  11. C++-三目运算符注意点与临时变量的坑

    2024-03-31 22:18:02       34 阅读