使用 MHA 实现 MySQL 主从复制高可用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MHA(Master High Availability)是由日本一家公司开发的一套 MySQL 高可用性环境下故障切换和主从提升的高可用软件,目前在 MySQL 高可用方面是一个相对成熟的的解决方案。在 MySQL 故障切换过程中,MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

使用 MHA 实现 MySQL 主从复制高可用



一、MHA 概述


1.MHA 的主要功能

2.MHA 的优势

3.MHA 组成部分

4.MHA 工作原理


二、部署 MHA 实现 MySQL 主从复制高可用


1.配置免密登陆

2.安装 MHA 软件包

3.配置主从复制

4.设置 MySQL 程序及 BinLog 程序的软连接

5.在两台 Slave 设置临时只读和不清除中继日志

6.配置 MHA 工作目录及配置文件

7.检查 MHA 的环境是否工作正常

1)检测 SSH 连接是否配置正常

2)在管理节点检查复制配置


三、MHA 的管理


1.启动 Manager

2.检测 Manager 的工作状态

3.在 MHA 环境中配置 VIP

4.开启监控

5.验证故障切换


一、MHA 概述



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


1.MHA 的主要功能


  • 自动故障检测和自动故障转移;
  • 交互式(手动)故障转移;
  • 在线切换 Master 到不同的主机;


2.MHA 的优势


  • 自动故障转移快;
  • 主库崩溃不存在数据一致性问题;
  • 配置不需要对当前 MySQL 环境做重大修改;
  • 不需要添加额外的服务器(仅一台 Manager 就可管理上百台 Replication);
  • 性能优秀,可工作在半同步复制和异步复制;
  • 只要 Replication 支持的存储引擎,MHA 都支持,不会局限于 Innodb;


3.MHA 组成部分


MHA 由 Manager 节点和 Node 节点组成;MHA Manager 可以单独部署在一台独立的机器上管理多个 Master-Slave 集群,也可以部署在一台 Slave 节点上。MHA Node 运行在每台 MySQL 服务器上。


4.MHA 工作原理


image.png


  1. MHA Manager 会定时探测集群中的 Master 节点;
  2. 当 Master 出现故障时,从宕机崩溃的 Master 保存二进制日志事件(BinLog Events);
  3. 识别含有最新更新的 Slave;
  4. 应用差异的中继日志(Relay Log)到其它的 Slave;
  5. 应用从 Master 保存的二进制日志事件(BinLog Events);
  6. 提升一个 Slave 为新的 Master,使其它 Slave 连接新的 Master 进行复制。


二、部署 MHA 实现 MySQL 主从复制高可用



准备工作:


image.png


image.png

  • 如果未安装 MySQL 数据库 需看:MySQL 简介及SQL 语句 来进行安装。(除了 Manager 不需要安装,其他机器都需要安装)
  • 实验所需软件包从这个连接下载:https://pan.baidu.com/s/1c39hxF-beUxu9Cl_OaZSuQ
  • 提取码:whwo


1.配置免密登陆


由于 MHA Manager 通过 SSH 访问所有的 Node 节点,各个 Node 节点也同样通过 SSH 来相互发送不同的 Relay Log 文件,所以要在每一个 Node 和 Manager 上配置 SSH 无密码登陆。


  • 在每个节点上分别生成密钥对。


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


  • 每台节点分别将自己的公钥发送到另外的三台节点。(下面以 master 主机为例)


[root@master ~]# ssh-copy-id 192.168.1.2
[root@master ~]# ssh-copy-id 192.168.1.3
[root@master ~]# ssh-copy-id 192.168.1.4


2.安装 MHA 软件包


准备工作:四台机器都要做


[root@manager ~]# mkdir /root/mha
[root@manager ~]# cd /root/mha
[root@manager mha]# ls
mha4mysql-manager-0.57-0.el7.noarch.rpm  mhapath.tar.gz  mha4mysql-node-0.57-0.el7.noarch.rpm
[root@manager mha]# tar zxf mhapath.tar.gz
[root@manager mha]# cat <<END > /etc/yum.repos.d/CentOS7.repo
[centos]
name=centos7
baseurl=file:///mnt
enabled=1
gpgcheck=0
[mha]
name=mha
baseurl=file:///root/mha/mhapath
enabled=1
gpgcheck=0
END
[root@manager mha]# mount /dev/cdrom /mnt/


image.png


1)在各节点上安装 mha4mysql-node


[root@manager ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager --skip-broken --nogpgcheck
[root@manager ~]# rpm -ivh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm


image.png


2)在管理节点上安装 Manager 服务


[root@manager ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
[root@manager ~]# rpm -ivh /root/mha/mha4mysql-manager-0.57-0.el7.noarch.rpm


image.png


3)Manager 管理工具


在 Manager 节点安装完成后会生成一些管理工具,Manager 的主要管理工具有:


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


3.配置主从复制


1)主服务器上配置


