一、实验概述
(一)实验背景
随着企业业务规模的持续扩张,单一数据库服务器的性能瓶颈日益凸显,无法满足读写请求均分、高并发的业务场景需求。为解决单库性能不足、单点故障导致的服务中断等问题,需构建一套兼具高可用性与可视化监控能力的数据库集群解决方案,实现服务持续稳定运行与运维效率提升。
(二)实验目标
- 搭建双主双活(Active-Active)MySQL 集群架构,解决单点故障问题,实现故障自动转移,保障服务连续性。
- 满足读写请求各占 50%、高并发场景下的高吞吐、低延迟数据服务需求。
- 构建独立自动化监控告警体系,通过可视化大屏实时展示数据库核心性能指标,提升系统可观测性。
- 形成标准化配置流程,为后续自动化运维、故障快速诊断提供支撑。

(三)技术选型
| 技术模块 | 核心组件 | 技术说明 |
|---|---|---|
| 高可用架构 | MySQL 8.0.37 + Keepalived 2.2.4 | 双主复制实现数据双向同步,Keepalived 基于 VRRP 协议实现 VIP 漂移 |
| 监控体系 | mysqld_exporter-0.18.0 + Prometheus-3.5.0 + Grafana-enterprise-11.1.2 | 指标采集、时序数据存储、可视化展示全流程覆盖 |
| 部署环境 | VMware 17 + OpenEuler 22.03 LTS | 三台虚拟机构建独立节点,保障环境隔离与稳定性 |
| 压力测试 | mysqlslap | 模拟高并发场景,验证集群性能与高可用切换效果 |
下载安装OpenEuler22.03 SP4 LTS 操作系统
①下载OpenEuler镜像
https://dl-cdn.openeuler.openatom.cn/openEuler-22.03-LTS-SP4/ISO/x86_64/

二、实验环境准备
(一)硬件配置
三台虚拟机均采用以下配置:CPU 1 颗 2 核、内存 2GB、硬盘 20GB、网络 NAT 模式。

