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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
11月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
826 3
Mysql高可用架构方案
|
12月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
370 1
|
8月前
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
210 40
|
8月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
420 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
8月前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
8月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
715 11
|
10月前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
224 24
|
10月前
|
NoSQL 关系型数据库 Redis
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
256 14
|
12月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
1182 1
MySQL主从复制原理和使用
|
12月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
373 0
Mysql中搭建主从复制原理和配置

推荐镜像

更多