当前位置: 首页 > news >正文

MYSQL数据库集群高可用和数据监控平台(详细版)

项目说明

概述

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

  • MYSQL集群高可用属于云原生高级课数据库运维部分的知识

  • 数据监控平台属于云原生拔高项目,旨在让学生增加知识面,提高项目实习经历,充实简历

业务需求

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

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

  • 具体要求

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

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

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

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

项目设计思路

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

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

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

项目特点

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

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

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

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

项目背景知识

MySQL中的主从复制技术

  • MySQL是基于它自身的Bin-log日志来完成数据的异步复制,因为Bin-log日志中会记录所有对数据库产生变更的语句,包括DML数据变更和DDL结构变更语句,数据的同步过程如下:

集群机构模式

一主一从/多从架构
  • 一主一从或一主多从,这是传统的主从复制模型,也就是多个主从节点组成的集群中,只有一个主节点,剩余的所有节点都为其附属关系,结构如下:

双主/多主架构
  • 若公司项目中读写请求的比例对半开,同时整体的并发量也不算低,至少超出了单库的承载阈值,这时就可以选用双主/多主架构,结构如下:

keepalived高可用方案

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

可视化监控平台三件套

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

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

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

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

项目正式开始:

项目环境

软硬件环境清单

  • 软件下载地址:迅雷云盘

项目任务清单

系统平台部署

  • 安装VmWare17

  • 虚拟出三台计算机

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

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

安装2台MySql服务器

  • 使用二进制包进行安装

  • 配置MySql系统服务

部署高可用MySql双主集群

  • 配置账户

  • 配置主主复制

  • 安装keepalived并配置

安装配置监控平台

  • 安装Mysqld_Exporter+Prometheus+grafana-enterprise

  • 配置监控平台组件

压力测试

项目实现步骤

三台主机已安装环境配置

设置三台主机名

[root@localhost ~]# hostnamectl  set-hostname  master1
[root@localhost ~]# hostnamectl  set-hostname  master2
[root@localhost ~]# hostnamectl  set-hostname  monitor

 关闭三台主机防火墙及SELinux

vi  /etc/selinux/config 
SELINUX=disabledsystemctl stop  firewalld     # 关闭防火墙
systemctl disable  firewalld  # 取消开机启动
reboot                        # 重启

 三台主机下载所需软件并升级

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

三台主机重新设置登录系统密码

 passwd root

例如master主机(密码为123456) 

 三台主机时间同步

vim  /etc/chrony.conf 
# 定位第3行,删除后添加阿里的时间同步服务地址
server   ntp.aliyun.com   iburstsystemctl restart  chronydchronyc  sources  -v                 # 多执行几次timedatectl

显示:

生产环境二进制包安装MySql

注意:2台MySql服务器安装过程相同,以下以master1主机为例

master1

下载安装包

下载在电脑上通过xftp拉过去并解压缩