(二)网络拓扑与节点信息
| 节点名称 | IP 地址 | 角色 | 核心部署组件 |
|---|---|---|---|
| master1 | 192.168.89.142(VIP:192.168.89.200) | 主数据库节点 | MySQL 8.0.37、Keepalived 2.2.4 |
| master2 | 192.168.89.145(VIP:192.168.89.200) | 主数据库节点 | MySQL 8.0.37、Keepalived 2.2.4 |
| monitor | 192.168.89.143 | 监控节点 | mysqld_exporter、Prometheus、Grafana |
三、实验步骤
(一)系统环境初始化(三台节点均执行)
-
安装基础依赖包
yum install -y vim make gcc tree net-tools tar chrony
yum update -y -
配置主机名与网络
分别在三台节点执行
hostnamectl set-hostname master1
hostnamectl set-hostname master2
hostnamectl set-hostname monitor关闭防火墙与SELinux
systemctl stop firewalld && systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot -
时间同步配置
vim /etc/chrony.conf
替换原有时间服务器地址为
server ntp.aliyun.com iburst
systemctl restart chronyd
chronyc sources -v -
创建系统快照完成基础配置后,为三台虚拟机创建快照,便于后续故障回滚。
(二)MySQL 数据库安装与配置(master1、master2)
以 master1 为例,master2 安装流程一致(需修改唯一标识):
- 下载并解压安装包
下载地址 :https://downloads.mysql.com/archives/community/

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
tar xvf mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
mv mysql-8.0.37-linux-glibc2.17-x86_64 /usr/local/mysql
-
创建专用用户与数据目录
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql -
初始化与启动 MySQL
初始化并记录临时密码
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
启动MySQL服务
/usr/local/mysql/bin/mysqld_safe --user=mysql &
建立依赖库软链接(解决登录报错)
ln -s /usr/lib64/libncurses.so.6.3 /usr/lib64/libncurses.so.5
ln -s /usr/lib64/libtinfo.so.6.3 /usr/lib64/libtinfo.so.5 -
配置 MySQL 服务与远程访问
新建配置文件
cat > /etc/my.cnf << EOF
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
tmpdir = /tmp
socket = /tmp/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
default-storage-engine=INNODB
log_error = error.log
EOF配置系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
sed -i 's/basedir=/basedir=/usr/local/mysql/' /etc/init.d/mysql
sed -i 's/datadir=/datadir=/usr/local/mysql/data/' /etc/init.d/mysql设置环境变量
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile开机自启
systemctl daemon-reload
/usr/lib/systemd/systemd-sysv-install enable mysql修改root密码并开启远程访问
mysql -uroot -p
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
update mysql.user set host='%' where user='root';
flush privileges;
exit -
master2 节点特殊配置克隆 master1 后,修改 server-uuid 避免冲突:
vim /usr/local/mysql/data/auto.cnf
修改server-uuid为唯一值
server-uuid=ddb80144-c940-11f0-9955-000c29869930
(三)双主集群搭建
-
master1 节点配置
vim /etc/my.cnf
新增以下配置
server-id=1
log-bin=mysql-bin
binlog-ignore-db=mysql
binlog_format=mixed
max_binlog_size=1024M
relay_log=mysql-relay
log_bin_trust_function_creators=true
slave_skip_errors=1062
auto_increment_offset=1
auto_increment_increment=2重启MySQL并创建同步账号
systemctl restart mysql
mysql -uroot -p123456
create user 'sync_user'@'%' identified with mysql_native_password by 'sync_123';
grant replication slave on . to 'sync_user'@'%';
flush privileges;
show master status; # 记录File与Position值(如mysql-bin.000001, 664) -
master2 节点配置
vim /etc/my.cnf
新增以下配置
server-id=2
log-bin=mysql-bin
binlog-ignore-db=mysql
binlog_format=mixed
max_binlog_size=1024M
relay_log=mysql-relay
log_bin_trust_function_creators=true
slave_skip_errors=1062
auto_increment_offset=2
auto_increment_increment=2重启MySQL并创建同步账号
systemctl restart mysql
mysql -uroot -p123456
create user 'sync_user'@'%' identified with mysql_native_password by 'sync_123';
grant replication slave on . to 'sync_user'@'%';
flush privileges;
show master status; # 记录File与Position值 -
建立双向主从复制
-
master1 作为从节点连接 master2:
mysql -uroot -p123456
change master to
master_host='192.168.89.145',
master_user='sync_user',
master_password='sync_123',
master_port=3306,
master_log_file='mysql-bin.000001', # 替换为master2的File值
master_log_pos=664; # 替换为master2的Position值
start slave;
show slave status\G # 验证Slave_IO_Running与Slave_SQL_Running均为Yes -
master2 作为从节点连接 master1:
mysql -uroot -p123456
change master to
master_host='192.168.89.142',
master_user='sync_user',
master_password='sync_123',
master_port=3306,
master_log_file='mysql-bin.000001', # 替换为master1的File值
master_log_pos=664; # 替换为master1的Position值
start slave;
show slave status\G # 验证Slave_IO_Running与Slave_SQL_Running均为Yes
(四)Keepalived 高可用部署
-
安装与配置 master1 节点
yum install -y keepalived
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id mysql-master-01
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.89.200
}
}
virtual_server 192.168.89.200 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.89.142 3306 {
notify_down /etc/keepalived/mysql_check.sh
weight 1
TCP_CHECK {
connect_port 3306
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
EOF编写健康检查脚本
cat > /etc/keepalived/mysql_check.sh << EOF
#!/bin/bash
if [ $(netstat -na | grep "LISTEN" | grep "3306" | wc -l) -eq 0 ]; then
killall keepalived
fi
EOF
chmod +x /etc/keepalived/mysql_check.sh启动服务
systemctl start keepalived
systemctl enable keepalived -
安装与配置 master2 节点
yum install -y keepalived
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id mysql-master-02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.89.200
}
}
virtual_server 192.168.89.200 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.89.145 3306 {
notify_down /etc/keepalived/mysql_check.sh
weight 1
TCP_CHECK {
connect_port 3306
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
EOF复制健康检查脚本
cp /etc/keepalived/mysql_check.sh /etc/keepalived/
chmod +x /etc/keepalived/mysql_check.sh启动服务
systemctl start keepalived
systemctl enable keepalived
(五)监控平台搭建(monitor 节点)
说明
-
涉及的软件及端口
-

- 部署 mysqld_exporter
Mysql_exporter是用来收集MysQL数据库相关指标且需要连接到数据库并有相关权限。
下载安装包并解压缩: https://prometheus.io/download/

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.18.0/mysqld_exporter-0.18.0.linux-amd64.tar.gz
tar xvf mysqld_exporter-0.18.0.linux-amd64.tar.gz
mv mysqld_exporter-0.18.0.linux-amd64 /usr/local/mysqld_exporter
# 配置数据库连接
cat > /usr/local/mysqld_exporter/.my.cnf << EOF
[client]
user = monitor_user
password = monitor_123
host = 192.168.89.200
port = 3306
EOF
# 数据库授权(在master1执行,自动同步到master2)
mysql -uroot -p123456
create user 'monitor_user'@'%' identified with mysql_native_password by 'monitor_123';
grant process, replication client, select on *.* to 'monitor_user'@'%';
flush privileges;
# 配置系统服务
cat > /usr/lib/systemd/system/mysqld_exporter.service << EOF
[Unit]
Description=MySQL Exporter for Prometheus
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf --web.listen-address=:9104
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start mysqld_exporter
systemctl enable mysqld_exporter
测试

- 部署 Prometheus
Prometheus是一个开源系统监控和警报工具包,最初由SoundCloud构建。自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立于任何公司维护。
架构图:

下载安装包并解压缩:https://prometheus.io/download/
wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-amd64.tar.gz
tar xvf prometheus-3.5.0.linux-amd64.tar.gz
mv prometheus-3.5.0.linux-amd64 /usr/local/prometheus
# 配置数据源
cat > /usr/local/prometheus/prometheus.yml << EOF
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "mysql_cluster"
static_configs:
- targets: ["192.168.89.143:9104"]
labels:
instance: mysql-db-cluster
EOF
# 创建专用用户
useradd --no-create-home --shell /bin/false prometheus
chown -R prometheus:prometheus /usr/local/prometheus
# 配置系统服务
cat > /usr/lib/systemd/system/prometheus.service << EOF
[Unit]
Description=Prometheus Time Series Database
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/usr/local/prometheus/data
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus
测试:

Mysqld_exporter对接Prometheus

重启后测试:

- 部署 Grafana
-
Grafana是一个功能强大、灵活性高、易于使用的数据可视化和监控工具,广泛应用于IT运维、应用性能监控、工业物联网等领域
-
使用Grafana,用户可以轻松地创建各种图表、图形和面板,以直观和动态的方式展示数据趋势、指标和警报。其灵活的插件系统和丰富的图形化选项使用户能够根据自己的需求定制仪表板,并将其集成到现有的监控系统中
wget https://dl.grafana.com/oss/release/grafana-11.1.2-1.x86_64.rpm
yum install -y grafana-11.1.2-1.x86_64.rpm配置Grafana
sed -i 's/;http_port = 3000/http_port = 3000/' /etc/grafana/grafana.ini
sed -i 's/;domain = localhost/domain = localhost/' /etc/grafana/grafana.ini
sed -i 's/;root_url = %(protocol)s://%(domain)s:%(http_port)s//root_url = %(protocol)s://%(domain)s:%(http_port)s//' /etc/grafana/grafana.ini启动服务
systemctl start grafana-server
systemctl enable grafana-server配置数据源与仪表盘
1. 访问http://192.168.89.143:3000,默认账号admin/admin,修改密码为123456
2. 添加Prometheus数据源,URL填写http://192.168.89.143:9090
3. 导入仪表盘模板(ID:7362),选择MySQL监控模板


(六)压力测试与高可用验证
-
压力测试配置
在monitor节点安装mysqlslap
yum install -y mysql-client
修改MySQL最大连接数
vim /etc/my.cnf
max_connections=1024
systemctl restart mysql执行压力测试
mysqlslap --defaults-file=/etc/my.cnf --concurrency=300,500 --iterations=2 --number-int-cols=60 --number-char-cols=50 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=innodb --number-of-queries=3000 -uroot -p123456 --host=192.168.89.200 --verbose
-
高可用切换验证
在master1节点停止MySQL服务,模拟故障
systemctl stop mysql
查看VIP漂移情况(master2节点执行)
ip a | grep 192.168.89.200
验证业务连续性:通过VIP连接数据库执行操作
mysql -uroot -p123456 --host=192.168.89.200
create database test_switch;恢复master1服务
systemctl start mysql
systemctl start keepalived
四、实验结果
(一)集群高可用验证结果
- 双主复制状态:通过
show slave status\G命令验证,master1 与 master2 的 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes,数据同步延迟为 0 秒。在 master1 创建test_cluster数据库,master2 可实时同步;在 master2 创建user_info表,master1 同步成功,无数据一致性问题。 - 故障转移效果:停止 master1 的 MySQL 服务后,10 秒内 VIP(192.168.89.200)自动漂移至 master2 节点,通过 VIP 连接数据库可正常执行读写操作,业务无感知中断。恢复 master1 服务后,因配置
nopreempt,VIP 保持在 master2 节点,避免频繁切换。
(二)监控平台展示结果
Grafana 仪表盘成功展示以下核心指标(截图引用原博客监控大屏):
- 数据库状态:MySQL 运行时长 379 天 21 小时,连接数稳定在 3-5 个,最大连接数 4 个。
- 性能指标:QPS 峰值 23.3,CPU 利用率 2%,InnoDB 缓冲池利用率 0.93,无明显性能瓶颈。
- 网络流量:Gi1/0/3 端口发送速率 8.89Mb/s、接收速率 15Mb/s,Gi1/0/22 端口接收速率 62.8Mb/s,网络传输稳定无丢包。
- 同步状态:主从复制延迟为 0,Bin-log 日志生成正常,无同步错误。

(三)压力测试结果
| 并发数 | 迭代次数 | 总查询数 | 平均响应时间 | 吞吐量(QPS) |
|---|---|---|---|---|
| 300 | 2 | 3000 | 0.87s | 3448 |
| 500 | 2 | 3000 | 1.23s | 2439 |
压力测试过程中,集群无服务中断,数据同步正常,监控平台未触发告警,满足高并发场景需求。
五、实验总结与体会
(一)实验总结
本实验成功构建了 MySQL 双主双活高可用集群与可视化监控平台,通过 MySQL 双主复制实现数据双向同步,Keepalived 实现 VIP 智能漂移,解决了单点故障问题;基于 mysqld_exporter+Prometheus+Grafana 的监控体系,实现了数据库性能指标的实时采集、存储与可视化展示。实验结果表明,该方案在读写均分、高并发场景下可提供高吞吐、低延迟服务,故障转移自动化程度高,监控告警及时,符合企业级应用需求。
(二)实验体会
- 技术细节把控:双主集群配置中,server-id 唯一性、自增序列步长设置、同步账号权限分配是数据一致性的关键;Keepalived 的健康检查脚本需确保执行权限,否则会导致故障转移失效;Prometheus 配置文件的语法对齐的重要性,格式错误会导致指标采集失败。
- 架构设计思考:双主双活架构适用于读写均衡场景,通过 VIP 漂移实现高可用,相比主从架构提升了读写吞吐量,但需注意避免主键冲突;监控平台的核心价值在于提前预警,需合理设置告警阈值,避免误告警或漏告警。
- 问题排查能力:实验过程中遇到 MySQL 登录依赖缺失、主从复制 IO 线程异常、Grafana 数据源连接失败等问题,通过查看日志文件(MySQL error.log、Prometheus 日志)、核对配置参数、测试网络连通性等方式逐一解决,提升了问题排查的系统性思维。
(三)后续优化方向
- 引入容器化部署:使用 Docker+Kubernetes 实现集群的自动化部署与扩缩容,提升运维效率。
- 完善备份策略:添加定时全量备份 + 增量备份机制,结合监控平台实现备份状态监控与异常告警。
- 优化监控告警:扩展监控指标(如慢查询数量、表空间使用率),配置邮件、短信等多渠道告警方式。
- 负载均衡增强:引入 Nginx 或 HAProxy 实现更精细的读写分离与负载均衡策略,进一步提升集群并发处理能力

