MySQL双主双活集群-Keepalived高可用 Prometheus/Grafana监控

项目说明

  • 该项目共分为2个子项目,由MYSQL集群高可用和数据监控平台两部分组成

  • MYSQL集群高可用

业务需求

  • 某企业由于业务增加,超出了单库性能阈值,则需要构建高可用的数据库服务器集群,且在业务增长初期,读写业务各半,需选择Active-Active Cluster集群架构,为了保证活性,使用恰当的技术实现high availability,要求架构图如下:

编辑

为了实现自动化运维,预使用开源监控实时报警软件实现服务器的检测、大屏展示,要求使用独立主机安装软件检测数据库集群的性能,以仪表盘形式展示

  • 具体要求

    • 网络配置:确保集群中的MySQL服务器之间的网络连接稳定可靠,避免网络延迟或丢包对集群性能造成影响。

    • 同步参数配置:对于需要数据同步的集群方案(如主从复制和组复制),需要合理配置同步参数,确保数据的实时性和一致性。

    • 备份和恢复策略:制定完善的备份和恢复策略,定期备份集群数据,并测试恢复流程的可行性,以确保在发生故障时能够快速恢复数据和服务。

    • 监控和告警:使用监控工具对集群进行实时监控,并设置合理的告警阈值。当集群出现异常情况时,能够及时发现并处理。

项目设计思路

  • MYSQL集群高可用使用双主双活+keepalived实现

  • MYSQL数据监控平台使用mysqld_exporter+prometheus+Grafana三件套实现

  • 集群及监控平台搭建完毕后可以实现企业内部的mysql数据库双主机在线增加高可用性,通过keepalived的故障检测和VIP漂移能力使得发生故障后使用者无感知,增加系统的容错能力,通过监控平台实现mysql数据库监控可视化

项目组织方式及时间

  • 时间:建议1.5天至2天内完成所有的项目搭建、压力测试、问题总结

  • 方式:通过VmWare17虚拟机实现平台搭建

  • 人数:1人

项目特点

  • 综合项目从主从复制原理、数据同步方式、主从架构模式、主从架构/双主架构、高可用、数据可视化一步步从零搭建出一个完善的数据库集群/监控平台

  • 综合项目完成后可以实现对MYSQL数据库高级运维知识的巩固,通过参与实际项目增加工作实战经验,提升技术能力、故障判断检测维护能力、充实简历项目经历

  • 通过prometheus数据库监控三件套的项目搭建,可以掌握数据监控的知识应用能力,通过监控大屏数据的展示使得数据可视化得以实现,使得运维更自动化、直观化

  • 该项目进一步巩固和掌握云原生高级数据库部分的知识以及数据监控可视化的知识点

项目背景知识

编辑

集群机构模式-

一主一从/多从架构

编辑

  • 一主一从或一主多从,这是传统的主从复制模型,也就是多个主从节点组成的集群中,只有一个主节点,剩余的所有节点都为其附属关系,结构如下:
双主/多主架构
  • 若公司项目中读写请求的比例对半开,同时整体的并发量也不算低,至少超出了单库的承载阈值,这时就可以选用双主/多主架构,结构如下:

  • 编辑

keepalived高可用方案

  • Keepalived是一个轻量级别的高可用解决方案,使用VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)的VIP虚拟IP的漂移功能,实现单点故障转移

编辑

可视化监控平台三件套

  • Mysqld_exporter:是一款轻量级的mysql监控工具,用来收集MysQL数据库相关指标并将其暴露给prometheus进行监控和告警

  • Prometheus:普罗米修斯,一个开源的服务监控系统,它负责采集和存储应用的监控指标数据,并以可视化的方式进行展示,以便于用户实时掌握系统的运行情况,并对异常进行检测

  • Grafana:格拉法娜,是一个跨平台的开源的度量分析和可视化工具,可以从prometheus获取数据进行可视化数据大屏展示。

  • 总结:mysqld_exporter用于抓取mysql监控指标数据,prometheus接收到数据后进行整理分析,grafana从prometheus获取数据使用大屏模版进行仪表盘展示

编辑

项目环境

项目拓扑结构

编辑

软硬件环境清单

主机名 IP地址 硬件 软件
master1 172.25.254.128 VIP:172.25.254.200 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.37 Keepalived2.2.4
master2 127.25.254.129 VIP:172.25.254.200 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.37 Keepalived2.2.4
monitor 172.25.254.130 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 Mysqld_Exporter-0.15.1 Prometheus-2.53.2 grafana-enterprise-11.1.2

项目任务清单

