MYSQL 5.6.36 配置搭建MHA实现MYSQL的主从复制高可用解决方案

一、什么是MHA

MHA(MasterHigh Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方 案,它由日本 DeNA 公司 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的 MySQL 高可用环境下故障切换和主从复制的软件。在 MySQL 故障切换过程中,MHA 能做 到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

1、MHA的组成

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

2、MHA的优势

在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上保存二进制日志,最大 程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过 SSH 访问,MHA 没法保存二进制日志,就会出现只进行故障转移但丢失了最新的数据的情 况。使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复 制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进 制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性。

3、MHA的架构

目前 MHA 主要支持一主多从的架构,要搭建 MHA 要求一个复制集群中必须最少有三 台数据库服务器,即一台充当 master,一台充当备用 master,另外一台充当从库。因为至 少需要三台服务器

二、高可用案例

目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。

1、实现需求

要求通过 MHA 监控 MySQL 数据库在故障时进行自动切换,不影响业务。

2、实现思路

(1)安装 MySQL 数据库;
(2)配置 MySQL 一主两从;
(3)安装 MHA 软件;
(4)配置无密码认证;
(5)配置 MySQL MHA 高可用;
(6)模拟 master 故障切换。

3、环境准备

(1)服务器

主机名 ip地址 角色 安装软件包
manager 192.168.245.203 manager管理节点 manager组件,node组件
master 192.168.245.204 mysql主数据库 node组件
slave1 192.168.245.205 mysql从数据库 node组件
slave2 192.168.245.206 mysql从数据库 node组件

(2)软件包

  • mysql-5.6.36.tar.gz
  • cmake-2.8.6.tar.gz
  • mha4mysql-manager-0.57.tar.gz
  • mha4mysql-node-0.57.tar.gz
  • 因为MHA的 0.55 版本只支持到 CentOS6, 这里操作系统是 CentOS7 版本,所以这里使用MHA的 版本是 0.57。

4、安装mysql数据库

以下操作都要在一主两从的数据库服务器上进行

yum安装依赖包

[root@localhost opt]# yum -y install ncurses-devel gcc-c++ perl-Module-Install

编译安装cmake

[root@master opt]# tar xzvf cmake-2.8.6.tar.gz 

[root@master opt]# cd cmake-2.8.6/
[root@master cmake-2.8.6]# ./configure 

[root@master cmake-2.8.6]# gmake && gmake install

编译安装mysql5.6.36

[root@master cmake-2.8.6]# cd ..
[root@master opt]# tar xzvf mysql-5.6.36.tar.gz

[root@master opt]# cd mysql-5.6.36/
[root@master mysql-5.6.36]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFIDIR=/etc

[root@master mysql-5.6.36]# make && make install

其他配置优化

[root@master mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
[root@master mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@master mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld
[root@master mysql-5.6.36]# chkconfig --add mysqld
[root@master mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin">>/etc/profile
[root@master mysql-5.6.36]# source /etc/profile
[root@master mysql-5.6.36]# groupadd mysql
[root@master mysql-5.6.36]# useradd -M -s /sbin/nologin mysql -g mysql
[root@master mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql/
[root@master mysql-5.6.36]# mkdir -p /data/mysql

初始化数据库:

[root@master mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--basedir=/usr/local/mysql/ \
--datadir=/usr/local/mysql/data

三台机器分别设置my.cnf

#master:
vim /etc/my.cnf
server-id = 1
log_bin = master-bin
log-slave-updates =  true

#slave1:
vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

#slave2:
vim /etc/my.cnf
server-id = 3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

注意:两台 slave 服务器的server-id 不能相同, 这里id 分别配置为 2 和 3,其他相同。

创建软连接便于管理使用

[root@master mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@master mysql-5.6.36]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

三台一起启动mysql

[root@master mysql-5.6.36]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
[1] 99496
[root@master mysql-5.6.36]# Logging to '/usr/local/mysql/data/master.err'.
200827 22:18:46 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
回车退出后台模式

[root@master mysql-5.6.36]# netstat -antp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      99623/mysqld

5、配置主从同步

在所有数据库节点上授权两个用户,一个是从服务器同步使用,一个是被manager监控使用

[root@master mysql-5.6.36]# mysql -uroot -p
Enter password: 回车

mysql> grant replication slave on *.* to 'myslave'@'192.168.245.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'192.168.245.%' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

下面三条授权按理论是不用添加的,但是在做案例实验时通过 MHA 检查 MySQL 主从 有报错,报两个从库通过主机名连接不上主库,所以三个数据库都添加下面的授权

mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

在 master上查看二进制文件和同步点

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1294 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在两台slave服务器上分别执行同步操作并查看数据同步结果

mysql> change master to master_host='192.168.245.204',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1294;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.245.204
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 1294
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 284
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

注意:查看 IO 和 SQL 线程都是 yes 代表同步是否正常

设置两台从服务器为只读模式,在两个从库上分别执行:

mysql> set global read_only=1;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

注意:只有主从同步了才能进行MHA高可用的配置

6、搭建MHA

所有节点都要安装perl环境,因为MHA是perl语言写的

[root@manager opt]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

注意:如果你本地没有eprl源,首先安装 epel 源:yum install -y epel-release

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

安装node组件:

[root@master opt]# tar zxvf mha4mysql-node-0.57.tar.gz -C ~
[root@master opt]# cd ~
[root@master ~]# cd mha4mysql-node-0.57/
[root@master mha4mysql-node-0.57]# perl Makefile.PL 
[root@master mha4mysql-node-0.57]# make && make install

另外manager自己还需要安装manager软件:

[root@manager ~]# tar xzvf /opt/mha4mysql-manager-0.57.tar.gz
[root@manager ~]# cd mha4mysql-manager-0.57/
[root@manager mha4mysql-manager-0.57]# perl Makefile.PL 
[root@manager mha4mysql-manager-0.57]# make && make install

manager 安装后在/usr/local/bin 下面会生成几个工具,主要包括:

  • masterha_check_ssh:检查 MHA 的 SSH 配置状况。
  • masterha_check_repl:检查 MySQL 复制状况。
  • masterha_manger:启动 MHA。
  • masterha_check_status:检测当前 MHA 运行状态。
  • masterha_master_monitor:检测 master 是否宕机。
  • masterha_master_switch:控制故障转移(自动或者手动)。
  • masterha_conf_host:添加或删除配置的 server 信息。

node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHA Manager 的脚本触发,无需人为操作)

  • save_binary_logs:保存和复制 master 的二进制日志。
  • apply_diff_relay_logs:识别差异的中继日志事件并将其差异的事件应用于其他的 slave。
  • filter_mysqlbinlog:去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)。
  • purge_relay_logs:清除中继日志(不会阻塞 SQL 线程)

7、配置无密码认证

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

[root@manager ~]# ssh-keygen -t rsa
一路回车即可
[root@manager ~]# ssh-copy-id 192.168.245.204
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.245.204 (192.168.245.204)' can't be established.
ECDSA key fingerprint is SHA256:QCOsA0XD57k2co0SRRBP24vCukCX71mIL+kiueadeFI.
ECDSA key fingerprint is MD5:9c:16:7b:db:88:5f:22:30:d3:5a:3d:a6:8e:ac:5c:e4.
Are you sure you want to continue connecting (yes/no)? yes    //这里输入yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.245.204's password:  //这里输入密码

[root@manager ~]# ssh-copy-id 192.168.245.205
[root@manager ~]# ssh-copy-id 192.168.245.206

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

[root@master ~]# ssh-keygen -t rsa
一路回车即可
[root@master ~]# ssh-copy-id 192.168.245.205
[root@master ~]# ssh-copy-id 192.168.245.206

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

[root@slave1 ~]# ssh-keygen -t rsa
一路回车即可
[root@master mha4mysql-node-0.57]# ssh-copy-id 192.168.245.205
[root@slave1 ~]# ssh-copy-id 192.168.245.204
[root@slave1 ~]# ssh-copy-id 192.168.245.206

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

[root@slave2 ~]# ssh-keygen -t rsa
一路回车即可
[root@slave2 ~]# ssh-copy-id 192.168.245.204
[root@slave2 ~]# ssh-copy-id 192.168.245.205

8、配置MHA

拷贝manager相关命令到/usr/local/bin下(带属性拷贝)
复制“master_ip_failover”脚本到/usr/local/bin 目录,这里使用脚本管理 VIP,也是推荐的一种方式,生产环境不建议使用 Keepalived。

[root@manager mha4mysql-manager-0.57]# cp -ra samples/scripts /usr/local/bin
[root@manager mha4mysql-manager-0.57]# cd /usr/local/bin/scripts/
[root@manager scripts]# cp master_ip_failover master_ip_online_change /usr/local/bin

脚本具体作用:

  • master_ip_failover:自动切换时 VIP 管理的脚本
  • master_ip_online_change:在线切换时 vip 的管理
  • power_manager:故障发生后关闭主机的脚本
  • send_report:因故障切换后发送报警的脚本

修改master_ip_failover配置文件,删除所有,粘贴下面代码进去

[root@manager scripts]# 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.245.200';   //这里改成你同网段的一个未使用的ip作为虚拟ip
my $brdc = '192.168.245.255';   //虚拟ip的广播地址
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key 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;
}
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";
}

注意:这段代码复制到shell里,默认最前面会加上#号,需要把#号去掉,不然就全部注释了
:% s/^#//g //末行模式下修改

修改以下两个地址为自己的地址
my $vip = ‘192.168.245.200’;
my $brdc = ‘192.168.245.255’;

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

[root@manager scripts]# mkdir /etc/masterha
[root@manager scripts]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@manager scripts]# vim /etc/masterha/app1.cnf 
[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
user=mha   <----MySQL 监控用户
password=manager   <----MySQL 监控用户的密码
ping_interval=1     <----ping 包时间间隔	
remote_workdir=/tmp
repl_password=123    <----主从复制用户的密码
repl_user=myslave    <----主从复制用户
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.245.205 -s 192.168.245.206
shutdown_script=""
ssh_user=root   <----SSH 登录用户名


[server1]
hostname=192.168.245.204
port=3306

[server2]
candidate_master=1     <----设置为候选master,如果设置该参数以后,发生主从切换以后 会将此从库提升为主库,即使这个主库不是集群中最新的slave。
hostname=192.168.245.205
check_repl_delay=0      <----MHA 触发切换在选择一个新的master的时候将会忽略复制延时
port=3306

[server3]
hostname=192.168.245.206
port=3306

测试 ssh 无密码认证,如果正常最后会输出 successfully

[root@manager scripts]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Fri Aug 28 02:06:48 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Aug 28 02:06:48 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Aug 28 02:06:48 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Aug 28 02:06:48 2020 - [info] Starting SSH connection tests..
Fri Aug 28 02:07:04 2020 - [debug] 
Fri Aug 28 02:06:48 2020 - [debug]  Connecting via SSH from root@192.168.245.205(192.168.245.205:22) to root@192.168.245.206(192.168.245.206:22)..
Fri Aug 28 02:07:03 2020 - [debug]   ok.
Fri Aug 28 02:07:09 2020 - [debug] 
Fri Aug 28 02:06:48 2020 - [debug]  Connecting via SSH from root@192.168.245.206(192.168.245.206:22) to root@192.168.245.205(192.168.245.205:22)..
Fri Aug 28 02:07:09 2020 - [debug]   ok.
Fri Aug 28 02:07:09 2020 - [info] All SSH connection tests passed successfully.

测试 mysq 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正
常。

[root@manager scripts]# masterha_check_repl -conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK!  

首次配置 MHA 的 VIP 地址需要手动进行配置,在 master上执行如下命令

[root@master mha4mysql-node-0.57]# /sbin/ifconfig ens33:1 192.168.245.200/24
[root@master mha4mysql-node-0.57]# 
[root@master mha4mysql-node-0.57]# 
[root@master mha4mysql-node-0.57]# ifconfig

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.245.200  netmask 255.255.255.0  broadcast 192.168.245.255
        ether 00:0c:29:e8:6c:49  txqueuelen 1000  (Ethernet)

注意:VIP 地址不会因为 manager 节点停止 MHA 服务而消失

9、在manager上启动 MHA

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

关闭MHA:masterha_stop --conf=/etc/masterha/app1.cnf

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

[root@manager scripts]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 monitoring program is now on initialization phase(10:INITIALIZING_MONITOR). Wait for a while and try checking again.
#如果出现这个信息,等一下重新执行就好

[root@manager scripts]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:81233) is running(0:PING_OK), master:192.168.245.204
[root@manager scripts]# cat /var/log/masterha/app1/manager.log  #查看日志信息

10、模拟 master 故障

手动 kill 掉当前的 master

[root@master ~]# pkill -9 mysqld
[1]+  已杀死               /usr/local/mysql/bin/mysqld_safe --user=mysql

观察 MHA 日志,如果自动切换成功,最后会输出 successfully 字样

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

在这里插入图片描述
正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容, 将宕机的 mysql 节点删除。查看 slave1是否接管 VIP

[root@slave1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.245.205  netmask 255.255.255.0  broadcast 192.168.245.255
        inet6 fe80::20c:29ff:fe71:c903  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:71:c9:03  txqueuelen 1000  (Ethernet)
        RX packets 669064  bytes 956666103 (912.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 127216  bytes 12764077 (12.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.245.200  netmask 255.255.255.0  broadcast 192.168.245.255
        ether 00:0c:29:71:c9:03  txqueuelen 1000  (Ethernet)

如果原来的主库修复后,可继续使用如下步骤,使其重新加入群集,并将原来的master作为从库

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf  < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

查看当前主库(slave1)的同步点和日志

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1689 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

启动从库同步并设置为只读

mysql> change master to master_host='192.168.245.205',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1689;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.245.205
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 1689
               Relay_Log_File: master-relay-bin.000002
                Relay_Log_Pos: 284
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

停掉当前主库(slave1)的同步进程,不然下次作为从库同步会报错

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

手动切换
修改/etc/masterha/app1.cnf 文件,将刚刚手动宕机的master库作为主库继续提供服务,注意手动切换 VIP 不会漂移

[root@manager opt]# vim /etc/masterha/app1.cnf 

ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.245.205 -s 192.168.245.206
shutdown_script=""
ssh_user=root
user=mha

[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.245.204
port=3306

[server2]
hostname=192.168.245.205
port=3306

[server3]
hostname=192.168.245.206
port=3306

检查无密码认证和 MySQL 主从状态是否正常

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

启动 MHA

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf  < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

查看当前主库是slave1

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:90895) is running(0:PING_OK), master:192.168.245.205

停止 MHA,因为手动切换不能启动 MHA

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

手动设置当前的主库 slave1为 dead,最后的报错没有影响

[root@manager ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=dead --dead_master_host=192.168.245.205

再次检查主库的状态

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf 
app1 is stopped(2:NOT_RUNNING).

设置原来那台master为 master

需要注释 手动切换脚本/usr/local/bin/scripts/master_ip_online_change 里面的 152 行,不然会报错

[root@manager ~]# vim /usr/local/bin/master_ip_online_change
152       #FIXME_xxx_drop_app_user($orig_master_handler);
[root@manager ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.245.204 --orig_master_is_new_slave

It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.245.205(192.168.245.205:3306)? (YES/no): yes
Starting master switch from 192.168.245.205(192.168.245.205:3306) to 192.168.245.204(192.168.245.204:3306)? (yes/NO): yes
……
Fri Aug 28 17:50:07 2020 - [info]  192.168.245.204: Resetting slave info succeeded.
Fri Aug 28 17:50:07 2020 - [info] Switching master to 192.168.245.204(192.168.245.204:3306) completed successfully.

注意:有两个地方需要交互,全部输入yes即可

至此,MySQL MHA 高可用环境搭建及故障切换完成。

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/108279020