MySQL高可用架构之MHA(理论+部署+故障模拟)

MHA高可用配置及故障切换

  • 一、MHA概述
  • 二、MHA服务组成
    • 2.1 MHA Manager(管理节点)
    • 2.2 MHA Node(数据节点)
  • 三、MHA工作原理及特点
  • 四、MHA搭建及故障模拟
    • 4.1 搭建环境
    • 4.2 部署思路
    • 4.3 安装MySQL数据库与主从同步
    • 4.4 配置MHA
    • 4.5 manager和node安装后生成的常用脚本和工具
    • 4.6 配置无密码认证
    • 4.7 修改MHA相关配置
    • 4.8 查看无密码认证和manager节点上mysql 主从连接情况
    • 4.9 在 manager 节点上启动 MHA
    • 4.10 并查看MHA状态和日志
    • 4.11 查看 master 的 VIP 地址是否存在
    • 4.12 故障模拟
    • 4.13 修复模拟故障
  • 五、总结

一、MHA概述

  • MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。
  • MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。
  • MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。
  • MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。

二、MHA服务组成

2.1 MHA Manager(管理节点)

  • 通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。

2.2 MHA Node(数据节点)

  • 运行在每台 MySQL 服务器上(master/slave/manager),通过监控具备解析和清理 logs 功能的脚本来加快故障转移。
  • 主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。
  • 简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。
  • 对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

三、MHA工作原理及特点

  • ①从宕机崩溃的 master 保存二进制日志事件(binlog events)
  • ②识别含有最新更新的 slave
  • ③应用差异的中继日志(relay log) 到其他 slave
  • ④应用从 master 保存的二进制日志事件(binlog events)
  • ⑤提升一个 slave 为新 master
  • ⑥使用其他的 slave 连接新的 master 进行复制
  • MHA特点
    • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,从而最大成都的保证数据不丢失
    • 使用半同步复制,可以大大降低数据丢失的风险
    • 目前MHA支持一主多从架构,最少三台服务器,即一主两从

四、MHA搭建及故障模拟

4.1 搭建环境

主机名 IP地址 角色 所有安装软件包(MHA)
manager 192.168.131.14 manager管理节点 manager组件,MHA node 组件
master 192.168.131.9 mysql主数据库 MHA node 组件
slave1 192.168.131.10 mysql从数据库 MHA node 组件
slave2 192.168.131.11 mysql从数据库 MHA node 组件

4.2 部署思路

  • 安装MySQL数据库
  • 配置MySQL一主两从
  • 安装MHA软件
  • 配置MySQL MHA高可用
  • 模拟master故障切换

4.3 安装MySQL数据库与主从同步

  • 关闭防火墙及修改主机名(master、salve1、salve2、mha)
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# systemctl disable firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# 
  • 编译依赖环境与amake编译工具安装(三台MySQL服务器)