系统平台部署

  • 安装VmWare17

  • 虚拟出三台计算机

  • 安装OpenEuler22.03 SP4 LTS 操作系统

  • 系统设置:主机名、防火墙、SELinux、hosts映射、IP地址:

安装2台MySql服务器

  • 使用二进制包进行安装

  • 配置MySql系统服务

部署高可用MySql双主集群

  • 配置账户

  • 配置主主复制

  • 安装keepalived并配置

安装配置监控平台

  • 安装Mysqld_Exporter+Prometheus+grafana-enterprise

  • 配置监控平台组件

项目实现步骤

环境配置

修改三台主机名

编辑

root@localhost \~\]# hostnamectl set-hostname master1/master2/monitor * 关闭三台主机防火墙及SELinux * vi /etc/selinux/config SELINUX=disabled systemctl stop firewalld # 关闭防火墙 systemctl disable firewalld # 取消开机启动 reboot * 三台主机下载所需软件并升级 * yum install vim make gcc tree net-tools tar -y yum update * 三台主机重新设置登录系统密码 * passwd root * 三台主机时间同步 * ![img](https://i-blog.csdnimg.cn/direct/deee1752b8274ca2985690be5050deb6.png)![](https://i-blog.csdnimg.cn/direct/fad5d0c64fff47c1a9ed67ecabee57b3.gif)编辑 * ![img](https://i-blog.csdnimg.cn/direct/bdb93b897aec46d2b1e621ed4a04adff.png)![](https://i-blog.csdnimg.cn/direct/7712cfc61f564102bad603b81451fa03.gif)编辑 给主机装mysql--master1和master2步骤一样-----可安装完master1克隆出master2 方法一二进制安装mysql 下载地址: [https://downloads.mysql.com/archives/community/!\[img\](https://csdnimg.cn/release/blog_editor_html/release2.4.4/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=P9T8)https://downloads.mysql.com/archives/community/](https://downloads.mysql.com/archives/community/ "https://downloads.mysql.com/archives/community/![img](https://csdnimg.cn/release/blog_editor_html/release2.4.4/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=P9T8)https://downloads.mysql.com/archives/community/")![img](https://i-blog.csdnimg.cn/direct/9deeb59b96cf407b91f9eca1798da070.png)![](https://i-blog.csdnimg.cn/direct/7b1ab0d9776e4cc086bd570aa6de399f.gif)编辑 下载后解压 ``` [root@master1 ~]# tar xvf mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz ​ [root@master1 ~]# cd mysql-8.0.37-linux-glibc2.17-x86_64 ​ [root@master1 mysql-8.0.37-linux-glibc2.28-x86_64]# ls bin   include LICENSE README support-files docs lib man share ``` ![](https://i-blog.csdnimg.cn/direct/447afa4b632046cfb457d2b647880923.gif) ##### 使用前的准备 ``` [root@master1 ~]# cd ~ ​ [root@master1 ~]# mv mysql-8.0.37-linux-glibc2.17-x86_64 /usr/local/mysql ​ [root@master1 /]# cd /usr/local/mysql   ​ [root@master1 mysql]# groupadd mysql   # 创建名为mysql的用户组 ​ [root@master1 mysql]# useradd -r -g mysql -s /bin/false mysql # 创建名为 mysql的系统用户,将其添加到mysql用户组中,并设置其登录shell为/bin/false,以限制该用户的登录权限 ​ [root@master1 mysql]# mkdir data   # 创建用于存放MySQL数据文件目录 ​ # 设置mysql目录的账户及工作组,生产环境中不要使用root     [root@master1 mysql]# chown -R mysql:mysql /usr/local/mysql ``` ![](https://i-blog.csdnimg.cn/direct/a785a02b375a4a5ea042936b5fceca98.gif) # 移动到默认安装目录,也可自行修改 ``` [root@master1 ~]# cd ~ ​ [root@master1 ~]# mv mysql-8.0.37-linux-glibc2.17-x86_64 /usr/local/mysql ​ [root@master1 /]# cd /usr/local/mysql   ​ [root@master1 mysql]# groupadd mysql   # 创建名为mysql的用户组 ​ [root@master1 mysql]# useradd -r -g mysql -s /bin/false mysql # 创建名为 mysql的系统用户,将其添加到mysql用户组中,并设置其登录shell为/bin/false,以限制该用户的登录权限 ​ [root@master1 mysql]# mkdir data   # 创建用于存放MySQL数据文件目录 ​ # 设置mysql目录的账户及工作组,生产环境中不要使用root     [root@master1 mysql]# chown -R mysql:mysql /usr/local/mysql ``` ![](https://i-blog.csdnimg.cn/direct/0bb9319e4d3941389b1cc7e7a7e66bf9.gif) ##### 初始化软件 ``` [root@master1 mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # 注意:需要复制密码 ​ [root@master1 mysql]# bin/mysqld_safe --user=mysql & # 使用后台方式以mysql用户身份启动 MySQL 服务器,mysqld_safe 是一个用于启动和监控 MySQL 服务器的脚本 ​ # 注意:此时上述命令执行完毕处于后台运行状态,需要另行启动一个终端 ​ [root@master1 ~]# ps -ef | grep mysql   # 查看进程运行状态 ​ [root@master1 ~]# cd /usr/local/mysql ​ [root@master1 ~]# bin/mysql -uroot -p   # 登录,可能报错 ​ # 报错,需要找到下面的文件进行软连接 [root@master1 ~]# ln -s /usr/lib64/libncurses.so.6.3 /usr/lib64/libncurses.so.5 ​ [root@master1 ~]# ln -s /usr/lib64/libtinfo.so.6.3 /usr/lib64/libtinfo.so.5 ``` ![](https://i-blog.csdnimg.cn/direct/58615c92ac3044a086d10511108d5021.gif) ``` [root@master1 ~]# bin/mysql -u root -p Enter password: ​ mysql> alter  user 'root'@'localhost' identified with mysql_native_password by '123456';   ​ mysql> flush privileges;   ​ mysql> use mysql;   ​ mysql> select user, host, plugin from mysql.user; +------------------+-----------+-----------------------+ | user             | host      | plugin                | +------------------+-----------+-----------------------+ | mysql.infoschema | localhost | caching_sha2_password | | mysql.session    | localhost | caching_sha2_password | | mysql.sys        | localhost | caching_sha2_password | | root             | localhost | mysql_native_password | +------------------+-----------+-----------------------+ 4 rows in set (0.00 sec) ​ mysql>exit ​ [root@master1 ~]# ps -ef | grep mysql ​ [root@master1 ~]# kill -9 pid号   # 在当前终端关闭运行的mysql ``` ![](https://i-blog.csdnimg.cn/direct/bf7bf524e4d44c39b78e6d1da9478772.gif) ##### 设置mysql的配置文件 # 回到之前的终端,敲一个回车,显示进程以杀死 ``` [root@master1 mysql]# vim /etc/my.cnf # 新建配置文件,输入以下内容: ​ [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 ``` ![](https://i-blog.csdnimg.cn/direct/81d96d2061444896a2196d0337fc845f.gif) ##### 配置启动脚本 ``` [root@master1 ~]# cd /usr/local/mysql/support-files ​ [root@master1 support-files]# cp -a mysql.server /etc/init.d/mysql ​ [root@master1 support-files]# vim /etc/init.d/mysql # 增加=之后的内容 basedir=/usr/local/mysql datadir=/usr/local/mysql/data ​ [root@master1 init.d]# cd ~ ​ [root@master1 ~]# vim ~/.bash_profile   # 设置环境变量需添加如下语句 export PATH=$PATH:/usr/local/mysql/bin ​ [root@master1 ~]# source ~/.bash_profile ​ [root@master1 ~]# systemctl daemon-reload   # 重载系统配置 ​ [root@master1 ~]# systemctl start mysql ​ [root@master1 ~]# /usr/lib/systemd/systemd-sysv-install enable mysql # 开机启动   ``` ![](https://i-blog.csdnimg.cn/direct/8ebd0c4af14a403b84665349beb0d0d5.gif) ``` [root@master1 ~]# mysql -uroot -p ​ mysql> update mysql.user set host="%" where user="root"; ​ mysql> flush privileges; ​ mysql> exit ​   若选择安装完毕后进行克隆主机作为mater2,则必须要修改master2的server-uuid,否则无法进行下列主从服务器的搭建 ​ [root@master1 ~]# cat /usr/local/mysql/data/auto.cnf [auto] server-uuid=f15a54e5-5954-11ef-a5b0-000c29daf3cc # 只需删除master2的/usr/local/mysql/data/auto.cnf文件重启即可重新生成 ``` ![](https://i-blog.csdnimg.cn/direct/165a66da4d7d4e17bb4ecc46f24dbd7e.gif) **方法二:YUM 源安装 MySQL** ``` 1. 添加 MySQL YUM 源 [root@master1 ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-9.noarch.rpm ​ 安装 YUM 源 [root@master1 ~]# rpm -ivh mysql80-community-release-el7-9.noarch.rpm ​ 检查 YUM 源是否添加成功 [root@master1 ~]# yum repolist enabled | grep mysql ​ 2. 安装 MySQL 服务器 [root@master1 ~]# yum install -y mysql-community-server ​ 或者安装完整的 MySQL 套件 [root@master1 ~]# yum install -y mysql-community-server mysql-community-client mysql-community-common mysql-community-devel 3. 启动 MySQL 服务 [root@master1 ~]# systemctl start mysqld ​ 设置开机自启 [root@master1 ~]# systemctl enable mysqld ​ 检查服务状态 [root@master1 ~]# systemctl status mysqld 4. 获取初始密码 MySQL 8.0 首次启动会生成临时密码 [root@master1 ~]# grep 'temporary password' /var/log/mysqld.log 5. 安全配置 MySQL 使用临时密码登录 [root@master1 ~]# mysql -uroot -p ​ 修改 root 密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword123!'; ​ 运行安全配置脚本(可选,会引导你进行多项安全设置) [root@master1 ~]# mysql_secure_installation 6. 配置 MySQL # 编辑配置文件 [root@master1 ~]# vim /etc/my.cnf ​ 添加以下配置 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=INNODB max_connections=1000 ​ [client] default-character-set=utf8mb4 ​ 7. 重启 MySQL 服务 [root@master1 ~]# systemctl restart mysqld 8. 配置远程访问 登录 MySQL [root@master1 ~]# mysql -uroot -p ​ 创建远程访问用户 mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'YourPassword123!'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; ​ 或者修改 root 用户的 host mysql> UPDATE mysql.user SET host='%' WHERE user='root'; mysql> FLUSH PRIVILEGES; 9. 防火墙配置 ​ ​ 开放 3306 端口 [root@master1 ~]# firewall-cmd --permanent --add-port=3306/tcp [root@master1 ~]# firewall-cmd --reload 10. 验证安装 检查 MySQL 版本 [root@master1 ~]# mysql --version ​ 登录测试 [root@master1 ~]# mysql -uroot -p -h127.0.0.1 ​ 查看数据库 mysql> SHOW DATABASES; ​ 重要记录 ​ - 数据目录:`/var/lib/mysql` - 配置文件:`/etc/my.cnf` - 日志文件:`/var/log/mysqld.log` - PID 文件:`/var/run/mysqld/mysqld.pid` - Socket 文件:`/var/lib/mysql/mysql.sock` ``` ![](https://i-blog.csdnimg.cn/direct/c1996d0a0b864c729d52d00b1d7c3b98.gif) #### msyql集群搭建 ##### 说明 * 搭建主-主集群,两个节点都是主库,也都属于对方的从库,也就是两者之间会相互同步数据,这时为了防止主键出现冲突,一般都会通过设置数据库自增步长的方式来防重 * 主-主架构集群适用于中读写请求的比例对半开,同时整体的并发量也不算低,至少超出了单库的承载阈值的场景下,架构图如下 ![img](https://i-blog.csdnimg.cn/direct/feed74eb747745dc960db390fad1c377.png)![](https://i-blog.csdnimg.cn/direct/0512b597113d40a1afadcd47d8748c6e.gif)编辑 #### MySQL双主集群搭建 * 两台服务器信息如下: | 主机名 | IP地址 | 系统 / 软件 | |---------|----------------|------------------------------| | matser1 | 172.25.254.128 | OpenEuler22.03 / MySql8.0.37 | | matser2 | 172.25.254.129 | OpenEuler22.03 / MySql8.0.37 | ##### 步骤 * 修改2个主节点的配置文件 * 创建一个用于同步数据的账号 * 建立2个主节点的相互复制 * 测试 ##### 主主复制配置 **master1配置 (/etc/my.cnf)(创建用于同步的账号):** ``` [root@master1 ~]# systemctl stop mysql ​ [root@master1 ~]# vim /etc/my.cnf [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 ​ ​ ​ server-id=1 log-bin=mysql-bin-log binlog-ignore-db=mysql binlog_format=mixed max_binlog_size=1024M relay_log=mysql-relay-log log_bin_trust_function_creators=true slave_skip_errors=1062 auto_increment_offset=1 auto_increment_increment=2 ``` ![](https://i-blog.csdnimg.cn/direct/ae944816c0d9489c97fad4b2de54ce9e.gif) ``` [root@master1 ~]# systemctl start mysql ​ [root@master1 ~]# mysql -uroot -p ​ mysql> create user 'mback'@'%' identified with mysql_native_password by '123456'; Query OK, 0 rows affected (0.01 sec) ​ mysql> grant replication slave on *.* to 'mback'@'%'; Query OK, 0 rows affected (0.00 sec) ``` ![](https://i-blog.csdnimg.cn/direct/08ea83448fe048069b58960c385907ec.gif) **master2配置 (/etc/my.cnf)(创建用于同步的账号):** ``` [root@master2 ~]# systemctl stop mysql ​ [root@master2 ~]# vim /etc/my.cnf [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 ​ ​ ​ server-id=2 log-bin=mysql-bin-log binlog-ignore-db=mysql binlog_format=mixed max_binlog_size=1024M relay_log=mysql-relay-log log_bin_trust_function_creators=true slave_skip_errors=1062 auto_increment_offset=2 auto_increment_increment=2 ``` ![点击并拖拽以移动](https://i-blog.csdnimg.cn/img_convert/bede5bc8d7ca0b966459676c4fce2281.png) ``` [root@master2 ~]# systemctl start mysql ​ [root@master2 ~]# mysql -uroot -p ​ mysql> create user 'mback'@'%' identified with mysql_native_password by '123456'; Query OK, 0 rows affected (0.01 sec) ​ mysql> grant replication slave on *.* to 'mback'@'%'; Query OK, 0 rows affected (0.00 sec) ``` ![](https://i-blog.csdnimg.cn/direct/ce86de58299245989c3d0f4b67d5090a.gif) ##### 3.3.3 主从关系建立 **master1指向master2:** ``` mysql> change master to master_host='192.168.88.162',master_user='mback',master_password='123456',master_port=3306,master_log_file='mysql-bin-log.000001',master_log_pos=672; Query OK, 0 rows affected, 9 warnings (0.01 sec) ​ mysql> start slave; Query OK, 0 rows affected, 1 warning (0.01 sec) ​ mysql> show  slave status\G *************************** 1. row ***************************               Slave_IO_State: Waiting for source to send event                 Master_Host: 192.168.88.162                 Master_User: mback                 Master_Port: 3306               Connect_Retry: 60             Master_Log_File: mysql-bin-log.000001         Read_Master_Log_Pos: 672               Relay_Log_File: mysql-relay-log.000002               Relay_Log_Pos: 330       Relay_Master_Log_File: mysql-bin-log.000001             Slave_IO_Running: Yes   # 这里必须为yes           Slave_SQL_Running: Yes   # 这里必须为yes ``` ![](https://i-blog.csdnimg.cn/direct/14d5ee6eafc14f7c8cb71312c547b6ed.gif) **master2指向master1:** ``` mysql> change master to master_host='192.168.88.161',master_user='mback',master_password='123456',master_port=3306,master_log_file='mysql-bin-log.000001',master_log_pos=672; Query OK, 0 rows affected, 9 warnings (0.01 sec) ​ mysql> start slave; Query OK, 0 rows affected, 1 warning (0.01 sec) ​ mysql> show  slave status\G *************************** 1. row ***************************               Slave_IO_State: Waiting for source to send event                 Master_Host: 192.168.88.161                 Master_User: mback                 Master_Port: 3306               Connect_Retry: 60             Master_Log_File: mysql-bin-log.000001         Read_Master_Log_Pos: 672               Relay_Log_File: mysql-relay-log.000002               Relay_Log_Pos: 330       Relay_Master_Log_File: mysql-bin-log.000001             Slave_IO_Running: Yes  # 这里必须为yes           Slave_SQL_Running: Yes  # 这里必须为yes ``` ![](https://i-blog.csdnimg.cn/direct/1f527d819ec149cea7e4f31076f93c40.gif) ##### 复制状态验证 两台主机均显示: ``` Slave_IO_Running: Yes Slave_SQL_Running: Yes ``` ![](https://i-blog.csdnimg.cn/direct/9166acba2d7b43cb9375a0b016103f63.gif) #### 数据同步测试 ``` 数据库创建测试 ​ 在master1创建数据库: ​ CREATE DATABASE test1; ​ 在master2验证同步成功。 表结构同步测试 ​ 在master2创建表: ​ USE test1; CREATE TABLE back_test (     user_id INT(8) NOT NULL,     user_name VARCHAR(255) NOT NULL,     user_sex VARCHAR(255) NOT NULL,     password VARCHAR(255) NOT NULL,     register_time DATETIME ); ​ 在master1验证表结构同步成功。 ``` ![](https://i-blog.csdnimg.cn/direct/21c38e15e6a04430a41c84cb0ce36d6b.gif) #### Keepalived高可用配置 ##### Keepalived安装 ``` [root@master1 ~] yum install keepalived -y ``` ![](https://i-blog.csdnimg.cn/direct/e077d278240d4169b3860f8a6bc22adb.gif) ##### master1配置 ``` [root@master1 ~] vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs {   router_id mysql-master01 } vrrp_instance VI_1 {     state BACKUP     interface ens32     virtual_router_id 51     priority 100     nopreempt     advert_int 1     authentication {         auth_type PASS         auth_pass 1111     }     virtual_ipaddress {         172.25.254.200     } } virtual_server 172.25.254.200 3306 {     delay_loop 6     lb_algo rr     lb_kind DR     persistence_timeout 50     protocol TCP     real_server 172.25.254.128 3306 {     notify_down /etc/keepalived/chk_mysql.sh         weight 1         TCP_CHECK {             connect_port 3306             connect_timeout 3             retry 3             delay_before_retry 3         }     } } ``` ![image-20251130112053296](https://i-blog.csdnimg.cn/img_convert/88813a74b476af110039846c16b78be5.png) ![](https://i-blog.csdnimg.cn/direct/4664a5b2a81648cab501b38e0d150611.gif) ##### MySQL健康检查脚本 ``` [root@master1 ~] vim /etc/keepalived/chk_mysql.sh #!/bin/bash counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${counter}" -eq 0 ]; then     killall keepalived fi chmod +x /etc/keepalived/chk_mysql.sh ``` ![image-20251130111955650](https://i-blog.csdnimg.cn/img_convert/835d9ee91e2385eb2812ec3e8d5edf49.png) ![](https://i-blog.csdnimg.cn/direct/b0d2d2cb1af040ae832f31a7c30c0052.gif) ``` [root@master1 ~]# chmod +x /etc/keepalived/chk_mysql.sh ​ [root@master1 ~]# systemctl start keepalived ​ [root@master1 ~]# systemctl status keepalived ● keepalived.service - LVS and VRRP High Availability Monitor     Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)     Active: active (running) since Wed 2024-08-14 09:02:49 CST; 15min ago ​ ​ [root@master1 ~]# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00   inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever   inet6 ::1/128 scope host       valid_lft forever preferred_lft forever 2: ens32: mtu 1500 qdisc fq_codel state UP group default qlen 1000   link/ether 00:0c:29:da:f3:cc brd ff:ff:ff:ff:ff:ff   inet 172.25.254.128/24 brd 192.168.88.255 scope global noprefixroute ens32       valid_lft forever preferred_lft forever   inet 172.25.254.200/32 scope global ens32         valid_lft forever preferred_lft forever   inet6 fe80::20c:29ff:feda:f3cc/64 scope link noprefixroute       valid_lft forever preferred_lft forever ``` ![](https://i-blog.csdnimg.cn/direct/449dcd86ca514194ba887a33e15fd3f1.gif) ##### master2配置 配置与master1类似,主要差异: * router_id: mysql-master02 * priority: 50 * real_server: 172.25.254.129 #### 高可用性测试 ##### 故障转移测试 1. 初始状态:VIP在master1 (172.25.254.128) 2. 停止master1的MySQL服务:`systemctl stop mysql` 3. 观察结果:VIP自动漂移到master2 (172.25.254.129) 4. 数据库服务持续可用,应用程序无感知 ##### 故障恢复测试 1. 恢复master1的MySQL服务:`systemctl start mysql` 2. 启动master1的Keepalived:`systemctl start keepalived` 3. 观察结果:服务正常,VIP保持在master2(非抢占模式) 4. ![屏幕截图 2025-11-29 182148](https://i-blog.csdnimg.cn/img_convert/b028a632638e8eae318814c87d04dc9b.png) #### 监控平台部署 ##### mysqld_exporter部署 ``` [root@monitor ~]# tar xvf mysqld_exporter-0.15.1.linux-amd64.tar.gz ​ [root@monitor ~]# mv mysqld_exporter-0.15.1.linux-amd64 /usr/local/mysqld_exporter ​ ​ [root@monitor mysqld_exporter]# vim .my.cnf # 注意为隐藏文件 [client] user = exporter           password = 123456       host = 172.25.254.200   port = 3306 ``` ![](https://i-blog.csdnimg.cn/direct/353ec66805204f7fb6e2ada2fef3499a.gif) 两台MySQL节点创建用户并授权 ``` # master1操作 [root@master1 ~]# mysql -uroot -p Enter password: mysql> create user 'exporter'@'%' identified with mysql_native_password by '123456'; Query OK, 0 rows affected (0.01 sec) ​ mysql> grant process, replication client, select on *.* to 'exporter'@'%'; Query OK, 0 rows affected (0.00 sec) ​ mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) ​ mysql> exit ​ ​ # master2操作,由于设置了主-主集群架构,master1创建账户后会同步到master2,只需查看即可 [root@master2 ~]# mysql -uroot -p Enter password: ​ mysql> select user ,host from mysql.user; +------------------+-----------+ | user             | host      | +------------------+-----------+ | exporter         | %         |    # 已经同步 | mback            | %         | | mysql.infoschema | localhost | | mysql.session    | localhost | | mysql.sys        | localhost | | root             | localhost | +------------------+-----------+ 6 rows in set (0.00 sec) ​ mysql> exit ``` ![屏幕截图 2025-11-29 184105](https://i-blog.csdnimg.cn/img_convert/e38611def1b9c70f62059d1e956809bf.png) ![点击并拖拽以移动](https://i-blog.csdnimg.cn/img_convert/a5d53cfe764dcd66fd0f6811b6505c6b.png) 配置系统服务 ``` [root@monitor ~]# vim /usr/lib/systemd/system/mysqld_exporter.service [Unit] Description=https://prometheus.io ​ [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 ​ [root@monitor ~]# systemctl daemon-reload ​ [root@monitor ~]# systemctl start mysqld_exporter.service ​ [root@monitor ~]# systemctl enable mysqld_exporter.service ​ [root@monitor ~]# systemctl status mysqld_exporter.service ``` ![](https://i-blog.csdnimg.cn/direct/641b96a45b3e4076b074865277fdea79.gif) 用浏览器监控抓取mysql服务器的数据 ![屏幕截图 2025-11-29 185006](https://i-blog.csdnimg.cn/img_convert/23ab8a421305ab878d3e640417ffb135.png) ##### Prometheus部署 ``` [root@monitor ~]# tar xvf prometheus-2.53.2.linux-amd64.tar.gz ​ [root@monitor ~]# mv prometheus-2.53.2.linux-amd64 /usr/local/prometheus ​ ​ #创建专用用户 [root@monitor ~]# useradd --no-create-home --shell /bin/false prometheus ​ [root@monitor ~]# chown -R prometheus:prometheus /usr/local/prometheus ``` ![](https://i-blog.csdnimg.cn/direct/201e35e381044fc384c396ac73ec2585.gif) ``` # 配置系统服务 [root@monitor ~]# systemctl daemon-reload ​ [root@monitor ~]# systemctl enable --now prometheus ​ [root@monitor ~]# systemctl status prometheus ``` ![](https://i-blog.csdnimg.cn/direct/752fdb517cc74d2ca42393481c9f0e0f.gif) ![屏幕截图 2025-11-29 185608](https://i-blog.csdnimg.cn/img_convert/34bc79dbbe9fa367535fa5ec246eabb5.png) Mysqld_exporter对接Prometheus(添加下面的内容) ``` [root@monitor ~]# vim /usr/local/prometheus/prometheus.yml ​ - job_name: "mysql"   static_configs:      - targets: ["192.168.88.163:9104"]       labels:         instance: mysqld_exporter ``` ![点击并拖拽以移动](https://i-blog.csdnimg.cn/img_convert/f00c566dfef2ae1c4c721300efeac397.png) 重启服务 ``` [root@monitor ~]# systemctl restart prometheus ``` ![](https://i-blog.csdnimg.cn/direct/ec7fb67bc23d49118a5ac904cfc0635c.gif) ##### Grafana部署 ``` [root@monitor ~]# yum install grafana-enterprise-11.1.2-1.x86_64.rpm -y ``` ![](https://i-blog.csdnimg.cn/direct/5a5a052f60e0435994a903a5902779bd.gif) 修改配置文件 ``` [root@monitor ~]# vim /etc/grafana/grafana.ini ​ [server] protocol = http       ;min_tls_version = "" ;http_addr = http_port = 3000       domain = localhost     ;enforce_domain = false root_url = %(protocol)s://%(domain)s:%(http_port)s/ ``` ![](https://i-blog.csdnimg.cn/direct/8b43c83c78e24039bbd2a167da600e1c.gif) ``` [root@monitor ~]# systemctl enable --now grafana-server ​ [root@monitor ~]# systemctl status grafana-server ``` ![](https://i-blog.csdnimg.cn/direct/3e08caa6f68f49cd84ccad376f08d94f.gif) #### 监控平台配置 ##### 数据源配置 * Grafana地址:[http://172.25.254.130:3000](http://172.25.254.130:3000/ "http://172.25.254.130:3000") * 初始账号/密码:admin/admin * 配置Prometheus数据源:[http://172.25.254.130:9090](http://172.25.254.130:9090/ "http://172.25.254.130:9090") ##### 监控仪表盘 * 使用MySQL监控模板ID:7362 * 成功展示关键指标: * 数据库连接数 * 查询性能 * 复制状态 * 系统资源使用情况 ![f94a2459fbb8f8e0fd73a6aff106ba7e](https://i-blog.csdnimg.cn/img_convert/38d29cbfc30882a32d06b73ecfe6d5fa.jpeg) ### 压力测试与性能验证 #### 压力测试配置 ``` # 调整MySQL最大连接数 vim /etc/my.cnf max_connections=1024 systemctl restart mysql # 执行压力测试 mysqlslap --defaults-file=/etc/my.cnf \ --concurrency=200,400 \ --iterations=1 \ --number-int-cols=50 \ --number-char-cols=60 \ --auto-generate-sql \ --auto-generate-sql-add-autoincrement \ --auto-generate-sql-load-type=mixed \ --engine=innodb \ --number-of-queries=2000 \ -uroot -p123456 --verbose ``` #### 测试结果 ![34f803b7a261a5ea6dc8fab47630e916](https://i-blog.csdnimg.cn/img_convert/bcdc6efd615e5abb1f439044ad03bcdf.jpeg) ### 实验成果 通过这次为期两天的实践项目,我成功搭建了一套完整的MySQL高可用集群和监控系统。最大的收获就是真正把课堂上学到的主从复制、高可用这些概念变成了可以实际运行的架构。一开始觉得双主复制配置很复杂,特别是在配置自增步长和同步参数时遇到了不少问题,但通过反复查阅文档和测试,最终实现了两个MySQL节点之间的数据实时同步。 在搭建Keepalived高可用环节,我深刻体会到了故障自动转移的魅力。当主动停掉master1的MySQL服务时,虚拟IP在几十秒内就自动漂移到了master2,整个过程业务完全无感知。这种"故障自愈"的能力让我对生产环境的高可用架构有了更直观的认识。 监控平台的搭建同样让我受益匪浅。之前只知道Prometheus、Grafana这些名词,这次亲手配置了mysqld_exporter采集指标,在Grafana上看着实时更新的监控图表,真正感受到了数据可视化的力量。特别是在压力测试时,通过仪表盘清晰看到数据库的各项性能指标变化,这种直观的反馈让我对系统运行状态有了更好的把握。 ### 实验总结 回顾整个项目过程,这不仅仅是一次技术实践,更是一次完整的问题解决能力训练。从环境准备到软件安装,从配置调试到故障排查,每个环节都遇到了不同的问题。比如在配置主从复制时因为server-id冲突导致同步失败,在部署Keepalived时因为防火墙配置导致VIP无法漂移,这些问题虽然让人头疼,但解决后的成就感也是实实在在的。 通过这次实验,我不仅掌握了MySQL集群搭建的具体步骤,更重要的是学会了如何设计一个高可用的系统架构。理解了为什么要在双主架构中配置不同的自增步长,明白了Keepalived如何通过VRRP协议实现故障检测,知道了监控系统各个组件之间的协作关系。这些知识不再是孤立的概念,而是形成了一个完整的知识体系。 这次项目让我意识到,理论知识必须通过实践才能真正掌握。虽然过程中遇到了很多困难,但正是这些困难让我成长最快。现在我对数据库高可用架构有了更深入的理解,也对自己未来从事运维相关工作充满了信心。相信这次项目经历不仅丰富了我的简历,更重要的是为我后续的学习和工作打下了坚实的基础。

相关推荐
w***4241 小时前
【mysql部署】在ubuntu22.04上安装和配置mysql教程
android·mysql·adb
s***41131 小时前
MySQL——表的约束
数据库·mysql
yeshihouhou1 小时前
redis主从复制
数据库·redis·缓存
e***75391 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
android·sql·mysql
z***43841 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
x***01061 小时前
Mysql之主从复制
android·数据库·mysql
c***42101 小时前
python的sql解析库-sqlparse
数据库·python·sql
不穿格子的程序员1 小时前
MySQL篇1——MySQL深度揭秘:事务隔离级别与 MVCC 原理详解
数据库·mysql·innodb·mvcc·事务隔离级别
v***7941 小时前
MySQL篇之对MySQL进行参数优化,提高MySQL性能
数据库·mysql