MHA高可用MySQL高可用集群
一、MHA的介绍
-
MHA是一款用于解决数据库MySQL高可用性环境下故障切换和主从提升的高可用软件。能够很好的解决单master主数据库单点故障点的问题。
-
在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中, MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
-
MHA能够在0.5-2秒内实现切换,0.5-2秒的写阻塞通常是可接受的,所以你甚至能在非维护期间就在线切换master。诸如升级到高版本,升级到更快的服务器之类的工作,将会变得更容易。
-
MHA由Manager节点和Node节点组成。
二、实验介绍
1、实验环境
服务器 | 操作系统 | IP地址 |
---|---|---|
MHA manger节点 | Linux 7.6 (64位) | 192.168.10.161/24 |
master 主节点 | Linux 7.6 (64位) | 192.168.10.100/24 |
mater slave主备节点 | Linux 7.6 (64位) | 192.168.10.156/24 |
slave 从节点 | Linux 7.6 (64位) | 192.168.10.160/24 |
- 实验规划图
2、实验目的
本案例要求通过 MHA 监控 MySQL 数据库在master故障时进行自动切换到master salve,不影响业务。
3、实验配置过程
- 配置 MySQL 一主两从
- 安装 MHA 软件
- 配置无密码认证
- 配置 MySQL MHA 高可用
- 模拟 master 故障切换
注: 所有服务器关闭selinux和防火墙。
三、实例配置MySQL(MHA)高可用过程
1、配置MySQL一主两从
- 为三台数据库服务器安装MySQL7.6
- 修改数据库的配置文件/etc/my.cnf,开启日志服务
1)修改master配置文件
[root@Mysql1 ~]# vim /etc/my.cnf
[mysqld]
server-id = 1 //数据库的身份id,不同的数据库身份id不能一样
log_bin = master-bin //开启数据库二进制文件
log-slave-updates = true //允许别的从服务器和自己同步
2)修该slave配置文件
除了两台slave数据库的server-id直段不一样,其他修改的添加的字段一样
[root@Mysql2 ~]# vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin //开启中继日志,同来同步数据库的二级制文件
relay-log-index = slave-relay-bin.index //开启中继日志索引
3)重启所有数据库
[root@Mysql1 ~]# systemctl restart mysqld
4)为数据库服务器建立软连接
使liunx系统识别mysql的操作命令。
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
5)为数据库服务器开启主从复制和MHA服务账户授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123';
//为主从复制账户授权
mysql> grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';
//为MHA账户授权
mysql> flush privileges; //刷新授权
6)查看master数据库主从复制的,二进制文件名和同步复制的pos点
mysql> show master status;
+-------------------+----------+
| File | Position |//从服务器要同步的二进制文件名和同步的pos点
+-------------------+----------+
| master-bin.000001 | 155|
+-------------------+----------+
7)在slave数据库中同步master数据库
mysql> change master to master_host='192.168.10.100',master_user='myslave',
> master_password='123',master_log_file='master-bin.000001',
> master_log_pos=155; //同步主数据库
mysql> start slave; //开启主从复制
mysql> set global read_only=1; //设置从数据库为只读
8)查看slave数据库的 IO 和 SQL 线程是否都是 yes 代表同步是否正常。no 表示不正常。
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes //都为yes表示同步正常
9)验证主从复制是否成功。
在主服务器上创建一个表或者库,在从服务器上查看是否有在主服务器上创建的表或者库
2、安装 MHA 软件
1)MHA依赖环境包安装
- 每个节点上都要安装MHA依赖环境包
- 虚拟机的yum仓库一定要有线网源,可以上网,因为yum安装的环境包都时需要到线网中下载。
[root@MHA-manager ~]# yum install epel-release --nogpgcheck -y //以不检查签名信息的方式安装epel源
[root@MHA-manager ~]#yum install -y perl-DBD-MySQL \ //连接数据库的驱动
perl-Config-Tiny \ //配置信息
perl-Log-Dispatch \ //日志信息
perl-Parallel-ForkManager \ //多线程管理
perl-ExtUtils-CBuilder \ //单元构建
perl-ExtUtils-MakeMaker \ //编译进程
perl-CPAN //包管理进程
2)node节点安装
MHA 软件包对于每个操作系统版本不一样,这里 CentOS7.0以上必须选择 0.57 版本,CentOs6.0以上使用必须使用0.56版本。需要注意的是所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 管理服务器依赖 node 组件。
- node的下载网址https://nodejs.org/en/download/
将下载的node包上传到各个节点。
- 编译安装node组件
[root@Mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz //解压node安装包
[root@Mysql1 ~]# cd mha4mysql-node-0.57 //进入到解压目录
[root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL //使用perl 编译文件
[root@Mysql1 mha4mysql-node-0.57]# make && make install //编译安装node
注: node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要包括:
脚本名 | 用法介绍 |
---|---|
save_binary_logs | 保存和复制 master 的二进制日志 |
-apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的 slave |
filter_mysqlbinlog | 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具) |
-purge_relay_logs | 清除中继日志(不会阻塞 SQL 线程) |
3)MHA-manager安装
在 MHA-manager 上安装 manager 组件(!注意:一定要先安装node 组件才能安装manager 组件)
- MHA-manager 5.6的下载地址
https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads - MHA-manager 5.7的下载地址需要翻墙才能下载到,这里是以下好的提取地址
链接: https://pan.baidu.com/s/18H12bTIYHi2H0dXs2DI7NA 提取码: mwkq
[root@MHA-manager ~]# tar zxvf mha4MHA-manager-0.57.tar.gz
[root@MHA-manager ~]# cd mha4MHA-manager-0.57
[root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL
[root@MHA-manager mha4MHA-manager-0.57]# make && 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 |
4、配置无密码认证
1) 在 manager 上配置到所有数据库节点的无密码认证
[root@MHA-manager ~]# ssh-keygen -t rsa //一路按回车键
[root@MHA-manager ~]# ssh-copy-id 192.168.10.100
[root@MHA-manager ~]# ssh-copy-id 192.168.10.156
[root@MHA-manager ~]# ssh-copy-id 192.168.10.160
2)在master上配置到数据库节点slave的无密码认证
[root@Mysql1 ~]# ssh-keygen -t rsa
[root@Mysql1 ~]# ssh-copy-id 192.168.10.156
[root@Mysql1 ~]# ssh-copy-id 192.168.10.160
3)在 master-slave 上配置到数据库节点slave和master的无密码认证
[root@Mysql2 ~]# ssh-keygen -t rsa
[root@Mysql2 ~]# ssh-copy-id 192.168.10.100
[root@Mysql2 ~]# ssh-copy-id 192.168.10.160
4) 在slave 上配置到数据库节点master-slave和master的无密码认证
[root@Mysql3 ~]# ssh-keygen -t rsa
[root@Mysql3 ~]# ssh-copy-id 192.168.10.100
[root@Mysql3 ~]# ssh-copy-id 192.168.10.156
5、 配置 MySQL MHA 高可用
1)配置MHA自动切换vip脚本
[root@MHA-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//将vip控制脚本复制到指定目录下
- 控制自动切换vip的脚本模板
脚本名 | 用法介绍 |
---|---|
master_ip_failover | 自动切换时 vip 管理的脚本 |
master_ip_online_change | 在线切换时 vip 的管理 |
power_manager | 故障发生后关闭主机的脚本 |
1360 5 月 31 2015 send_report | 因故障切换后发送报警的脚本 |
- 复制上述的自动切换时 vip 管理的脚本到/usr/local/bin 目录,使用脚本管理 vip
[root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin - 添加内容部分
[root@localhost 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.10.200'; //vip的地址
my $brdc = '192.168.10.255'; //vip的网络号,也表示结束地址
my $ifdev = 'ens33'; //网卡名称
my $key = '1'; //逻辑子接口
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; //启动vip
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; //关闭vip
my $exit_code = 0; //状态的返回值,正常关闭返回0
······ //省略部分信息
2)配置MHA的配置文件
创建 MHA 软件目录并拷贝配置文件。
[root@MHA-manager ~]# mkdir /etc/masterha #创建软件目录
[root@MHA-manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ #复制模板到软件目录
[root@MHA-manager ~]# vim /etc/masterha/app1.cnf #编辑配置文件
[server default]
manager_workdir=/var/log/masterha/app1.log ##manager工作目录
manager_log=/var/log/masterha/app1/manager.log #manager日志
master_binlog_dir=/usr/local/mysql/data/ #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便mha能找到
#master_ip_failover_script= /usr/local/bin/master_ip_failover #设置自动failover时候的切换脚本,也就是上边编辑的自动切换vip脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change #设置手动切换时候的切换脚本
password=manager #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
user=mha #设置监控用户root
ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
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.10.100 -s 192.168.10.156
shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机,这里没有使用)
ssh_user=root #设置ssh的登录用户名
[server1]
hostname=192.168.10.100
port=3306
[server2]
hostname=192.168.10.156
port=3306
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
[server3]
hostname=192.168.10.161
port=3306
6、MHA测试免密交互、和主从同步
1)测试 ssh 无密码认证,如果正常最后会输出 successfully
[root@localhost local]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Sun Oct 25 13:59:20 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Oct 25 13:59:20 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
······//省略部分信息
Sun Oct 25 13:59:26 2020 - [info] All SSH connection tests passed successfully.
2)检查mysql主从复制,如过正常最后回输出 OK
[root@localhost ]# masterha_check_repl -conf=/etc/masterha/app1.cnf
Sun Oct 25 15:16:47 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Oct 25 15:16:47 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
·······//省略部分信息
MySQL Replication Health is OK.
7、模拟 master 故障切换
1)需要到master数据库上手动开启虚拟ip
[root@Mysql1 ~]# /sbin/ifconfig ens33:1 192.168.10.200/24
2)启动MHA
[root@MHA-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 &
--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,
默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,
为了方便,这里设置--ignore_last_failover。
-- manger_log 日志存放位置。
3)查看当前master状态
[root@mysql3 local]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:22244) is running(0:PING_OK), master:192.168.10.100
4)将master数据库关闭
- 在master数据库上查看vip是否启动
[root@mysql1 ~]# ifconfig //查看vip是否开启
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.100 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::e6f1:c815:f9f7:fa2d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5a:1e:11 txqueuelen 1000 (Ethernet)
RX packets 605653 bytes 890376090 (849.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 108259 bytes 7264193 (6.9 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.10.200 netmask 255.255.255.0 broadcast 192.168.10.255
ether 00:0c:29:5a:1e:11 txqueuelen 1000 (Ethernet)
[root@mysql1 ~]# systemctl stop mysqld 或 pkill -9 mysql //关闭数据库
5)查看master地址是否改变
[root@mysql3 local]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:23153) is running(0:PING_OK), master:192.168.10.156
//模拟故障成功master地址由100变为了156
切换备选主库的算法:
1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
2.数据一致的情况下,按照配置文件顺序,选择备选主库。
3.设定有权重(candidate_master=1),按照权重强制指定备选主。
1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
8、修复故障数据库
1)启动故障数据库
[root@mysql1 ~]# systemctl start mysqld
2)修复故障数据库主从同步
mysql> change master to master_host=‘192.168.10.156’,master_user=‘myslave’,
> master_password=‘123’,master_log_file=‘master-bin.000004’,
> master_log_pos=154;
>start slave;
3)修改MHA服务器配置文件(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
[root@localhost ]# vi /etc/masterha/app1.cnf
[server1]
hostname=192.168.195.129
port=3306
4)重启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 &