【将安装包分别拖进三台需装MySQL的服务器(一主两从)】
[root@master opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh
[root@slave1 opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh
[root@slave2 opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh

[root@localhost ~]# yum -y install ncurses-devel.x86_64 gcc-c++.x86_64 perl-Module-Install
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
cmake-2.8.6.tar.gz  mysql-5.6.36.tar.gz  rh
[root@localhost opt]# tar zxvf cmake-2.8.6.tar.gz 
[root@localhost opt]# cd cmake-2.8.6/
[root@localhost cmake-2.8.6]# ./configure 
[root@localhost cmake-2.8.6]# gmake && gmake install
  • 安装MySQL5.6
[root@localhost cmake-2.8.6]# cd /opt/
[root@localhost opt]# tar zxvf mysql-5.6.36.tar.gz 
[root@localhost opt]# cd mysql-5.6.36/
[root@localhost mysql-5.6.36]# cmake \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DEXTRA_CHARSETS=all \
> -DSYSCONFIDIR=/etc
[root@localhost mysql-5.6.36]# make -j6 && make install
  • 复制启动脚本与配置文件
/etc/init.d/:各种服务器和程序的二进制文件存放目录】
【/etc/rc.d/:各个启动级别的执行程序连接目录。里面很多文件都是指向init.d/的一些软链接】
[root@localhost mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
[root@localhost mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.6.36]# chmod +755 /etc/rc.d/init.d/mysqld 
[root@localhost mysql-5.6.36]# chkconfig --add /etc/init.d/mysqld 
[root@localhost mysql-5.6.36]# chkconfig mysqld --level 35 on
[root@localhost mysql-5.6.36]# echo 'PATH=$PATH:/usr/local/mysql/bin'>> /etc/profile
[root@localhost mysql-5.6.36]# source /etc/profile
[root@localhost mysql-5.6.36]# useradd -s /sbin/nologin mysql
[root@localhost mysql-5.6.36]# chown -R mysql.mysql /usr/local/mysql/
  • MySQL_install_db初始化(目录文件basedir和数据文件datadir都必须有)
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db \
> --basedir=/usr/local/mysql \
> --datadir=/usr/local/mysql/data/ \
> --user=mysql

【报错的话则安装autoconf库】
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
Data::Dumper
[root@localhost mysql-5.6.36]# yum -y install autoconf
  • 修改master的主配置文件
[root@localhost mysql-5.6.36]# vim /etc/my.cnf
 30 server-id=10
 31 log_bin=master-bin
 32 log-slave-updates=true
  • 配置从服务器
[root@localhost mysql-5.6.36]# vim /etc/my.cnf
 30 server-id=20
 31 log_bin=master-bin
 32 relay-log=relay-log-bin
 33 relay-log-index=slave-realy-bin.index


【从服务器2[root@localhost mysql-5.6.36]# vim /etc/my.cnf
 30 server-id=30
 31 log_bin=master-bin
 32 relay-log=relay-log-bin
 33 relay-log-index=slave-realy-bin.index
  • 在master和两台slave上分别做两个软链接
[root@localhost mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@localhost mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
【第一个是mysql命令文件】
【第二个是mysqlbinlog可用于断点恢复】
  • 开启服务并查看端口
[root@localhost mysql-5.6.36]# systemctl start mysqld
[root@localhost mysql-5.6.36]# netstat -natp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      40198/mysqld  
  • 配置MySQL一主两从
[root@localhost mysql-5.6.36]# mysqladmin -uroot -p password '5514'  【设置密码】
[root@localhost mysql-5.6.36]# mysql -uroot -p5514


【在所有数据库节点上授权两个用户,一个是从库同步使用,一个是manager使用】
mysql> grant replication slave on *.* to 'myslave'@'192.168.131.%' identified by '111222';  【从数据库同步使用】
mysql> grant all privileges on *.* to 'mha'@'192.168.131.%' identified by 'manager';        【manager使用】

【下面三条授权是为了实验MHA检查MySQL主从报错才添加,防止从库通过主机名连接不上主库】
mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
mysql> flush privileges;



【在Master上查看二进制文件和同步点】
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |     1720 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+



【在两台slave节点服务器进行同步】
mysql> change master to master_host='192.168.131.9',master_user='myslave',master_password='111222',master_log_file='master-bin.000002',master_log_pos=1720;
mysql> start slave;
mysql> show slave status\G;
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes



【设置两个从库为只读模式(必改项)】
mysql> set global read_only=1;
mysql> flush privileges;

4.4 配置MHA

  • 在所有服务器上安装MHA依赖环境(需先安装epel源)
【安装epel源,并且不进行gph检查】
[root@localhost ~]# yum -y install epel-release --nogpgcheck

[root@localhost /]# yum install -y perl-DBD-MySQL \   【perl针对于mysql数据库】
> perl-Config-Tiny \                                  【从配置文件中提拿其中的值】
> perl-Log-Dispatch \                                 【log-日志】
> perl-Parallel-ForkManager \                         【多线程管理】
> perl-ExtUtils-CBuilder \                            【扩展工具CBuilder MakeMaker】
> perl-ExtUtils-MakeMaker \
> perl-CPAN                                           【cpan perl中的数据库】
  • 所有节点安装node组件
  • 在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件(因为manager依赖node组件)
[root@localhost opt]# ls
cmake-2.8.6  cmake-2.8.6.tar.gz  mha4mysql-node-0.57.tar.gz  mysql-5.6.36  mysql-5.6.36.tar.gz  rh
[root@localhost opt]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@localhost opt]# cd mha4mysql-node-0.57
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL
[root@localhost mha4mysql-node-0.57]# make && make install
  • 在MHA节点上安装manager组件
  • 必须先安装node才能安装manager组件
[root@localhost opt]# ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@localhost opt]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@localhost opt]# cd mha4mysql-manager-0.57
[root@localhost mha4mysql-manager-0.57]# perl Makefile.PL
[root@localhost mha4mysql-manager-0.57]# make && make install

4.5 manager和node安装后生成的常用脚本和工具

[root@localhost mha4mysql-manager-0.57]# ls /usr/local/bin/
apply_diff_relay_logs  json_pp              masterha_check_status  masterha_master_monitor   masterha_stop            purge_relay_logs
config_data            masterha_check_repl  masterha_conf_host     masterha_master_switch    package-stash-conflicts  save_binary_logs
filter_mysqlbinlog     masterha_check_ssh   masterha_manager       masterha_secondary_check  prove
  • manager安装后会在/usr/local/bin目录下生成几个工具,主要包括
工具 说名
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manager 启动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线程)

4.6 配置无密码认证

  • 在mannager上配置到所有数据库节点的无密码认证
【全部直接回车确认进入下一步】
[root@localhost mha4mysql-manager-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-manager-0.57]# ssh-copy-id 192.168.131.9
【按完yes后需输入ssh登录密码5514[root@localhost mha4mysql-manager-0.57]# ssh-copy-id 192.168.131.10
[root@localhost mha4mysql-manager-0.57]# ssh-copy-id 192.168.131.11
  • 在master上配置到slave1和salve2的无密码认证
[root@localhost mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.10
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.11
  • 在slave1上配置到master和salve2的无密码认证
[root@localhost mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.9
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.11
  • 在slave2上配置到master和salve1的无密码认证
[root@localhost mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.9
[root@localhost mha4mysql-node-0.57]# ssh-copy-id 192.168.131.10

4.7 修改MHA相关配置

  • 在mha节点上复制相关脚本到/usr/local/bin目录
[root@localhost mha4mysql-manager-0.57]# cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
【拷贝后查询会有四个执行文件】
[root@localhost mha4mysql-manager-0.57]# ll /usr/local/bin/scripts/
总用量 32
-rwxr-xr-x. 1 1001 1001  3648 531 2015 master_ip_failover          【自动切换时VIP管理的脚本】
-rwxr-xr-x. 1 1001 1001  9870 531 2015 master_ip_online_change     【在线切换时VIP的管理】
-rwxr-xr-x. 1 1001 1001 11867 531 2015 power_manager               【故障发生后关闭主机的脚本】
-rwxr-xr-x. 1 1001 1001  1360 531 2015 send_report                 【因故障切换后发送报警的脚本】

【再将master_ip_failover复制到/usr/local/bin/目录】
[root@localhost mha4mysql-manager-0.57]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
  • 修改master_ip_failover内容(删除原有内容,直接添加)
[root@localhost mha4mysql-manager-0.57]# 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.131.100';                              【浮动IP】
my $brdc = '192.168.131.255';                             【广播地址】
my $ifdev = 'ens33';                                      【使用的网卡为ens33】
my $key = '1';                                            【国际序列号】
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";     【使用ifoconfig命令将其启动,同时设置浮动地址】
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";      【可以使用ifconfig命令将其down掉(关闭)】        
my $exit_code = 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;
}
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";
}
  • 创建MHA软件目录并将配置文件拷贝过去(这里使用app1.cnf配置文件来管理 mysql 节点服务器)
[root@localhost mha4mysql-manager-0.57]# mkdir /etc/masterha
[root@localhost mha4mysql-manager-0.57]# cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
  • 配置节点相关信息 (直接删除原有配置后进行节点相关信息的添加)
[root@localhost mha4mysql-manager-0.57]# 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=/usr/local/mysql/data                      【master保存binlog的位置】
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                                             【此处密码为之前创建监控用户的密码】
user=mha                                                     【设置监控用户】
ping_interval=1             【设置监控主库,发送Ping包的事件间隔,默认为3秒,尝试3次没有回应的时候自动进行failover】
remote_workdir=/tmp                                          【设置远端的MySQL再发送切换时binlog的(临时)保存位置】
repl_password=111222                                         【设置复制(slaves)用户的密码】
repl_user=myslave                                            【设置复制用户的账号】
report_script=/usr/local/send_report                         【设置发送切换后发送的报警脚本(为了实验这里不进行此项配置)】
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.131.10 -s 192.168.131.11【设置检查从服务器的脚本】
shutdown_script=""                                           【设置故障发生后关闭故障主机脚本】
ssh_user=root                                                【设置ssh的登录用户名】

[server1]
hostname=192.168.131.9
port=3306

[server2]
hostname=192.168.131.10
port=3306

[server3]
candidate_master=1       
【设置候选master,如果设置了此参数,则发生主从切换后,会将此库提升为主库】
hostname=192.168.131.11
check_repl_delay=0
【默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master】
【因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时】
【这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master】
port=3306
  • 第一次配置需要在 Master 节点上手动开启虚拟IP
[root@master mha4mysql-node-0.57]# /sbin/ifconfig ens33:1 192.168.131.100/24

4.8 查看无密码认证和manager节点上mysql 主从连接情况

  • 在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully
    MySQL高可用架构之MHA(理论+部署+故障模拟)_第1张图片
  • 在 manager 节点上测试 mysql 主从连接情况
    在这里插入图片描述

4.9 在 manager 节点上启动 MHA

  • --remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
  • --manger_log:日志存放位置。
  • --ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。
    该参数也代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover。
[root@localhost mha4mysql-manager-0.57]# 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] 9558

4.10 并查看MHA状态和日志

  • 查看 MHA 状态,可以看到当前的 master 是 master 节点。
[root@localhost mha4mysql-manager-0.57]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:9558) is running(0:PING_OK), master:192.168.131.9
  • 查看 MHA 日志,也以看到当前的 master 是 192.168.131.9
[root@localhost mha4mysql-manager-0.57]# cat /var/log/masterha/app1/manager.log | grep "current master"
Wed Feb 24 12:01:16 2021 - [info] Checking SSH publickey authentication settings on the current master..
192.168.131.9(192.168.131.9:3306) (current master)

4.11 查看 master 的 VIP 地址是否存在

MySQL高可用架构之MHA(理论+部署+故障模拟)_第2张图片

  • 关闭MHA后再次查看
    MySQL高可用架构之MHA(理论+部署+故障模拟)_第3张图片

4.12 故障模拟

  • 在 manager 节点上监控观察日志记录
[root@localhost mha4mysql-manager-0.57]# tail -f /var/log/masterha/app1/manager.log
  • 在Master节点停止mysql服务
[root@localhost mha4mysql-node-0.57]# systemctl stop mysqld.service 

MySQL高可用架构之MHA(理论+部署+故障模拟)_第4张图片

  • 故障切换备选主库的算法
    • 一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
    • 数据一致的情况下,按照配置文件顺序,选择备选主库。
    • 设定有权重(candidate_master=1),按照权重强制指定备选主。
      • 默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
      • 如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。

4.13 修复模拟故障

  • 修复mysql
[root@localhost mha4mysql-node-0.57]# systemctl start mysqld.service 
  • 修复主从
【在现主库服务器 slave2 查看二进制文件和同步点】
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1515 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)




【在原主库服务器 master 执行同步操作】
[root@localhost mha4mysql-node-0.57]# mysql -uroot -p5514
mysql> change master to master_host='192.168.131.11',master_user='myslave',master_password='111222',master_log_file='master-bin.000001',master_log_pos=1515;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
  • 在 manager 节点上修改配置文件app1.cnf
  • 再把这个记录(master)添加进去,因为它检测掉失效时候会自动消失
[root@localhost mha4mysql-manager-0.57]# vim /etc/masterha/app1.cnf
 28 [server1]
 29 hostname=192.168.131.9
 30 port=3306
  • 在 manager 节点上启动 MHA
[root@localhost mha4mysql-manager-0.57]# 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 &
  • 解决中英字不兼容报错的问题
    • dos2unix /usr/local/bin/master_ip_failover

五、总结

  • MHA的作用:为 MySQL 主从复制架构提供了 自动化故障转移(automating master failover) 功能。
  • MHA由MHA Manager(管理节点)和MHA Node(数据节点)组成
  • MHA特点
    • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,从而最大成都的保证数据不丢失
    • 使用半同步复制,可以大大降低数据丢失的风险
    • 目前MHA支持一主多从架构,最少三台服务器,即一主两从
  • 半同步复制:顾名思义就是复制一部分,跟主库的数据有可能不一样。再完整的主从机制,从库有时也会落后于主库。

你可能感兴趣的:(mysql,经验分享,云计算)