MySQL高可用

目录

一、前言

二、架构解析

2.1 高可用架构的三大核心组件

2.2 架构优势

三、案例环境准备

3.1 环境配置表

3.2 拓扑结构说明

3.3 案例需求与实现思路

四、实施步骤

4.1 安装 MySQL 数据库(Master1/Master2)

4.2 配置 MySQL 主主复制

(1)修改配置文件(Master1/Master2 分别设置)

(2)创建复制用户并授权(Master1/Master2 执行相同操作)

(3)配置双向复制

4.3 安装与配置 HAProxy(Keepalived1/Keepalived2)

(1)环境准备

(2)配置文件(/etc/haproxy/haproxy.cfg)

(3)启动与测试

4.4 安装与配置 Keepalived(Keepalived1/Keepalived2)

(1)安装与基础配置

(2)配置文件差异

(3)健康检查脚本(chk.sh)

(4)验证 VIP 分配

五、故障转移测试

5.1 模拟 Master1 故障

5.2 模拟 Keepalived1 故障

六、总结

6.1 架构价值

6.2 扩展建议


一、前言

在数字化浪潮席卷的今天,数据已然成为企业最为核心的资产之一,而数据库的可靠性更是直接关乎业务的连续性。传统的单节点 MySQL 架构存在着单点故障风险,一旦发生宕机,随之而来的将是业务中断、数据丢失等一系列严重后果。尤其是在电商秒杀、金融交易这类对实时性和稳定性要求极高的场景中,数据库的持续可用性(High Availability, HA)早已成为系统设计不可妥协的刚性需求。

本文将探讨一种经典的 MySQL 高可用架构方案 ——主主复制 + Keepalived+HAProxy。通过理论与实践相结合的方式,详细解析如何借助开源工具,实现数据库的故障自动转移、负载均衡以及读写分离,为企业构建稳定可靠的数据库服务提供全面且实用的解决方案。

二、架构解析

2.1 高可用架构的三大核心组件

(1)MySQL 主主复制:双向同步,冗余扩展

两台 MySQL 实例相互作为主从节点,实现数据的双向同步,并且都支持读写操作。这种架构不仅提供了冗余保障,还具备扩展能力,能够有效应对日益增长的数据处理需求。

(2)Keepalived:虚拟 IP 管理与故障切换

基于 VRRP 协议,Keepalived 负责管理虚拟 IP(VIP),实时监控 MySQL 节点的状态。当检测到故障时,能够在秒级时间内将 VIP 漂移至存活节点,确保服务地址保持不变,从而保障业务的连续性。

(3)HAProxy:负载均衡与健康检查

作为反向代理和负载均衡器,HAProxy 能够将流量智能分发至各个 MySQL 节点。它支持健康检查功能,可自动剔除故障节点,同时还能实现读写分离(可选),进一步提升系统的性能和稳定性。

2.2 架构优势

  • 高可用性保障:Keepalived 的秒级故障切换机制,结合 HAProxy 的健康检查功能,能够有效避免单点故障,确保服务的持续可用。
  • 读写性能扩展:主主架构支持双节点并发写入,显著提升了写入性能;通过 HAProxy 配置读写分离,可利用备节点分担读压力,实现性能的全面提升。
  • 灵活扩展能力:支持横向扩展 HAProxy 或 MySQL 节点,并且可以根据实际需求动态调整负载均衡策略,如轮询、权重等,使架构能够灵活适应业务发展。
  • 运维友好性:基于开源工具构建,不存在厂商锁定问题,同时拥有丰富的社区支持,非常适合企业自建数据库集群,降低运维成本。

三、案例环境准备

3.1 环境配置表

主机角色

操作系统

IP 地址

部署组件

Master1

openEuler 24.03

192.168.10.101

MySQL 8.0

Master2

openEuler 24.03

192.168.10.102

MySQL 8.0

Keepalived1

openEuler 24.03

192.168.10.103

Keepalived、HAProxy

Keepalived2

openEuler 24.03

192.168.10.104

Keepalived、HAProxy

3.2 拓扑结构说明

Keepalived1 (192.168.10.103) + HAProxy       ├─ 虚拟IP: 192.168.10.100
Keepalived2 (192.168.10.104) + HAProxy       └─ 负载均衡 → Master1/Master2
Master1 (192.168.10.101)                     ├─ 主主复制(双向同步)
Master2 (192.168.10.102)                     └─ 主主复制(双向同步)

3.3 案例需求与实现思路

  • 核心需求:通过 MHA(实际上本案例主要使用 Keepalived+HAProxy)监控 MySQL 数据库,在发生故障时实现自动切换,确保业务不受影响。
  • 实施步骤
  1. 安装 MySQL 数据库,并完成基础环境配置。
  2. 配置 MySQL 主主复制,实现数据的双向同步。
  3. 安装 HAProxy 并进行负载均衡配置,实现流量的智能分发。
  4. 安装 Keepalived 并配置故障转移机制,保障服务的高可用性。
  5. 模拟 Master 节点故障,验证故障切换的有效性。

四、实施步骤

4.1 安装 MySQL 数据库(Master1/Master2)

(1)基础环境准备

# 安装基础工具包
yum -y install gcc vim wget net-tools lrzsz
# 安装依赖包
dnf install -y libaio numactl openssl ncurses-compat-libs
# 创建MySQL用户
useradd -M -s /sbin/nologin mysql
# 关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl disable --now firewalld

(2)二进制安装

# 解压安装包
tar -xJf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
# 创建数据目录并授权
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql/data
# 初始化数据库(记录初始密码)
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

(3)配置文件调整(/etc/my.cnf)