[root@master ~]# cat <<END >> /etc/my.cnf
log-bin=mysql-bin-master
server-id=1
END
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to root@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit


image.png


2)从服务器配置


[root@slave1 ~]# cat <<END >> /etc/my.cnf
log-bin=mysql-slave1      # slave2改为2
server-id=2           # slave2改为3
log_slave_updates=1
END
[root@slave1 ~]# systemctl restart mysqld
[root@slave1 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to root@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit


3)建立主从复制(两台从节点操作一致)


[root@slave1 ~]# mysql -uroot -p123456
mysql> change master to 
master_host='192.168.1.1',
master_user='repl',
master_password='123456';
mysql> start slave;
mysql> show slave status\G;


image.png


4.设置 MySQL 程序及 BinLog 程序的软连接


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


5.在两台 Slave 设置临时只读和不清除中继日志


[root@slave1 ~]# mysql -uroot -p123456 -e 'set global read_only=1'
[root@slave1 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'


image.png


6.配置 MHA 工作目录及配置文件


[root@manager ~]# mkdir -p /etc/masterha
[root@manager ~]# mkdir -p /var/log/masterha/app1
[root@manager ~]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1        # 设置 manager 的工作目录
manager_log=/var/log/masterha/app1/manager.log    # 设置 manager 的日志文件
master_binlog_dir=/usr/local/mysql/data/      # 设置 master 保存 binlog 的位置. 以便 MHA 可以找到 master 的日志
user=root           # 设置监控 mysql 的用户
password=123456         # 设置监控 mysql 用户的密码
ping_interval=1         # 设置监控主库. 发送 ping 包的时间间隔
remote_workdir=/tmp       # 设置远端 mysql 在发生切换时 binlog 的保存位置
repl_user=repl          # 设置 mysql 中用于复制的用户
repl_password=123456      # 设置 mysql 中用于复制的用户密码
ssh_user=root         # 设置 ssh 的登录用户名
[server1]
hostname=192.168.1.1
port=3306
[server2]
hostname=192.168.1.2
port=3306
candidate_master=1        # 设置当前节点为候选的 master
check_repl_delay=0        # 当落后 master 100M 的 relay logs 时. MHA 将不会选择该 slave 作为一个新的 master
[server3]
hostname=192.168.1.3
port=3306


7.检查 MHA 的环境是否工作正常


1)检测 SSH 连接是否配置正常


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


image.png


2)在管理节点检查复制配置


  • 为了让 MHA 正常工作,所有的 Master 和 Slave 必须在配置文件中正确配置。


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


image.png


三、MHA 的管理



MySQL 中主从的工作状态检测及切换是由 Manager 节点来完成的,MHA 安装完成以及检测通过后就可以根据自己的需求开启以及停止 Manager。


1.启动 Manager


Manager 是通过 masterha_manager 命令开启,启动后需要将它放在后台运行。


[root@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 &


image.png


2.检测 Manager 的工作状态


当 MHA Manager 启动监控以后,如果没有异常则不会打印任何信息。我们可通过 masterha_check_status 命令检查 Manager 的状态。


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


image.png


3.在 MHA 环境中配置 VIP


通过 MHA 进行故障转移后,连接 MySQL 数据库的服务并不知道 MySQL 复制环境中进行了故障的转移,同时连 MySQL 的服务也无法知晓主节点是哪一个,此时,可以通过配置 VIP 的方式让所有的应用程序连接 VIP,当 MySQL 故障切换时,VIP 会自动漂移到新的主节点。


1)在 Master 上配置 VIP


[root@master ~]# ifconfig ens33:1 192.168.1.188 netmask 255.255.255.0 up
[root@master ~]# ifconfig ens33:1


image.png


2)修改 MHA 配置文件,使其支持 VIP


[root@manager ~]# vim /etc/masterha/app1.cnf 
在 [server default] 项下面添加:
master_ip_failover_script=/usr/bin/master_ip_failover


3)编写 VIP 自动切换脚本


[root@manager ~]# vim /usr/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.1.188/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
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 \"`;
}
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `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";
}
[root@manager ~]# chmod +x /usr/bin/master_ip_failover            #添加可执行权限


再次检测,结果应该和上面检测结果一样才对


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


image.png


4.开启监控


[root@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 &
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf


image.png


5.验证故障切换


1)关闭 Master 上的数据库


[root@master ~]# systemctl stop mysqld


2)查看 Manager 日志


[root@manager ~]# tail -n10 /var/log/masterha/app1/manager.log


image.png


3)在 192.168.1.2 主机中查看 MHA VIP 是否漂移


[root@slave1 ~]# ifconfig ens33:


image.png



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
69 3
Mysql高可用架构方案
|
28天前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
1月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
120 1
|
22天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
22天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
99 6
|
2月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
65 1
|
2月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
3月前
|
SQL 关系型数据库 MySQL
说一下MySQL主从复制的原理?
【8月更文挑战第24天】说一下MySQL主从复制的原理?
62 0
|
3月前
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
375 0