MySQL 高可用

一:案例概述

      目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA 的出现就是解决 MySQL 单点的问题。另外随着企业数据量越来越庞大,数据库的压力又成为企业的另一个瓶颈,MySQL 多主多从架构的出现可以减轻 MySQL 本身的压力。本章将主要围绕 “MySQL 主主复制 + Keepalived+HAProxy” 这一经典高可用架构展开,通过理论结合实践,解析如何通过开源工具实现数据库的故障自动转移、负载均衡和读写分离。

1.案例前置知识点

1.1什么是MySQL 高可用

      MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现 “零停机、零数据丢失” 的业务连续性。

1.2方案组成

MySQL 主主复制 + Keepalived + HAProxy 的高可用方案由三部分组成:

  • MySQL 主主复制:两台 MySQL 实例互为主从,双向同步数据,均支持读写操作,提供冗余和扩展能力。
  • Keepalived:通过 VRRP 协议管理虚拟 IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。
  • HAProxy:作为反向代理和负载均衡器,将流量分发至 MySQL 节点,支持健康检查、读写分离(可选)和故障节点自动剔除。

1.3优势

高可用性:Keepalived 实现秒级故障切换,HAProxy 健康检查确保流量仅路由到正常节点,避免单点故障。
读写扩展:主主架构支持双节点并发写入,提升写入性能;HAProxy 可配置读写分离,利用备节点分担读压力。
灵活扩展:可横向扩展 HAProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。
运维友好:基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。

2.案例环境

2.1本案例环境

主机 操作系统 IP 地址 应用
Master1 openEuler 24.03 192.168.10.101 Mysql8
Master2 openEuler 24.03 192.168.10.102 Mysql8
Keepalived1 openEuler 24.03 192.168.10.103 Keepalived、haproxy
Keepalived2 openEuler 24.03 192.168.10.104 Keepalived、haproxy

2.2案例需求

本案例要求通过 MHA 监控 MySQL 数据库在故障时进行自动切换,不影响业务。

2.3案例实现思路

(1)安装 MySQL 数据库;
(2)配置 MySQL 互为主从;
(3)安装 haproxy 软件并配置复制均衡;
(4)安装 keepalived 软件并配置故障转移;
(5)模拟 master 故障切换

二:案例实施

1.安装MySQL

前几章笔记有安装MySQL,在这不演示了。

2.配置MySQL双主复制

(1)在MASTER1 /etc/my.cnf 中修改或增加下面内容

vim /etc/my.cnf
server-id=1
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
log-slave-updates=1

(2)在MASTER2 /etc/my.cnf 中修改或增加下面内容

vim /etc/my.cnf
server-id=2
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
log-slave-updates=1

(3)重启MySQL服务(MASTER1,2 都执行)

service mysqld restart

(4)登录MySQL服务,给服务器授权(MASTER1,2 都执行)

mysql -uroot -ppwd123
create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password '123456';
flush privileges;
show master status;

(5)登录MySQL,配置同步。(MASTER1,2 都执行)

按服务器结果更改下面命令中master_log和maser_log_pos参数

change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1147;
start slave;
show slave status\G;

查看slave状态,确保以下两个值为YES

3.安装haproxy

     HAProxy 是一个开源的高性能负载均衡器和代理工具,支持 TCP/HTTP 应用的流量分发,具备健康检查、SSL 终止、会话保持等功能,广泛应用于 Web 服务器集群、数据库读写分离及 API 网关场景,以高效稳定的特性提升系统可用性和扩展能力。

(1) 关闭 SELinux 和防火墙

[root@localhost ~]# sed -i's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld

(2) 安装 haproxy

[root@localhost ~]# dnf install haproxy

(3) 编辑 haproxy 配置文件

vim /etc/haproxy/haproxy.cfg
defults
   mode        tcp
   option      tcplog  #修改第一个


#frontend......后全部删掉

#添加:
listen mysql
bind 0.0.0.0:3306
balance leastconn
server mysql1 192.168.101:3306 check port 3306 maxconn 300
server mysql2 192.168.102:3306 check port 3306 maxconn 300

注释

  • mode tcp:表示 tcp 代理
  • listen mysql 0.0.0.0:3306 表示创建一个名为 mysql 的监听服务
  • bind 0.0.0.0:3306 绑定到所有网卡的 3306 端口(MySQL 默认端口),作为流量入口。
  • balance leastconn 指定使用最少连接数算法分配请求,将新连接导向当前活跃连接最少的后端服务器,避免单点过载
  • Server 声明两个 MySQL 服务器节点 mysql1 和 mysql2,分别指向 192.168.10.101:3306 和 192.168.10.102:3306。
  • check port 3306 表示通过检查节点的 3306 端口是否响应,判断其存活状态
  • maxconn 300 限制每个后端节点的最大并发连接数为 300,防止节点被压垮

(4) 检测配置文件,并启动服务

[root@localhost ~]# haproxy -c -f /etc/haproxy/haproxy.cfg
[root@localhost ~]# systemctl restart haproxy

(5) 测试

使用测试用户 test,访问 haproxy 的代理端口登录 mysql

101主机:

create user 'test'@'%' identified by 'pwd123';
grant replication slave on *.* to 'test'@'%';
alter user 'test'@'%' identified with mysql_native_password by 'pwd123';
flush privileges;
show master status;

105客户端主机:

dnf -y install mariadb
mysql -utest -ppwd123 -h192.168.10.103(192.168.10.104) -p3306

4.安装keepalived

      Keepalived 是一个用于实现系统高可用性和负载均衡的工具,通过 VRRP(Virtual Router Redundancy Protocol)等协议管理虚拟 IP 地址,持续监测服务器健康状态,当主节点故障时自动将流量切换至备用节点,确保服务不中断,常用于数据库、Web 服务等集群环境,提升系统可靠性并简化故障恢复流程。

该阶段操作在 Keepalived1、Keepalived2 都要执行

(1) 关闭 SELinux 和防火墙

[root@localhost ~]# sed -i's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld

(2) 安装 keepalived

[root@localhost ~]# dnf install keepalived

(3)编辑haproxy配置文件

cp /etc/keepalived/keepalived.conf.sample
/etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
router_id  LVS_1 / 2
#vrrp_strict
vrrp_script chk_haproxy {
	script "/etc/keepalived/chk.sh"
	interval 2
}

vrrp_instance VI_1 {

state MASTER / BACKUP    # 都为BACKUP下面加一行:nopreempt 
interface ens33
priority 100 / 90

}
virtule_ipaddress{
192.168.10.100
}
	track_script {
		chk_haproxy
	}

#virule server .....后删掉
systemctl restart keepalived
systemctl restart haproxy

添加监控脚本并启动keepalived

vim /etc/keepalived/chk.sh

#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
		/etc/init.d/keepalived stop
fi

chmod +x /etc/keepalived/chk.sh
systemctl restart keepalived

(4)编测试使用VIP连接MySQL

mysql -utest -ppwd123 -h192.168.10.100 -p3306
show databases;

5. 测试故障转移

  1. 关闭 master1 主机,测试使用 vip 能否正常访问 mysql 数据库
    关闭 master1 后,因为 master1、master2 通过 haproxy 负载均衡,master1 关闭后,haproxy 检测其状态异常,会从负载中移除,不进行流量转发,依然可以通过 vip 访问 mysql,实现 mysql 的高可用
mysql -utest -ppwd123 -h192.168.10.100
ip a

你可能感兴趣的:(mysql,数据库)