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 地址应用
Master1openEuler 24.03192.168.10.101Mysql8
Master2openEuler 24.03192.168.10.102Mysql8
Keepalived1openEuler 24.03192.168.10.103Keepalived、haproxy
Keepalived2openEuler 24.03192.168.10.104Keepalived、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值