[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

使用前的准备

# 移动到默认安装目录,也可自行修改
[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 

初始化软件
[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 服务器的脚本


# 注意:此时上述命令执行完毕处于后台运行状态,需要另行启动一个终端 

mysql的初始密码是:例如我的:7g,P,:j2gDdL ,每个人都不一样

[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[root@master1 ~]# bin/mysql -u root -p
Enter password:   # 粘贴之前的初始密码

进入mysql后进行以下操作:

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

查看mysql进程并关闭运行的mysql 

[root@master1 ~]# ps -ef | grep mysql[root@master1 ~]# kill  -9  pid号   # 在当前终端关闭运行的mysql

设置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

配置启动脚本
[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 # 开机启动[root@master1 ~]# mysql  -uroot -pmysql> update mysql.user set host="%" where user="root";mysql> flush privileges;mysql> exit

注意(可选)

mysql安装完毕后需要做快照

若选择安装完毕后进行克隆主机作为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文件重启即可重新生成

master2

解压缩
[root@master2 ~]# tar  xvf  mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
[root@master2 ~]# cd  mysql-8.0.37-linux-glibc2.17-x86_64
[root@master2 mysql-8.0.37-linux-glibc2.17-x86_64]# ls
bin  docs  include  lib  LICENSE  man  README  share  support-files
[root@master2 mysql-8.0.37-linux-glibc2.17-x86_64]# 

 使用前的准备
# 移动到默认安装目录,也可自行修改
[root@master2 mysql-8.0.37-linux-glibc2.17-x86_64]# cd ~
[root@master2 ~]#  mv  mysql-8.0.37-linux-glibc2.17-x86_64  /usr/local/mysql
[root@master2 ~]#  cd /usr/local/mysql   
[root@master2 mysql]#  groupadd mysql   # 创建名为mysql的用户组
[root@master2 mysql]# useradd -r -g mysql -s /bin/false mysql # 创建名为 mysql的系统用户,将其添加到mysql用户组中,并设置其登录shell为/bin/false,以限制该用户的登录权限
[root@master2 mysql]# mkdir data    # 创建用于存放MySQL数据文件目录
# 设置mysql目录的账户及工作组,生产环境中不要使用root	
[root@master2 mysql]# chown -R mysql:mysql /usr/local/mysql 
[root@master2 mysql]# 

 初始化软件
[root@master2 mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # 注意:需要复制密码[root@master2 mysql]# bin/mysqld_safe --user=mysql &  # 使用后台方式以mysql用户身份启动 MySQL 服务器,mysqld_safe 是一个用于启动和监控 MySQL 服务器的脚本

# 注意:此时上述命令执行完毕处于后台运行状态,需要另行启动一个终端 

mysql的初始密码是:例如我的: uYg%Z-e:f2aB 

[root@master2 ~]# ps  -ef | grep  mysql  
root        5557    5158  0 21:40 pts/0    00:00:00 /bin/sh bin/mysqld_safe --user=mysql
mysql       5639    5557  2 21:40 pts/0    00:00:03 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=master2.err --pid-file=master2.pid
root        5753    5689  0 21:42 pts/1    00:00:00 grep --color=auto mysql
[root@master2 ~]# cd  /usr/local/mysql
[root@master2 mysql]# bin/mysql -uroot -p 
bin/mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
[root@master2 mysql]# ln -s /usr/lib64/libncurses.so.6.3 /usr/lib64/libncurses.so.5
[root@master2 mysql]# ln -s /usr/lib64/libtinfo.so.6.3 /usr/lib64/libtinfo.so.5
[root@master2 mysql]# bin/mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.37Copyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

进入·mysql进行以下操作:

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

[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
​
[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
设置mysql的配置文件
# 回到之前的终端,敲一个回车,显示进程以杀死
[root@master2 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
配置启动脚本
[root@master2 ~]# cd  /usr/local/mysql/support-files
[root@master2 support-files]# cp -a mysql.server /etc/init.d/mysql
[root@master2 support-files]# vim  /etc/init.d/mysql  # 增加=之后的内容
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data[root@master2 init.d]# cd  ~ 
[root@master2 ~]# vim  ~/.bash_profile   # 设置环境变量需添加如下语句
export PATH=$PATH:/usr/local/mysql/bin[root@master2 ~]#  source  ~/.bash_profile
[root@master2 ~]# systemctl daemon-reload
[root@master2 ~]#  systemctl start mysql
[root@master2 ~]# /usr/lib/systemd/systemd-sysv-install enable mysql
[root@master2 ~]# mysql  -uroot -pmysql> update mysql.user set host="%" where user="root";
mysql> flush privileges;
mysql> exit

 msyql集群搭建

说明
  • 搭建主-主集群,两个节点都是主库,也都属于对方的从库,也就是两者之间会相互同步数据,这时为了防止主键出现冲突,一般都会通过设置数据库自增步长的方式来防重

  • 主-主架构集群适用于中读写请求的比例对半开,同时整体的并发量也不算低,至少超出了单库的承载阈值的场景下,架构图如下:

两台服务器信息如下:

注意:两台机子的server-uuid不能相同

步骤

修改2个主节点的配置文件

创建一个用于同步数据的账号

建立2个主节点的相互复制

测试

master1节点配置

修改配置文件

[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# 开启bin-log日志,并为bin-log日志取个前缀名(有默认值可不写)
log-bin=mysql-bin-log# 同步复制时过滤的库(主要将一些不需要备份/同步库写进来)
# 也可以通过binlog-do-db=xx1,xx2... 来指定要复制的目标库
binlog-ignore-db=mysql# 指定bin-log日志的格式为混合模式(默认为statement)
binlog_format=mixed# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M# ------从节点配置-------
# 开启relay-log日志(同样可以指定前缀名)
relay_log=mysql-relay-log# 开启存储过程、函数、触发器等内容的同步功能
log_bin_trust_function_creators=true# 同步执行跳过一些错误码(防止同步写入时出现错误导致复制中断)
slave_skip_errors=1062# ------自增序列配置-------
# 设置自增初始值为1
auto_increment_offset=1# 设置自增步长为2,自增序列为{1、3、5、7、9.....}
auto_increment_increment=2

  • 注意

    • server-id=1,为集群中本机标识,必须唯一

    • 由于master1即使主节点又是从节点,则必须设置从节点配置

    • 为了保证2个节点数据的一致性,需要开启自增序列配置,master1节点跳步为1 3 5 7 9...

  • 创建用于数据同步的账号m1

[root@master1 ~]# systemctl start mysql[root@master1 ~]# mysql -uroot -pmysql> 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)

 

master2节点配置

修改配置文件

[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# 开启bin-log日志,并为bin-log日志取个前缀名(有默认值可不写)
log-bin=mysql-bin-log# 同步复制时过滤的库(主要将一些不需要备份/同步库写进来)
# 也可以通过binlog-do-db=xx1,xx2... 来指定要复制的目标库
binlog-ignore-db=mysql# 指定bin-log日志的格式为混合模式(默认为statement)
binlog_format=mixed# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M# ------从节点配置-------
# 开启relay-log日志(同样可以指定前缀名)
relay_log=mysql-relay-log# 开启存储过程、函数、触发器等内容的同步功能
log_bin_trust_function_creators=true# 同步执行跳过一些错误码(防止同步写入时出现错误导致复制中断)
slave_skip_errors=1062# ------自增序列配置-------
# 设置自增初始值为2
auto_increment_offset=2# 设置自增步长为2,自增序列为{1、3、5、7、9.....}
auto_increment_increment=2

  • 注意:

    • master2节点的server-id=2,不能和master1的server-id相同

    • 设置自增初始值为2,则master2节点跳步为2 4 6 8 ...

  • 创建用于数据同步的账号m2

[root@master2 ~]# systemctl start mysql[root@master2 ~]# mysql -uroot -pmysql> 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)

 建立master1 节点主从关系

由于建立的是主-主架构集群,相互为对方的从节点,则两个节点都通过root账号登录

此时master1为从节点,master2为主节点

先在master2上查看同步的日志名称及同步点号

# 注意:在master2上执行

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql-bin-log.000001 |      664 |              | mysql            |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

# 日志文件:mysql-bin-log.000001
# 日志数据点:664

在master1 节点上建立复制关系:

mysql> change master to master_host='192.168.194.133',master_user='mback',master_password='123456',master_port=3306,master_log_file='mysql-bin-log.000001',master_log_pos=664;
Query OK, 0 rows affected, 9 warnings (0.01 sec)mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)mysql> show  slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.194.133Master_User: mbackMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin-log.000001Read_Master_Log_Pos: 664Relay_Log_File: mysql-relay-log.000002Relay_Log_Pos: 330Relay_Master_Log_File: mysql-bin-log.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 664Relay_Log_Space: 540Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2Master_UUID: 4a66e70d-2da4-11f0-9cb6-000c29b752f9Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

   Slave_IO_Running: Yes  # 这里必须为yes
   Slave_SQL_Running: Yes  # 这里必须为yes

建立master2 节点主从关系

 此时master2为从节点,master1为主节点

先在master1上查看同步的日志名称及同步点号

# 注意:在master1上执行

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql-bin-log.000001 |      664 |              | mysql            |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

# 日志文件:mysql-bin-log.000001
# 日志数据点:664

master2节点上建立复制关系:

mysql>  change master to master_host='192.168.194.132',master_user='mback',master_password='123456',master_port=3306,master_log_file='mysql-bin-log.000001',master_log_pos=664;
Query OK, 0 rows affected, 9 warnings (0.03 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 eventMaster_Host: 192.168.194.132Master_User: mbackMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin-log.000001Read_Master_Log_Pos: 664Relay_Log_File: mysql-relay-log.000002Relay_Log_Pos: 330Relay_Master_Log_File: mysql-bin-log.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 664Relay_Log_Space: 540Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: 0204f8e2-2d9e-11f0-979a-000c29aad32fMaster_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

局部测试

 测试主主架构是否能相互同步数据

master1执行,master2查看

master1上建立数据库

在master2上查看是否同步

此时master1(主)--master2(从)构建完毕!

master2执行,master1查看

 master2中执行创建表

mysql> use test1;mysql> create table back_test  (`user_id`int(8) not null,`user_name` varchar(255) not null,`user_sex` varchar(255) not null,`passwordd` varchar(255) not null,`register_time` datetime);
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> desc  back_test;

在master1上查看是否有同步表数据

mysql> use test1;
mysql> desc  back_test;

 至此master1(从)--master2(主)构建完毕!

Keepalived故障转移的高可用环境

说明
  • Keepalived即保持存活,是一种轻量化的高可用方案,用来防止单点故障

  • Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。

  • Keepalived通过VIP虚拟IP的漂移实现高可用,在相同集群内发送组播包,master1和master2主通过VRRP协议发送组播包,告诉从主的状态。

  • Keepalived会虚拟出一个VIP地址代理2台服务器向外界提供服务

  • 当Keepalived实际代理master1时,若master1出现故障,keepalived通过自身机制,自动将master2作为实际代理主服务器,不需要人工干预去修改mysql配置信息,从而实现了高可用

 

步骤
  • 2台MySql服务器安装keepalived软件包

  • 配置服务

  • 模拟故障进行测试

master1节点配置

安装安装包

[root@master1 ~]# yum  install  keepalived -y

master1节点配置keepalived

[root@master1 ~]# vim  /etc/keepalived/keepalived.conf
# 删除所有,拷贝下列配置数据
! Configuration File for keepalivedglobal_defs {router_id mysql-master01   # keepalived服务器的一个标识,每台机子不同
}vrrp_instance VI_1 {state BACKUP      # 指定keepalived的角色, BACKUP模式将根据优先级决定主或>从interface ens33   # 监测的网卡名virtual_router_id 51  # 虚拟路由标识,确保和master2相同priority 100      # 用来选举master的数值nopreemptadvert_int 1authentication {    # 认证区域auth_type PASSauth_pass 1111}virtual_ipaddress {   # 指定VIP地址192.168.194.200}
}# 虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
virtual_server 192.168.194.200 3306 {delay_loop 6            # 设置运行情况检查时间,单位是秒lb_algo rr              # 设置后端调度算法lb_kind DR              # 设置LVS实现负载均衡的机制persistence_timeout 50  # 会话保持时间,单位是秒protocol TCP            # 指定转发协议类型real_server 192.168.194.132 3306 { # 真实服务器IP地址及端口notify_down /etc/keepalived/chk_mysql.shweight 1        # 配置服务节点的权值TCP_CHECK {connect_port 3306     # 健康检查端口connect_timeout 3     # 连接超时时间retry 3               # 重连次数delay_before_retry 3  # 重连间隔时间}}
}

# 配置mysql健康检查脚本


[root@master1 ~]# vim  /etc/keepalived/chk_mysql.sh#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; thenkillall keepalived
fi# 通过端口记录数判断mysql是否运行,mysql停止后终止keepalived,当然也可以在抢救一下

[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 MonitorLoaded: 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
# 点击q键退出[root@master1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:aa:d3:2f brd ff:ff:ff:ff:ff:ffinet 192.168.194.132/24 brd 192.168.194.255 scope global dynamic noprefixroute ens33valid_lft 1038sec preferred_lft 1038secinet 192.168.194.200/32 scope global ens33   # 注意会产生新的VIPvalid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feaa:d32f/64 scope link noprefixroute valid_lft forever preferred_lft forever

master2节点配置

安装安装包

[root@master2 ~]# yum  install  keepalived -y

 master2节点配置keepalived

vim  /etc/keepalived/keepalived.conf
# 删除所有,拷贝下列配置数据
! Configuration File for keepalivedglobal_defs {router_id mysql-master02     # 注意与master1区分开来
}vrrp_instance VI_1 {state BACKUPinterface ens33            # 注意网卡接口名virtual_router_id 51priority 50                # 注意选举参数nopreemptadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.194.200}
}virtual_server 192.168.194.200 3306 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.194.133 3306 {    # master2地址及端口notify_down /etc/keepalived/chk_mysql.shweight 1TCP_CHECK {connect_port 3306connect_timeout 3 retry 3               delay_before_retry 3}}
}
~         

 

 # 配置mysql健康检查脚本

[root@master2 ~]# vim  /etc/keepalived/chk_mysql.sh#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; thenkillall keepalived
fi

[root@master2 ~]# chmod  +x  /etc/keepalived/chk_mysql.sh  [root@master2 ~]# systemctl start keepalived[root@master2 ~]# systemctl status keepalived

局部测试

原理:当master1服务器宕机后,VIP会自动漂移至master2服务器并继续向外提供mysql服务

步骤:

  • 在master1中停用mysql

  • 查看VIP是否漂移

  • 故障修复

master1中执行

[root@master1 ~]# systemctl status mysql    # 查看mysql状态
● mysql.service - LSB: start and stop MySQLLoaded: loaded (/etc/rc.d/init.d/mysql; generated)Active: active (running) since Wed 2024-08-14 09:02:44 CST; 26min ago[root@master1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability MonitorLoaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)Active: active (running) since Wed 2024-08-14 09:02:49 CST; 26min ago

 

[root@master1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:aa:d3:2f brd ff:ff:ff:ff:ff:ffinet 192.168.194.132/24 brd 192.168.194.255 scope global dynamic noprefixroute ens33valid_lft 1740sec preferred_lft 1740secinet 192.168.194.200/32 scope global ens33  #新IPvalid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feaa:d32f/64 scope link noprefixroute valid_lft forever preferred_lft forever[root@master1 ~]# systemctl stop mysql   # 模拟宕机[root@master1 ~]# ip a                  # VIP消失
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:aa:d3:2f brd ff:ff:ff:ff:ff:ffinet 192.168.194.132/24 brd 192.168.194.255 scope global dynamic noprefixroute ens33valid_lft 1668sec preferred_lft 1668secinet6 fe80::20c:29ff:feaa:d32f/64 scope link noprefixroute valid_lft forever preferred_lft forever[root@master1 ~]# systemctl status keepalived    # 已停用
○ keepalived.service - LVS and VRRP High Availability MonitorLoaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)Active: inactive (dead)

 

master2执行

[root@master2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:b7:52:f9 brd ff:ff:ff:ff:ff:ffinet 192.168.194.133/24 brd 192.168.194.255 scope global dynamic noprefixroute ens33valid_lft 1612sec preferred_lft 1612secinet 192.168.194.200/32 scope global ens33           # VIP已经漂移,继续服务valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feb7:52f9/64 scope link noprefixroute valid_lft forever preferred_lft forever

 master1中恢复msyql服务和keepalived服务,注意必须先恢复msyql服务

[root@master1 ~]# systemctl start mysql
[root@master1 ~]# systemctl start keepalived
[root@master1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:aa:d3:2f brd ff:ff:ff:ff:ff:ffinet 192.168.194.132/24 brd 192.168.194.255 scope global dynamic noprefixroute ens33valid_lft 1508sec preferred_lft 1508secinet6 fe80::20c:29ff:feaa:d32f/64 scope link noprefixroute valid_lft forever preferred_lft forever

# 即使master1恢复后,VIP不会被强占 

安装监控平台

涉及的软件及端口

部署Mysqld_exporter
  • Mysql_exporter是用来收集MysQL数据库相关指标且需要连接到数据库并有相关权限。

  • 下载安装包并解压缩:Download | Prometheus

 192.168.194.134monitor主机操作

[root@monitor ~]# ls
anaconda-ks.cfg  mysqld_exporter-0.15.1.linux-amd64.tar.gz
[root@monitor ~]# tar xvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
mysqld_exporter-0.15.1.linux-amd64/
mysqld_exporter-0.15.1.linux-amd64/LICENSE
mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter
mysqld_exporter-0.15.1.linux-amd64/NOTICE
[root@monitor ~]#  mv  mysqld_exporter-0.15.1.linux-amd64  /usr/local/mysqld_exporter
[root@monitor ~]#  cd  /usr/local/mysqld_exporter
[root@monitor mysqld_exporter]# ls
LICENSE  mysqld_exporter  NOTICE
[root@monitor mysqld_exporter]# 

常见配置文件

[root@monitor mysqld_exporter]# vim  .my.cnf  # 注意为隐藏文件
[client]
user = exporter          # 该账户需要再2台mysql节点新建
password = 123456        # 登录密码
host = 192.168.194.200    # 使用VIP访问
port = 3306

2台mysql节点创建用户并授权

 master1操作

[root@master1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 113
Server version: 8.0.37 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> create user 'exporter'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.02 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
Bye

# 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

配置mysqld_exporter的系统服务

 monitor节点操作

[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

 刷新服务配置并启动服务

# monitor节点操作
[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

 通过浏览器输入192.168.194.134:9104/metrics,查看监控抓取msyql服务器的数据

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

  • Prometheus于2016年加入了云原生计算基金会,成为继Kubernetes之后的第二个托管项目。

  • 架构图:

下载安装包并解压缩:Download | Prometheus ,选择2.53.2 LTS版本

monitor操作 

[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 ~]# cd /usr/local/prometheus
[root@monitor prometheus]# ls
console_libraries  consoles  LICENSE  NOTICE  prometheus  prometheus.yml  promtool
[root@monitor prometheus]# cd  ~

 新建prometheus账户

[root@monitor ~]# useradd --no-create-home --shell /bin/false prometheus
[root@monitor ~]# chown -R prometheus:prometheus /usr/local/prometheus

 配置prometheus系统服务

# monitor操作
[root@monitor ~]# vim  /usr/lib/systemd/system/prometheus.service[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.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
~                                  

刷新服务配置并启动服务

[root@monitor ~]# systemctl  daemon-reload[root@monitor ~]# systemctl enable  --now  prometheus[root@monitor ~]# systemctl  status  prometheus

通过浏览器输入http://192.168.194.134:9090/,查看管理页面

通过浏览器输入192.168.194.134:9090/metrics,查看监控数据

Mysqld_exporter对接Prometheus

# monitor操作,打开文件,添加如下内容,注意对齐格式,# 注意:是监控机IP和Mysqld_exporter端口
[root@monitor ~]# vim  /usr/local/prometheus/prometheus.yml-  job_name: "prometheus"static_configs:- targets: ["192.168.194.134:9090"]- job_name: "mysql"static_configs:- targets: ["192.168.194.134:9104"]labels:instance: mysqld_exporter
~                                  

 

重启Prometheus服务

[root@monitor ~]# systemctl restart prometheus

 输入http://192.168.194.134:9090测试是否监控MySql

部署Grafana
  • Grafana是一个功能强大、灵活性高、易于使用的数据可视化和监控工具,广泛应用于IT运维、应用性能监控、工业物联网等领域

  • 使用Grafana,用户可以轻松地创建各种图表、图形和面板,以直观和动态的方式展示数据趋势、指标和警报。其灵活的插件系统和丰富的图形化选项使用户能够根据自己的需求定制仪表板,并将其集成到现有的监控系统中

下载并解压缩:

[root@monitor ~]# yum  install grafana-enterprise-11.1.2-1.x86_64.rpm  -y

也可以在官网下载后用户xftp拉过来

修改配置文件

[root@monitor ~]# vim  /etc/grafana/grafana.ini
################################# Server #################################
[server]
# Protocol (http, https, h2, socket)
protocol = http       # 启用# This is the minimum TLS version allowed. By default, this value is empty. Accepted values are: TLS1.2, TLS1.3. If nothing is set TLS1.2 would be taken
;min_tls_version = ""# The ip address to bind to, empty will bind to all interfaces
;http_addr =# The http port  to use
http_port = 3000       # 启用# The public facing domain name used to access grafana from a browser
domain = localhost      # 启用# Redirect to correct domain if host header does not match domain
# Prevents DNS rebinding attacks
;enforce_domain = false# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
root_url = %(protocol)s://%(domain)s:%(http_port)s/    # 启用

启动

[root@monitor ~]# systemctl enable --now  grafana-server[root@monitor ~]# systemctl status grafana-server

 关联Promethues并设置仪表盘模版

# 浏览器其中输入:http://192.168.194.134:3000

# 初始账户/密码:admin/admin

# 设置新的密码:123456

# 在设置界面中选择Home > Connections > Data sources > prometheus

# 设置prometheus监听地址:http://192.168.194.134:9090

# save&test

# 选择监控模版来显示mysql的关键指标,模版ID为7362

这里记得按下面的保存save,要不然后面没有数据

结果:

压力测试

查看VIP所在服务器,停止当前节点的mysql,查看VIP是否漂移,刷新监控界面,

看是否高可用MySQL自带的压力测试工具——Mysqlslap

# 修改最大连接数
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

遇到的问题以及解决办法

1、监控数据页面出现问题

解决办法:这是时间不同步,再执行这三个命令:systemctl restart  chronyd,

                                                                               chronyc  sources  -v  

                                                                               timedatectl

2、在 主从复制中出现 Slave_IO_Running:Connecting,这是未成功建立

解决办法:可以再mysql界面输入命令show  slave status\G,有可能没反应过来

相关文章:

MYSQL数据库集群高可用和数据监控平台(详细版)

项目说明 概述 该项目共分为2个子项目&#xff0c;由MYSQL集群高可用和数据监控平台两部分组成 MYSQL集群高可用属于云原生高级课数据库运维部分的知识 数据监控平台属于云原生拔高项目&#xff0c;旨在让学生增加知识面&#xff0c;提高项目实习经历&#xff0c;充实简历 …...

学习通刷课稳定版(美化面板+完全免费)

学习通刷 &#xff08;美化面板完全免费&#xff09; 安装教程方法一源码文件 方法二 提示结尾 安装教程 方法一 我们首先在浏览器打开脚本猫网站并获取该插件&#xff08;浏览器以Edge为例&#xff09; 脚本猫首页&#xff1a;https://scriptcat.org/zh-CN/ 第一步&#xff…...

python 实现sha加密

在Python中&#xff0c;SHA&#xff08;Secure Hash Algorithm&#xff09;是一种加密哈希函数&#xff0c;通常用于生成数据的哈希值。SHA算法是单向的&#xff0c;这意味着它只能用于加密&#xff08;生成哈希值&#xff09;&#xff0c;而不能用于解密。因此&#xff0c;SHA…...

Linux epoll 详解:概念、使用、数据结构、流程及应用

epoll是什么&#xff1f; epoll 是从 Linux 2.6 起&#xff0c;Linux内核提供的一种高性能I/O事件通知机制&#xff0c;用于解决传统 select 和 poll 在处理大量并发连接时遍历、最大数量限制、频繁拷贝数据等问题。epoll 可以用来监听多个文件描述符&#xff08;socket、管道…...

Kubernetes排错(十一):lsof命令实战场景

在Kubernetes生产环境中&#xff0c;lsof作为Linux系统的"透视眼"&#xff0c;是排查容器级疑难杂症的必备工具。本文将深入解析其在容器化场景下的高阶用法&#xff0c;助你快速定位隐藏问题。 一、基础环境准备 1. 容器内安装lsof # 临时进入容器安装&#xff0…...

Java基础语法之循环结构

循环结构 1.定义 控制一段代码重复执行多次 2.分类 2.1 for循环 2.1.1 定义 控制一段代码反复执行很多次。 2.1.2 for循环格式 for (初始化语句; 循环条件; 迭代语句) { 循环体语句(重复执行的代码); }示例 // 输出3次HelloWorld for (int i 0; i < 3; i) { System…...

冒泡排序的原理

冒泡排序是一种简单的排序算法&#xff0c;它通过重复地遍历待排序的列表&#xff0c;比较相邻的元素并交换它们的位置来实现排序。具体原理如下&#xff1a; 冒泡排序的基本思想 冒泡排序的核心思想是通过相邻元素的比较和交换&#xff0c;将较大的元素逐步“冒泡”到列表的…...

AUTOSAR图解==>AUTOSAR_TR_InteractionWithBehavioralModels

AUTOSAR与行为模型交互详解 深入解析AUTOSAR软件组件与行为模型的交互关系与转换机制 目录 引言 1.1 AUTOSAR编辑工具概述 1.2 源起与目标 1.3 术语定义需求追溯AUTOSAR中行为建模的用例 3.1 软件组件的行为建模 3.2 软件组件描述到行为模型 3.3 行为模型到软件组件描述 3.4 组…...

GO语言内存管理结构

文章目录 1、内存分区1.1、栈&#xff08;Stack&#xff09;1.2、堆&#xff08;Heap&#xff09; 2、堆内存管理结构2.1、内存分配器&#xff08;MCache → MArena → MSpan → MHeap&#xff09;2.2、大小分类&#xff08;Size Class&#xff09;2.3、分配流程 3、垃圾回收&a…...

分享一些资料供大家学习

群里收集来的&#xff0c;自己感觉还是比较经典的&#xff0c;希望大家喜欢&#xff01;&#xff01;&#xff01; 20250428 夸克网盘分享一大波经典IT架构好货20250429夸克网盘分享精品文档-管理咨询师必备的思维模型20250430夸克网盘分享清华大学DeepSeek教程又来了《文科生A…...

RAGMCP基本原理说明和相关问题解惑

一、RAG架构原理和局限性 1.1 概念解释 RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;检索增强生成&#xff0c;让大模型接受外部输入后&#xff0c;总结输出 向量数据库&#xff1a;向量数据通常是高维空间中的点&#xff0c;代表复杂的数据结构…...

PyGame游戏开发(含源码+演示视频+开结题报告+设计文档)

前言&#xff1a; 大二小学期python课上基于pygame做的一个游戏小demo&#xff0c;当时老师花了一天讲解了下python基础语法后&#xff08;也是整个大学四年唯一学习python的时间&#xff09;&#xff0c;便让我们自学网课一周然后交项目&#xff0c;所以做的非常仓促&#xff…...

Git标签

Git标签 1. 添加标签 使用 tag 命令可以给某次 commit 提交的版本打上标签&#xff0c;相当于这个 commit id 的别名&#xff0c;在实践中&#xff0c;会使用 v1.0 之类的标签提示这是正式版的第一个版本。 git tag v1.0 [commit id]缺省输入 commit id会给最新的一次提交打…...

USB学习【6】USB传输错误的处理

1.前言 我们从物理层到信号层&#xff0c;到协议层&#xff0c;他们分别在不同的层面完成不同的功能。 总结一下&#xff1a; 物理层实现了高低电平的检测。 信号层更进一步&#xff0c;通过一些方法&#xff0c;实现了二进制的传输。 协议层&#xff0c;因为可以二进制传输了…...

深入解析 Vision Transformer (ViT) 与其在计算机视觉中的应用

在近年来&#xff0c;深度学习尤其在计算机视觉领域取得了巨大的进展&#xff0c;而 Vision Transformer&#xff08;ViT&#xff09;作为一种新的视觉模型&#xff0c;它的表现甚至在许多任务中超过了传统的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;如 ResNet。在…...

《Go小技巧易错点100例》第三十一篇

本期分享&#xff1a; 1.Go struct内存对齐 2.使用空结构体(struct{})节省内存 Go struct内存对齐 在计算机系统中&#xff0c;CPU 访问内存时并不是逐字节读取的&#xff0c;而是以特定大小的块&#xff08;通常为 4/8 字节&#xff09;为单位进行读取。当数据的内存地址正…...

全栈项目实战:Vue3+Node.js开发博客系统

全栈项目实战&#xff1a;Vue3Node.js开发博客系统 一、项目架构设计 1. 技术栈选型 前端技术栈&#xff1a; Vue 3 Composition APITypeScriptPinia状态管理Vue Router 4Element Plus UI组件库Vite构建工具 后端技术栈&#xff1a; Node.js (Express/Koa)MongoDB (Mong…...

查看YOLO版本的三种方法

查看YOLO版本的三种方法&#xff1a; 一、通过命令行直接查询 使用Python交互式查询&#xff1a; from ultralytics import __version__ print(__version__) # 示例输出: 11.0.5二、检查PyTorch环境兼容性 import torch, ultralytics print(f"PyTorch: {torch.__versi…...

基于Docker的Bitwarden的私有本地部署

基于Docker的Bitwarden的私有本地部署 文章目录 基于Docker的Bitwarden的私有本地部署 本文首发地址 https://h89.cn/archives/355.html bitwarden 默认连接的是国外服务器 https://bitwarden.com/ &#xff0c;连接不是很稳定&#xff0c;也没有安全感&#xff0c;所以我选择了…...

点和体素哪个好

3D 深度学习中基于体素和基于点云的方法哪种更优&#xff1f;-腾讯云开发者社区-腾讯云 https://zhuanlan.zhihu.com/p/372497398 GitHub - open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection....

C++ STL编程 vector空间预留、vector高效删除、vector数据排序、vector代码练习

vector空间预留&#xff0c;作用是避免申请每次申请内存&#xff0c;提高运行效率。 对应的接口是 vector.reverse() vector的高效删除&#xff0c;对应的代码见下&#xff0c;一个时间复杂度是n&#xff0c;一个时间复杂度是1 #include<iostream> #include<vector…...

Android架构模式推荐及分析和MVC架构模式制作一个简单的底部tab切换

目录 主流架构模式对比 适用场景 MVP‌&#xff1a;团队协作开发,需要高可测试性的项目 MVC架构模式制作一个简单的底部tab切换 &#xff08;Model-View-Controller&#xff09;结构 代码 效果 主流架构模式对比 ‌对比维度‌‌MVC‌ ‌MVP‌ ‌MVVM‌ ‌MVI‌ ‌学习…...

【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)

【PVE】ProxmoxVE8虚拟机&#xff0c;存储管理&#xff08;host磁盘扩容&#xff0c;qcow2/vmdk导入vm&#xff0c;vm磁盘导出与迁移等&#xff09; 文章目录 1、host 磁盘扩容2、qcow2/vmdk导入vm3、vm 磁盘导出与迁移 1、host 磁盘扩容 如何给host扩容磁盘&#xff0c;如增加…...

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式

功能说明&#xff1a; 基于JeecgBoot开源框架&#xff0c;JSwitch开关组件扩展&#xff0c;支持单个多选样式。 效果展示&#xff1a; 使用示例&#xff1a; {field: JSwitch,component: JSwitch,label: JSwitch,},{field: JSwitchCheckBox,component: JSwitch,label: JSwitch…...

卷积神经网络-从零开始构建一个卷积神经网络

目录 一、什么是卷积神经网络CNN 1.1、核心概念 1.2、卷积层 二、什么是卷积计算 2.1、卷积计算的例子: 2.2、点积 2.3、卷积与点积的关系 2.4、Padding(填充) 2.4.1、Padding的主要作用 1、控制输出特征图尺寸 2、保留边缘信息 3. 支持深层网络训练 2.4.2、Str…...

Linux 常用命令集合

以下是一份 Linux 常用命令集合&#xff0c;涵盖文件操作、系统管理、网络管理、权限管理、进程管理等常见任务&#xff0c;并附上代码示例&#xff1a; 1. 文件与目录操作 命令作用示例ls列出目录内容ls -l&#xff08;详细列表&#xff09; ls -a&#xff08;显示隐藏文件&a…...

STM32f103 标准库 零基础学习之按键点灯(不涉及中断)

注意&#xff0c;此次代码不涉及中断&#xff0c;不涉及中断&#xff0c;不涉及中断 目录 1.初始化LED 2.初始化按键 3.粗略的延时函数 4.判断引脚电平 5.通过异或反转电平 开始 │ ├── 初始化LED&#xff08;GPIOA Pin1 推挽输出&#xff09; ├── 初始化按键&…...

【c++】【数据结构】二叉搜索树详解

目录 二叉搜索树的定义二叉搜索树的模拟实现查找函数循环版递归版 插入函数循环版递归版 删除函数循环版递归版 二叉搜索树的定义 二叉搜索树是一种特别的二叉树&#xff0c;是二叉树的搜索特化版。学过排序的都知道&#xff0c;在数组有序的情况下二分查找可以以极高的频率找…...

高精地图数据错误的侵权责任认定与应对之道

首席数据官高鹏律师团队 在自动驾驶与智慧交通快速发展的今天&#xff0c;高精地图作为核心基础设施&#xff0c;其数据准确性直接关系到公共安全。然而&#xff0c;技术并非完美&#xff0c;一旦因地图数据错误导致事故或损失&#xff0c;比如当自动驾驶汽车因高精地图数据错…...

Python训练营打卡——DAY22(2025.5.11)

复习日 学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号——来自灾难的机器学习 数据来源&#xff1a; kaggle泰坦里克号人员生还预测 挑战 泰坦尼克号沉没是历史上最臭名昭著的海难之一。 1912年4月15日&#xff0c;在被普…...

【计算机视觉】OpenCV实战项目 :Image_Cartooning_Web_App:基于深度学习的图像卡通化

Image_Cartooning_Web_App&#xff1a;基于深度学习的图像卡通化Web应用深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 模型部署3.3 处理流程示例 4. 常见问题与解决方案4.1 模型加载失败4.2 显存溢出4.3 边缘伪影 5. 关…...

王道计算机网络知识点总结

计算机网络知识点总结 一、计算机网络体系结构 &#xff08;一&#xff09;计算机网络概述 计算机网络概念&#xff1a;互连的、自治的计算机系统的集合&#xff0c;目的是资源共享&#xff0c;组成包括多台自治计算机&#xff0c;规则是网络协议。 计算机网络的组成&#…...

Java学习笔记(对象)

一、对象本质 状态&#xff08;State&#xff09;&#xff1a;通过成员变量&#xff08;Field&#xff09;描述 行为&#xff08;Behavior&#xff09;&#xff1a;通过成员方法&#xff08;Method&#xff09;实现 class Person {String name;int age;void eat() {System.o…...

并发笔记-给数据上锁(二)

文章目录 核心挑战 (The CRUX)29.1 并发计数器 (Concurrent Counters)1. 简单非并发计数器 (Figure 29.1)2. 同步计数器&#xff08;单锁版本 - Coarse-Grained Lock, Figure 29.2&#xff09;3. 可伸缩计数&#xff1a;近似/懒惰计数器 (Approximate/Sloppy Counter, Figure 2…...

Three.js + React 实战系列 - 页脚区域 Footer 组件 ✨

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦&#xff01;&#xff01;谢谢大家&#xff01;&#xff01;&#xff01; 为个人主页画上完美句号&#xff1a;设计一个美观实用的页脚组件 在完成 Hero、About、Projects、Contact 等模块后&#xff0c;我们为整个页面添上…...

基于Flask、Bootstrap及深度学习的水库智能监测分析平台

基于Flask、Bootstrap及深度学习的水库智能监测分析平台 项目介绍 本项目是基于Flask框架构建的水库智能监测分析平台&#xff0c;集水库数据管理、实时监测预警、可视化分析和智能预测功能于一体。 预测水位的预警级别&#xff1a;蓝色预警没有超过正常水位且接近正常水位1米…...

JavaSE核心知识点02面向对象编程02-08(异常处理)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-08&#…...

7系列 之 SelectIO 资源

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…...

【目标检测系列】YOLOV1解读

目标检测系列文章 目录 目标检测系列文章&#x1f4c4; 论文标题&#x1f9e0; 论文逻辑梳理1. 引言部分梳理 (动机与思想) &#x1f4dd; 三句话总结&#x1f50d; 方法逻辑梳理&#x1f680; 关键创新点&#x1f517; 方法流程图关键疑问解答Q1: 关于 YOLOv1 中的 "conf…...

GIF图像技术介绍

以下是对GIF格式的详细介绍,涵盖其定义、发展历程、技术特性、应用场景及与其他格式的对比: 一、GIF的定义与起源 GIF(Graphics Interchange Format,图形交换格式)由美国CompuServe公司于1987年推出,旨在解决早期互联网带宽不足的问题。其开发者Steve Wilhite采用LZW无损…...

【TI MSPM0】CCS工程管理

一、关于WORKSPACE 1.导入工程路径 导入工程时&#xff0c;实际是将工程从原路径复制到了Workspace路径下&#xff08;默认是在C盘user路径下&#xff09; 2.工程保存备份 关于工程的保存&#xff0c;可以右击文件夹&#xff0c;点击Reveal打开文件夹 将对应的文件夹进行复…...

牛客周赛 Round 92-题解

牛客周赛 Round 92-题解 A-小红的签到题 code #include<iostream> #include<string> using namespace std; string s; int main() {int n;cin >> n;cout << "a_";for (int i 0; i < n - 2; i )cout << b;return 0; }B-小红的模…...

iVX 图形化编程平台:结合 AI 原生开发的革新与实践

一、技术架构&#xff1a;重构 AI 与编程的交互逻辑 1. 信息密度革命&#xff1a;从线性代码到图形化语义单元 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例&#xff0c;Python 实现需定义函数、处理缩进并编写 30 …...

微服务架构中如何保证服务间通讯的安全

在微服务架构中,保证服务间通信的安全至关重要。服务间的通信通常是通过HTTP、gRPC、消息队列等方式实现的,而这些通信链路可能面临多种安全风险。为了应对这些风险,可以采取多种措施来保证通信安全。 常见的服务间通信风险 1.数据泄露:在服务间通信过程中,敏感数据可能会…...

长短期记忆网络(LSTM)深度解析:从理论到实践的全方位指南

一、LSTM基础理论:超越传统RNN的记忆架构 1.1 RNN的长期依赖问题 传统循环神经网络(RNN)在处理长序列时面临的根本挑战是梯度消失/爆炸问题。当序列长度超过10-20个时间步时,RNN难以学习到早期时间步的信息。数学上,这源于反向传播过程中梯度的链式法则: 复制 下载 ∂…...

FramePack AI图片生成视频 v1.1 整合包

今天&#xff0c;我兴奋地要为大家介绍一款革命性的AI工具——FramePack&#xff0c;这是一个让人眼前一亮的图生视频整合包。想象一下&#xff0c;在2025年5月11日的今天&#xff0c;哪怕你的电脑显存仅有6G&#xff0c;你也可以轻松创造艺术&#xff01; FramePack的神奇之处…...

在 C++中,指针数组与数组指针的区别

1. 指针数组:本质上是一个数组,数组中的每个元素都是一个指针。也就是说,这个数组存储的是多个指针变量,这些指针可以指向不同的对象(比如不同的变量、数组等) 。 2. 数组指针:本质上是一个指针,这个指针指向一个数组。即它指向的是数组的首地址,通过这个指针可以操作…...

Ubuntu 24服务器部署abp vnext应用程序的完整教程

一、服务器配置 1、安装Nginx 2、安装.NetCore SDK 或.NetCore 运行时 以上两步参考 《UbuntuNginxSupervisord部署.net core web应用程序_nginx部署netcore-CSDN博客》 二、abp vnext程序部署 1、程序发布 使用VS进行发布 2、程序上传 使用winSCP工具 3、openiddict…...

Ingrees 控制器与 Ingress 资源的区别

在 Kubernetes 中&#xff0c;单纯的 Ingress 资源定义文件&#xff08;YAML&#xff09;本身不会直接创建 Pod。Ingress 的作用是定义路由规则&#xff08;如将外部流量路由到集群内的服务&#xff09;&#xff0c;而实际处理流量的 Pod 是由 Ingress 控制器&#xff08;如 Ng…...

动态路由实现原理及前端控制与后端控制的核心差异

在 Web 开发领域&#xff0c;动态路由是构建灵活、高效应用的关键技术之一。它能够根据不同的条件和请求&#xff0c;动态地决定页面的跳转和数据的加载&#xff0c;极大提升用户体验。本文将深入剖析动态路由的实现原理&#xff0c;并详细探讨前端控制和后端控制两种模式的最大…...