- MHA集群(MySQL服务高可用集群)
- MHA简介
- MHA工作过程
- 拓扑结构
- 部署MHA集群
- 集群环境准备
- 1.安装依赖包
- 2.配置ssh密钥对认证登录
- 3.配置一主多从同步结构
- 配置管理节点(192.168.4.57)
- 1.安装软件包
- 2.相关命令
- 3.编写主配置文件
- 4.修改故障切换脚本,指定VIP地址
- 配置数据节点(数据库服务器51、52、53)
- 1.把VIP地址192.168.4.100 配置在主服务器192.168.4.51上,并在所有数据节点安装mha_node包
- 2.添加授权用户(主服务51)
- 3.在52和53添加同步数据的连接用户
- 4.在从库上启用binlog日志文件
- 5.在所有数据库服务器设置禁止自动删除本机的中继日志文件
- 6.在所有数据库服务器启用半同步复制模式
- 7.重启所有数据库的MySQL服务,并查看主从同步是否正常
- 验证配置
- 1.验证ssh配置
- 2.验证MySQL主从同步配置
- 3.启动管理服务
- 测试集群的高可用功能
- 1.在主服务器添加访问数据的连接用户
- 2.在客户端连接VIP地址访问数据
- 3.模拟主服务器故障
- 4.恢复故障服务器
MHA(Maste High Availability)
- 由日本DeNA公司youshimaton开发
- 是一套优秀的实现MySQL高可用的解决方案
- 数据库的自动故障切换操作能做到在0~30秒之内完成
- MHA能确保在故障切换过程中最大限度保证数据的一致性,以达到真正意义的高可用
MHA组成
- MHA Manager(管理节点)
- 管理所有数据库服务器
- 可以单独部署在一台独立的机器上
- 也可以部署在某台数据库服务器上
- MHA Node(数据节点)
- 存储数据的MySQL服务器
- 运行咋每台MySQL服务器上
具体如下
- 由manager 定时探测集群中的master节点
- 当master故障时,manager自动将拥有最新数据的slave提升为新的master
ip规划
| IP地址 | 主从同步角色 | 集群角色 | 主机名 |
|---|---|---|---|
| 192.168.4.3 | 客户端 | 无 | mysql |
| 192.168.4.51 | 主库 | 当前主库 | sql1 |
| 192.168.4.52 | 从库 | 备用主库 | sql2 |
| 192.168.4.53 | 从库 | 备用主库 | sql3 |
| 192.168.4.57 | 无 | 管理主机 | mgm57 |
| 192.168.4.100 | 无 | VIP地址 | 无 |
拓扑图:
VIP地址再那一台服务器上客户端就访问到哪一个数据库服务器
部署MHA集群 集群环境准备本次实验所使用的环境为centos7.9,mysql5.7.35,mha0.58
1.安装依赖包因为MHA这个软件使用perl语言编写的,所以需要perl环境
#在所有主机上安装系统自带的perl软件包 yum -y install perl-* #接下来安装系统没有的依赖包 yum -y install epel-release perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Email-Date-Format perl-Mail-Sender perl-Mail-Sendmail perl-MIME-Types perl-MIME-Lite #最好把这个命令执行两遍,因为其中的一些包,需要在安装了某些包之后才能安装2.配置ssh密钥对认证登录
- 管理主机可以无密码连接所有数据库服务器
- 数据库服务器彼此之间无密码连接
#先配置57管理主机的密钥对 #192.168.4.57(管理主机) ssh-keygen #使用最简单的无密码公钥,三下回车选择默认 ssh-copy-id root@192.168.4.51 ssh-copy-id root@192.168.4.52 ssh-copy-id root@192.168.4.53
测试57管理无密码登录
#数据库服务器彼此之间无密码连接 #192.168.4.51 ssh-keygen ssh-copy-id root@192.168.4.52 ssh-copy-id root@192.168.4.53 #192.168.4.52 ssh-keygen ssh-copy-id root@192.168.4.51 ssh-copy-id root@192.168.4.53 #192.168.4.53 ssh-keygen ssh-copy-id root@192.168.4.51 ssh-copy-id root@192.168.4.52
测试
配置主库51
vim /etc/my.cnf [mysqld] server_id=51 log-bin=master51 systemctl restart mysqld mysql -uroot -p123456 grant replication slave on *.* to repluser@"%" identified by "123456"; show master status;
配置从库52、53
#192.168.4.52 vim /etc/my.cnf [mysqld] server_id=52 systemctl restart mysqld mysql -uroot -p123456 change master to master_host="192.168.4.51", master_user="repluser", master_password="123456", master_log_file="master51.000002", master_log_pos=441; start slave; show slave status G; #192.168.4.53 vim /etc/my.cnf [mysqld] server_id=53 systemctl restart mysqld mysql -uroot -p123456 change master to master_host="192.168.4.51", master_user="repluser", master_password="123456", master_log_file="master51.000002", master_log_pos=441; start slave; show slave status G;
安装包下载地址:
mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
这里也准备了资源,大家可以去下载:mha4mysql
#192.168.4.57 yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm # node 必须先安装,manager的安装必须有node环境 tar -zxvf mha4mysql-manager-0.58.tar.gz #为了演示多种安装方法,这里直接使用解压缩,解开提前打包好的程序,也可以使用yum去安装 #因为这个软件使用perl编写所以和一些软件的安装有些许不同 cd mha4mysql-manager-0.58 perl Makefile.PL #Makefile.PL 是这个软件的配置,检测你当前的依赖是否完整 #运行之后,如果这些依赖后面没有版本号,说明该依赖未安装 make make install #这个软件会提供masterha_这个命令
如果是依赖没有安装导致的报错,删掉这个目录,安装依赖之后重新解压就行
管理集群命令
| 命令 | 作用 |
|---|---|
| masterha_check_ssh | 检查MHA的SSH配置情况 |
| masterha_check_repl | 检查MySQL复制情况 |
| masterha_manager | 启动MHA |
| masterha_check_status | 检测MHA运行状态 |
| masterha_stop | 停止MHA |
- 模板文件
- mha4mysql-manager-0.58/samples/conf/app1.cnf
#因为这个软件不是rpm安装,所以剩下的配置(如工作目录)需要我们自己去配置 mkdir /etc/mha cp /root/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/mha vim /etc/mha/app1.cnf [server default] #管理服务的配置 manager_workdir=/etc/mha #服务的工作目录 manager_log=/etc/mha/manager.log #服务运行之后的日志 master_ip_failover_script=/etc/mha/master_ip_failover #故障切换脚本 ssh_user=root #访问ssh服务的用户 ssh_port=22 #目标ssh服务端口 repl_user=repluser #主服务器数据同步授权用户 repl_password=123456 #密码 user=root #监控用户,管理节点使用root监控数据库服务器 password=123456 #密码 [server1] hostname=192.168.4.51 #port=3306 如果数据库服务器的端口不是3306就需要单独指出来,如果是3306就可以不用写 candidate_master=1 #51参与主服务的竞选 [server2] hostname=192.168.4.52 candidate_master=1 [server3] hostname=192.168.4.53 candidate_master=14.修改故障切换脚本,指定VIP地址
- 模板文件
- mha4mysql-manager-0.58/samples/scripts/master_ip_failover
cp /root/mha4mysql-manager-0.58/samples/scripts/master_ip_failover /etc/mha #如果没有x权限,请加上x权限 vim /etc/mha/master_ip_failover .... my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port, $new_master_user, $new_master_password ); #下面这四行需要我们去添加 #位置在35行左右 my $vip='192.168.4.100/24'; #使用的VIP虚拟地址 my $key="1"; #给key变量赋值为1 my $ssh_start_vip ="/usr/sbin/ifconfig ens33:$key $vip"; #定义一个变量名为ssh_start_vip,执行本机sbin/ifconfig ens33这个命令 #当我们执行这个命令时,把这个VIP部署在ens33这张网卡上 my $ssh_stop_vip ="/usr/sbin/ifconfig ens33:$key down"; #这个命令作用与ssh_start_vip作用相反,当主服务器发生故障,使用这个把主服务器的VIP停止配置数据节点(数据库服务器51、52、53) 1.把VIP地址192.168.4.100 配置在主服务器192.168.4.51上,并在所有数据节点安装mha_node包
ifconfig ens33:1 192.168.4.100/24 ifconfig ens33:1 #192.168.4.51 yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm #192.168.4.52 yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm #192.168.4.53 yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm2.添加授权用户(主服务51)
在管理节点的配置文件中提到管理节点使用root监控服务器,这里我们授权这个远程root,root默认只能在本机登录
#192.168.4.51 mysql -uroot -p123456 -e 'grant all on *.* to root@"%" identified by "123456"' #监控用户 #因为现在是主从结构,在主库添加即可,其他从库会自动同步3.在52和53添加同步数据的连接用户
51如果发生故障,52提升为主库,这时就要52有同步数据的能力,这时给他添加同步数据的连接用户,53同理
#192.168.4.52 mysql -uroot -p123456 -e 'grant replication slave on *.* to repluser@"%" identified by "123456" ' #192.168.4.53 mysql -uroot -p123456 -e 'grant replication slave on *.* to repluser@"%" identified by "123456" ' #这里的用户和密码必须与管理主机的配置文件中书写的一致4.在从库上启用binlog日志文件
在52、53启用binlog
5.在所有数据库服务器设置禁止自动删除本机的中继日志文件默认保留最新的两个中继日志
6.在所有数据库服务器启用半同步复制模式详细的半同步复制模式的配置请看MySQL的同步模式
#192.168.4.51 vim /etc/my.cnf [mysqld] plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 #启用半同步复制模式 relay_log_purge=0 #禁止自动删除本机的中继日志文件 #192.168.4.52 vim /etc/my.cnf [mysqld] server_id=52 log-bin=master52 plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 relay_log_purge=0 #192.168.4.53 vim /etc/my.cnf [mysqld] server_id=52 log-bin=master53 plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 relay_log_purge=07.重启所有数据库的MySQL服务,并查看主从同步是否正常
systemctl restart mysqld mysql -uroot -p123456 -e 'show slave status G'
以下验证都在管理节点验证
1.验证ssh配置masterha_check_ssh --conf=/etc/mha/app1.cnf #指定配置文件位置,当验证全为ok说明ssh配置没有问题,如果出现问题,请检查自己的ssh配置2.验证MySQL主从同步配置
masterha_check_repl --conf=/etc/mha/app1.cnf
这里题主就出现了一个问题,
[error][/root/perl5/lib/perl5/MHA/ServerManager.pm, ln492] Server 192.168.4.52(192.168.4.52:3306) is dead, but must be alive! Check server settings.
经过检查,这里出现问题的原因是数据库的防火墙没有关
再次测试
Failed to get master_ip_failover_script status with return code 255:0.
这次的问题,是由于脚本中信息的冲突
解决方案
屏蔽掉冲突信息
信息大概在97行 vim /etc/mha/master_ip_failover ... # FIXME_xxx;
再次测试
出现MySQL Replication Health is OK,说明我们的配置没有错误
接下来介绍以下这几个参数
Dead Servers: #死亡服务器,本次检测没有 Alive Servers: #活跃的服务器有哪些 Alive Slaves: #活跃的从服务器3.启动管理服务
在启动服务之前先查看VIP是否部署成功部署成功才能进行下述操作
#192.168.4.51 ifconfig ens33:1 #192.168.4.57(管理节点) masterha_check_status --conf /etc/mha/app1.cnf #查看状态 masterha_manager --conf /etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover # --remove_dead_master_conf 删除宕机主库的配置 # --ignore_last_failover 任何时间出现错误都会进行切换
再开启一个终端,在再次查看状态
这次可以看出我们已经成功启动,监控主机为192.168.4.51.
测试集群的高可用功能 1.在主服务器添加访问数据的连接用户#192.168.4.51 mysql -uroot -p123456 create database testdb; create table testdb.id(id int); grant select,insert on testdb.* to tom@"%" identified by "123456"; #在两台从服务器查看是否添加成功 mysql -uroot -p123456 -e "select user,host from mysql.user"
mysql -utom -p123456 -h 192.168.4.100 select * from testdb.id; insert into testdb.id values(10); select * from testdb.id;3.模拟主服务器故障
模拟故障的方法
- 停止mysql服务
- 关机
#192.168.5.51 systemctl stop mysqld
当我们把主服务器关掉以后,管理节点连接不到主服务器的3306端口,就会判定主服务发生故障,把51的服务停止,触发故障切换脚本,这个脚本把VIP地址重新部署到新选举的主服务器上
这时候在我们管理节点的日志信息就会发生变化
执行完成以后就会跳出,这时,他的服务会自动停止
#查看51的VIP ifconfig ens33:1 #在剩余的两台服务器中查看VIP在谁那,谁就是新的主 ifconfig ens33:1 #在53上查看是否切换成功 mysql -uroot -p123456 -e "show slave status G"
由图可以看出VIP漂移成功,和切换故障数据库成功
客户端经过短暂延迟之后重新恢复数据访问
#首先恢复故障数据库的服务 #192.168.4.51 systemctl start mysqld #然后把51配置为主服务器的从库 #在配置之前,首先要进行数据库数据的恢复,防止在故障期间,有新收据的写入 mysql -uroot -p123456 change master to master_host="192.168.4.52", master_user="repluser", master_password="123456", master_log_file="master52.000004", master_log_pos=154; start slave; show slave status G;
接下来在管理节点57重新把51添加进去
#先停止服务 masterha_stop --conf=/etc/mha/app1.cnf vim /etc/mha/app1.cnf [server default] manager_log=/etc/mha/manager.log manager_workdir=/etc/mha master_ip_failover_script=/etc/mha/master_ip_failover password=123456 repl_password=123456 repl_user=repluser ssh_port=22 ssh_user=root user=root [server2] candidate_master=1 hostname=192.168.4.52 [server3] candidate_master=1 hostname=192.168.4.53 [server1] candidate_master=1 hostname=192.168.4.51 #重新测试并启动 masterha_manager --conf /etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
没有报错就说明恢复的没有问题