[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address=0.0.0.0
skip-name-resolve
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
max_allowed_packet=16M

(4)设置系统服务并启动

# 复制服务脚本
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
# 创建systemd服务
vim /lib/systemd/system/mysqld.service  # 写入服务配置
systemctl daemon-reload
systemctl enable --now mysqld
# 设置root密码并创建测试用户
mysqladmin -u root -p password 'pwd123'
mysql -u root -p <<EOF
CREATE USER 'test'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL ON *.* TO 'test'@'192.168.10.%';
FLUSH PRIVILEGES;
EOF

4.2 配置 MySQL 主主复制

(1)修改配置文件(Master1/Master2 分别设置)
  • Master1(/etc/my.cnf)
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format=MIXED
server-id=1
  • Master2(/etc/my.cnf)
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format=MIXED
server-id=2
  • 重启 MySQL 服务:​​systemctl restart mysqld​
(2)创建复制用户并授权(Master1/Master2 执行相同操作)
mysql -u root -p <<EOF
CREATE USER 'myslave'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.10.%';
FLUSH PRIVILEGES;
EOF
(3)配置双向复制
  • 在 Master1 上配置指向 Master2 的复制
mysql -u root -p <<EOF
CHANGE MASTER TO
  MASTER_HOST='192.168.10.102',
  MASTER_USER='myslave',
  MASTER_PASSWORD='123456',
  MASTER_LOG_FILE='mysql-bin.000001',  # 替换为实际日志文件名
  MASTER_LOG_POS=157;  # 替换为实际Position值
START SLAVE;
EOF
  • 在 Master2 上配置指向 Master1 的复制
mysql -u root -p <<EOF
CHANGE MASTER TO
  MASTER_HOST='192.168.10.101',
  MASTER_USER='myslave',
  MASTER_PASSWORD='123456',
  MASTER_LOG_FILE='mysql-bin.000001',  # 替换为实际日志文件名
  MASTER_LOG_POS=157;  # 替换为实际Position值
START SLAVE;
EOF
  • 验证复制状态
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -E 'Slave_IO_Running|Slave_SQL_Running'
# 预期输出:Both should be "Yes"

4.3 安装与配置 HAProxy(Keepalived1/Keepalived2)

(1)环境准备
# 关闭SELinux和防火墙(同MySQL步骤)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl disable --now firewalld
# 安装HAProxy
dnf install -y haproxy
(2)配置文件(/etc/haproxy/haproxy.cfg)
global
  log 127.0.0.1 local2
  chroot /var/lib/haproxy
  pidfile /var/run/haproxy.pid
  user haproxy
  group haproxy
  daemon
  maxconn 4000

defaults
  mode tcp
  log global
  option tcplog
  option dontlognull
  retries 3
  timeout connect 5s
  timeout client 1m
  timeout server 1m
  maxconn 3000

listen mysql
  bind 0.0.0.0:3306
  balance leastconn
  server mysql1 192.168.10.101:3306 check port 3306 maxconn 300
  server mysql2 192.168.10.102:3306 check port 3306 maxconn 300
(3)启动与测试
haproxy -c -f /etc/haproxy/haproxy.cfg  # 检查配置语法
systemctl restart haproxy
# 测试连接
mysql -utest -p123456 -h192.168.10.103 -P3306

4.4 安装与配置 Keepalived(Keepalived1/Keepalived2)

(1)安装与基础配置
dnf install -y keepalived
# 关闭SELinux和防火墙(同前)
(2)配置文件差异
  • Keepalived1(/etc/keepalived/keepalived.conf)
global_defs {
  router_id r1
}
vrrp_script chk_haproxy {
  script "/etc/keepalived/chk.sh"
  interval 2
}
vrrp_instance VI_1 {
  state BACKUP
  nopreempt
  interface ens33
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.10.100
  }
  track_script {
    chk_haproxy
  }
}
  • Keepalived2(/etc/keepalived/keepalived.conf)
global_defs {
  router_id r2
}
# 其他配置与Keepalived1相同,仅priority改为99
priority 99
(3)健康检查脚本(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 分配
ip a show ens33  # Keepalived1应显示VIP 192.168.10.100

五、故障转移测试

5.1 模拟 Master1 故障

# 关闭Master1服务器
shutdown -h now
# 测试VIP连接
mysql -utest -p123456 -h192.168.10.100
# 预期结果:连接成功,HAProxy自动剔除故障节点

5.2 模拟 Keepalived1 故障

# 停止Keepalived1服务
systemctl stop keepalived
# 检查VIP漂移
ip a show ens33  # Keepalived2应显示VIP
# 测试连接
mysql -utest -p123456 -h192.168.10.100
# 预期结果:连接成功,VIP漂移至Keepalived2

六、总结

6.1 架构价值

  • 数据一致性:通过主主复制实现双向数据同步,确保多节点间的数据一致。
  • 服务连续性:Keepalived 的 VIP 漂移机制与 HAProxy 的健康检查相结合,实现故障的自动切换,保障业务零中断。
  • 性能优化:负载均衡与读写分离功能有效提升系统吞吐能力,满足高并发场景的需求。

6.2 扩展建议

  • 结合 MHA:进一步增强故障检测与自动恢复能力,实现更智能的故障切换。
  • 读写分离配置:在 HAProxy 中细化规则,明确区分读请求和写请求,进一步优化性能。
  • 节点扩展:根据业务需求横向扩展 MySQL 从节点,分担读压力,提升系统的可扩展性。

通过本文介绍的 “MySQL 主主复制 + Keepalived+HAProxy” 架构,企业能够以较低的成本构建高可用、高性能的数据库服务,为核心业务提供坚实的数据保障。在实际应用中,可根据具体业务场景对架构进行灵活调整和扩展,以满足不断变化的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值