MySQL 数据库集群高可用与可视化监控平台搭建实验报告

一、实验概述

(一)实验背景

随着企业业务规模的持续扩张,单一数据库服务器的性能瓶颈日益凸显,无法满足读写请求均分、高并发的业务场景需求。为解决单库性能不足、单点故障导致的服务中断等问题,需构建一套兼具高可用性与可视化监控能力的数据库集群解决方案,实现服务持续稳定运行与运维效率提升。

(二)实验目标

  1. 搭建双主双活(Active-Active)MySQL 集群架构,解决单点故障问题,实现故障自动转移,保障服务连续性。
  2. 满足读写请求各占 50%、高并发场景下的高吞吐、低延迟数据服务需求。
  3. 构建独立自动化监控告警体系,通过可视化大屏实时展示数据库核心性能指标,提升系统可观测性。
  4. 形成标准化配置流程,为后续自动化运维、故障快速诊断提供支撑。

(三)技术选型

技术模块 核心组件 技术说明
高可用架构 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

三、实验步骤

(一)系统环境初始化(三台节点均执行)

  1. 安装基础依赖包

    yum install -y vim make gcc tree net-tools tar chrony
    yum update -y

  2. 配置主机名与网络

    分别在三台节点执行

    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

  3. 时间同步配置

    vim /etc/chrony.conf

    替换原有时间服务器地址为

    server ntp.aliyun.com iburst
    systemctl restart chronyd
    chronyc sources -v

  4. 创建系统快照完成基础配置后,为三台虚拟机创建快照,便于后续故障回滚。

(二)MySQL 数据库安装与配置(master1、master2)

以 master1 为例,master2 安装流程一致(需修改唯一标识):

  1. 下载并解压安装包

下载地址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
  1. 创建专用用户与数据目录

    groupadd mysql
    useradd -r -g mysql -s /bin/false mysql
    mkdir /usr/local/mysql/data
    chown -R mysql:mysql /usr/local/mysql

  2. 初始化与启动 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

  3. 配置 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

  4. master2 节点特殊配置克隆 master1 后,修改 server-uuid 避免冲突:

    vim /usr/local/mysql/data/auto.cnf

    修改server-uuid为唯一值

    server-uuid=ddb80144-c940-11f0-9955-000c29869930

(三)双主集群搭建

  1. 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)

  2. 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值

  3. 建立双向主从复制

  • 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 高可用部署

  1. 安装与配置 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

  2. 安装与配置 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 节点)

说明
  • 涉及的软件及端口

  1. 部署 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

测试

  1. 部署 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

重启后测试:

  1. 部署 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监控模板

(六)压力测试与高可用验证

  1. 压力测试配置

    在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

  2. 高可用切换验证

    在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

四、实验结果

(一)集群高可用验证结果

  1. 双主复制状态:通过show slave status\G命令验证,master1 与 master2 的 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes,数据同步延迟为 0 秒。在 master1 创建test_cluster数据库,master2 可实时同步;在 master2 创建user_info表,master1 同步成功,无数据一致性问题。
  2. 故障转移效果:停止 master1 的 MySQL 服务后,10 秒内 VIP(192.168.89.200)自动漂移至 master2 节点,通过 VIP 连接数据库可正常执行读写操作,业务无感知中断。恢复 master1 服务后,因配置nopreempt,VIP 保持在 master2 节点,避免频繁切换。

(二)监控平台展示结果

Grafana 仪表盘成功展示以下核心指标(截图引用原博客监控大屏):

  1. 数据库状态:MySQL 运行时长 379 天 21 小时,连接数稳定在 3-5 个,最大连接数 4 个。
  2. 性能指标:QPS 峰值 23.3,CPU 利用率 2%,InnoDB 缓冲池利用率 0.93,无明显性能瓶颈。
  3. 网络流量:Gi1/0/3 端口发送速率 8.89Mb/s、接收速率 15Mb/s,Gi1/0/22 端口接收速率 62.8Mb/s,网络传输稳定无丢包。
  4. 同步状态:主从复制延迟为 0,Bin-log 日志生成正常,无同步错误。

(三)压力测试结果

并发数 迭代次数 总查询数 平均响应时间 吞吐量(QPS)
300 2 3000 0.87s 3448
500 2 3000 1.23s 2439

压力测试过程中,集群无服务中断,数据同步正常,监控平台未触发告警,满足高并发场景需求。

五、实验总结与体会

(一)实验总结

本实验成功构建了 MySQL 双主双活高可用集群与可视化监控平台,通过 MySQL 双主复制实现数据双向同步,Keepalived 实现 VIP 智能漂移,解决了单点故障问题;基于 mysqld_exporter+Prometheus+Grafana 的监控体系,实现了数据库性能指标的实时采集、存储与可视化展示。实验结果表明,该方案在读写均分、高并发场景下可提供高吞吐、低延迟服务,故障转移自动化程度高,监控告警及时,符合企业级应用需求。

(二)实验体会

  1. 技术细节把控:双主集群配置中,server-id 唯一性、自增序列步长设置、同步账号权限分配是数据一致性的关键;Keepalived 的健康检查脚本需确保执行权限,否则会导致故障转移失效;Prometheus 配置文件的语法对齐的重要性,格式错误会导致指标采集失败。
  2. 架构设计思考:双主双活架构适用于读写均衡场景,通过 VIP 漂移实现高可用,相比主从架构提升了读写吞吐量,但需注意避免主键冲突;监控平台的核心价值在于提前预警,需合理设置告警阈值,避免误告警或漏告警。
  3. 问题排查能力:实验过程中遇到 MySQL 登录依赖缺失、主从复制 IO 线程异常、Grafana 数据源连接失败等问题,通过查看日志文件(MySQL error.log、Prometheus 日志)、核对配置参数、测试网络连通性等方式逐一解决,提升了问题排查的系统性思维。

(三)后续优化方向

  1. 引入容器化部署:使用 Docker+Kubernetes 实现集群的自动化部署与扩缩容,提升运维效率。
  2. 完善备份策略:添加定时全量备份 + 增量备份机制,结合监控平台实现备份状态监控与异常告警。
  3. 优化监控告警:扩展监控指标(如慢查询数量、表空间使用率),配置邮件、短信等多渠道告警方式。
  4. 负载均衡增强:引入 Nginx 或 HAProxy 实现更精细的读写分离与负载均衡策略,进一步提升集群并发处理能力
相关推荐
e***71671 小时前
mysql用户名怎么看
数据库·mysql
管理大亨1 小时前
MySQL数据实时同步Redis全攻略
数据库·redis·mysql
8***84821 小时前
macOS安装Redis
数据库·redis·macos
j***82701 小时前
MySQL 启动失败 (code=exited, status=1FAILURE) 异常解决方案
数据库·mysql
r***86981 小时前
【MySQL 的数据目录】
数据库·mysql·adb
8***J1821 小时前
SQL进阶——JOIN操作详解
数据库·sql·oracle
王景程2 小时前
升级Pixy CMUcam5 固件
mysql·android runtime
旷野说2 小时前
如何用 Redpanda + 本地事务,实现“发消息 + 写 DB” 的强一致性!
java·数据库·kafka
管理大亨2 小时前
Canal:企业数据实时同步的利器
数据库·mysql