MySQL之MHA集群的详细教程

编程知识 行业动态 更新时间:2024-06-13 00:21:43

文章目录

  • 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.100VIP地址

拓扑图:

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集群的详细教程

本文发布于:2023-04-01 02:34:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/8897a422206e6178e71eb293a6ca1414.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:集群   教程   详细   MySQL   MHA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!