文章目录
- 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集群(MySQL服务高可用集群)
MHA简介
MHA(Maste High Availability)
- 由日本DeNA公司youshimaton开发
- 是一套优秀的实现MySQL高可用的解决方案
- 数据库的自动故障切换操作能做到在0~30秒之内完成
- MHA能确保在故障切换过程中最大限度保证数据的一致性,以达到真正意义的高可用
MHA组成
- MHA Manager(管理节点)
- 管理所有数据库服务器
- 可以单独部署在一台独立的机器上
- 也可以部署在某台数据库服务器上
- MHA Node(数据节点)
- 存储数据的MySQL服务器
- 运行咋每台MySQL服务器上
MHA工作过程
具体如下
- 由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
测试
3.配置一主多从同步结构
配置主库51
vim /etc/myf
[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/myf
[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/myf
[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;
配置管理节点(192.168.4.57)
1.安装软件包
安装包下载地址:
mha官网:https://code.google/archive/p/mysql-master-ha/
github下载地址
https://github/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github/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_这个命令
如果是依赖没有安装导致的报错,删掉这个目录,安装依赖之后重新解压就行
2.相关命令
管理集群命令
命令 | 作用 |
---|---|
masterha_check_ssh | 检查MHA的SSH配置情况 |
masterha_check_repl | 检查MySQL复制情况 |
masterha_manager | 启动MHA |
masterha_check_status | 检测MHA运行状态 |
masterha_stop | 停止MHA |
3.编写主配置文件
- 模板文件
- mha4mysql-manager-0.58/samples/conf/app1f
#因为这个软件不是rpm安装,所以剩下的配置(如工作目录)需要我们自己去配置
mkdir /etc/mha
cp /root/mha4mysql-manager-0.58/samples/conf/app1f /etc/mha
vim /etc/mha/app1f
[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=1
4.修改故障切换脚本,指定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.rpm
2.添加授权用户(主服务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/myf
[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/myf
[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/myf
[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=0
7.重启所有数据库的MySQL服务,并查看主从同步是否正常
systemctl restart mysqld
mysql -uroot -p123456 -e 'show slave status \G'
验证配置
以下验证都在管理节点验证
1.验证ssh配置
masterha_check_ssh --conf=/etc/mha/app1f
#指定配置文件位置,当验证全为ok说明ssh配置没有问题,如果出现问题,请检查自己的ssh配置
2.验证MySQL主从同步配置
masterha_check_repl --conf=/etc/mha/app1f
这里题主就出现了一个问题,
[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/app1f #查看状态
masterha_manager --conf /etc/mha/app1f --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"
2.在客户端连接VIP地址访问数据
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漂移成功,和切换故障数据库成功
客户端经过短暂延迟之后重新恢复数据访问
4.恢复故障服务器
#首先恢复故障数据库的服务
#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/app1f
vim /etc/mha/app1f
[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/app1f --remove_dead_master_conf --ignore_last_failover
没有报错就说明恢复的没有问题
更多推荐
MySQL之MHA集群的详细教程
发布评论