💫《博主主页》:
   🔎 CSDN主页__奈斯DB
   🔎 IF Club社区主页__奈斯、
🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(Redis)有了解
💖如果觉得文章对你有所帮助,欢迎点赞收藏加关注💖

在这里插入图片描述
    看过我之前文章的小伙伴都清楚,在之前介绍过 [基于Prometheus+Grafana实现MySQL数据库的监控与可视化 ]的文章,这篇文章主要是监控MySQL数据库和主从复制,但当数据库升级为高可用架构后,监控策略也需要随之升级!🔝
    在运营商、金融、电商等关键业务场景中,MySQL高可用架构(如MGR、MHA、Keepalived+HA、InnoDB Cluster等)是保障"一年五个九"(99.999%可用性)的核心支柱。那么在众多MySQL高可用架构中,Keepalived+HA是实现MySQL高可用中最常见的一种方案,只需要两台服务器就可以实现MySQL的高可用,因此实时监控高可用架构状态是非常重要的一环。
    那么接下来这篇文章将聚焦Keepalived+HA高可用架构,通过Prometheus打造全方位的监控体系!🚀

   

特别说明💥:
⚡监控MySQL HA实现如下告警

  • ✅ Keepalived 服务已停止
  • ✅ 主节点虚拟IP不可达
  • ✅ 虚拟IP漂移到备节点
       
       

prometheus+Grafana全系列文章(实时更新🔥):

序号文章
1【prometheus+Grafana篇】Prometheus与Grafana:深入了解监控架构与数据可视化分析平台
2【prometheus+Grafana篇】从零开始:Linux 7.6 上二进制安装 Prometheus、Grafana 和 Node Exporter
3【prometheus+Grafana篇】Prometheus告警规则参数全解析 + Alertmanager实现多平台告警(含电子邮件/企业微信群/飞书群/钉钉群接受方式)
4【prometheus+Grafana篇】PromQL核心函数解析:rate()与irate()函数详解
5【prometheus+Grafana篇】基于Prometheus+Grafana实现Linux操作系统的监控与可视化
6【prometheus+Grafana篇】基于Prometheus+Grafana实现windows操作系统的监控与可视化
7【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化
8【prometheus+Grafana篇】基于Prometheus+Grafana实现MySQL数据库的监控与可视化
9【Prometheus+Grafana篇】监控通过Keepalived实现的MySQL HA高可用架构
10【prometheus+Grafana篇】基于Prometheus+Grafana实现MongoDB数据库的监控与可视化
11【prometheus+Grafana篇】基于Prometheus+Grafana实现Redis数据库的监控与可视化
12【prometheus+Grafana篇】基于Prometheus+Grafana实现postgreSQL数据库的监控与可视化
13【prometheus+Grafana篇】基于Prometheus+Grafana实现SQLserver数据库的监控与可视化

目录

    • 一、HA主
      • 1)编辑监控keepalived+VIP进程脚本
      • 2)安装python和Prometheus所需依赖包
      • 3)将监控脚本写入到linux启动服务项
    • 二、HA备
      • 1)编辑监控keepalived+VIP进程脚本
      • 2)安装python和Prometheus所需依赖包
      • 3)将监控脚本写入到linux启动服务项
    • 三、添加MySQL HA到prometheus中
      • 1)将MySQL HA的信息加入到prometheus监控的配置文件prometheus.yml中
      • 2)配置告警规则文件
      • 3)检查配置文件
      • 4)prometheus.yml文件添加了信息,所以重启prometheus进程或者重新加载配置文件(二选一)
      • 5)在prometheus查看是否可以看到监控信息
    • 四、模拟主库故障,查看告警


   

MySQL HA高可用架构信息如下:

角色VIPIP地址类型
HA主110.120.100.48110.120.100.46读写
HA备110.120.100.47读(备用)

在这里插入图片描述
   
    那么从上面的架构图可以推断出主库和从库分别都应该监控哪些内容:

  • 主库:

    1. 监控主库上的keepalived监控
    2. 主节点需要检查虚拟 IP 是否不存在:正常情况下keepalived的VIP只能存在于主库上,而不能存在于除了主库的其他任意节点上
         
  • 从库:

    1. 监控从库上的keepalived监控
    2. 备节点需要检查虚拟 IP 是否存在:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就进行告警。这样的好处在于可以马上知晓VIP漂移到了从节点上,也可以监控是否出现了脑裂问题,如果出现了脑裂能马上进行干预和处理。PS提示:Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
         

   现在知道了该监控哪些内容,那么开始如下配置。

   

监控部署流程正式启动,请勿中断操作!!!🚀

   

一、HA主

1)编辑监控keepalived+VIP进程脚本

[root@mysql-db1 ~]# mkdir -p /opt/prometheus
[root@mysql-db1 ~]# cd /opt/prometheus/
[root@mysql-db1 ~]# mkdir keepalived_exporter
[root@mysql-db1 ~]# cd keepalived_exporter 
[root@mysql-db1 keepalived_exporter]# vi keepalived_monitor.pyfrom flask import Flask, Response
import subprocess
import osapp = Flask(__name__)@app.route('/metrics')
def metrics():# 检查 keepalived 服务状态result = subprocess.run(['systemctl', 'is-active', 'keepalived'], stdout=subprocess.PIPE)keepalived_status = 1 if result.stdout.decode().strip() == 'active' else 0# 检查虚拟 IP 是否存在于本机ip_address = '110.120.100.48'result = subprocess.run(['ip', 'addr', 'show'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)ip_status = 1 if ip_address in result.stdout.decode() else 0# 返回 Prometheus 格式的指标metrics_data = '# HELP keepalived_status 状态,1表示keepalived服务正在运行,0表示未运行\n'metrics_data += '# TYPE keepalived_status gauge\n'metrics_data += f'keepalived_status {keepalived_status}\n'                  # 检查 keepalived 服务状态metrics_data += f'# HELP ip_reachability_primary{{ip="{ip_address}"}} 虚拟IP是否存在,1表示存在,0表示不存在\n'    # 根据节点角色设置 Prometheus 格式的指标。主节点需要检查虚拟 IP 是否不存在,定义的指标项为ip_reachability_primary;备节点需要检查虚拟 IP 是否存在,定义的指标项为ip_reachability_secondarymetrics_data += '# TYPE ip_reachability_primary gauge\n'metrics_data += f'ip_reachability_primary{{ip="{ip_address}"}} {ip_status}\n'return Response(metrics_data, mimetype='text/plain')if __name__ == '__main__':app.run(host='0.0.0.0', port=4399)  # 监听 4399 端口

###脚本实现了两个监控:

  1. 检查了 keepalived 服务状态
  2. 检查了虚拟 IP 是否存在于本机,根据节点角色设置 Prometheus 格式的指标。主节点需要检查虚拟 IP 是否不存在,定义的指标项为ip_reachability_primary;备节点需要检查虚拟 IP 是否存在,定义的指标项为ip_reachability_secondary。虚拟ip是一个在主备节点之间共享的虚拟IP地址,永远只存在于同一个virtual_router_id组中的主节点上。也是就说监控主节点上ip是否不存在,备节点监控ip是否存在
       

###在如上脚本中,只需要将 ip_address = '110.120.100.48' 这里的IP替换为实际的VIP,其他地方不需要有任何变更
   
   

2)安装python和Prometheus所需依赖包

安装Python:通过yum进行安装。监控脚本是通过python实现的,因此需要安装python3,用于运行keepalived_monitor.py监控脚本

[root@mysql-db1 ~]# yum install python3
[root@mysql-db1 ~]# python3 --version

   

安装Flask:将Flask相关包上传至Linux的/software/Flask目录下。这里安装flask是因为在keepalived_monitor.py监控脚本中使用了 Flask 的以下关键组件

组件用途必要性
Flask创建轻量级Web服务器✅ 必须
@app.route暴露 /metrics 端点供Prometheus抓取✅ 必须
Response返回符合Prometheus格式的监控数据✅ 必须
flask相关包博主已打包上传至资源,需要的小伙伴直接下载即可

在这里插入图片描述
在这里插入图片描述

[root@mysql-db1 ~]# cd /software
[root@mysql-db1 ~]# unzip flask.zip
[root@mysql-db1 ~]# cd flask
[root@mysql-db1 ~]# pip3 install *.whl

PS小提示:如果不安装Flask。那么通过python3运行keepalived_monitor.py脚本时会报如下错误:
在这里插入图片描述
   
   

3)将监控脚本写入到linux启动服务项

[root@mysql-db1 ~]# cd /usr/lib/systemd/system
[root@mysql-db1 ~]# vi keepalived_monitor.service[Unit]
Description=Keepalived Monitor Script
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/prometheus/keepalived_exporter/keepalived_monitor.py
WorkingDirectory=/opt/prometheus/keepalived_exporter/
Restart=always
Environment=PATH=/usr/bin:/usr/local/bin:/usr/sbin
Environment=PYTHONUNBUFFERED=1[Install]
WantedBy=multi-user.target[root@mysql-db1 ~]# systemctl daemon-reload
[root@mysql-db1 ~]# systemctl start keepalived_monitor.service
[root@mysql-db1 ~]# systemctl enable keepalived_monitor.service
[root@mysql-db1 ~]# systemctl status keepalived_monitor.service

   

二、HA备

1)编辑监控keepalived+VIP进程脚本

[root@mysql-db2 ~]# mkdir -p /opt/prometheus
[root@mysql-db2 ~]# cd /opt/prometheus/
[root@mysql-db2 ~]# mkdir keepalived_exporter
[root@mysql-db2 ~]# cd keepalived_exporter 
[root@mysql-db2 keepalived_exporter]# vi keepalived_monitor.pyfrom flask import Flask, Response
import subprocess
import osapp = Flask(__name__)@app.route('/metrics')
def metrics():# 检查 keepalived 服务状态result = subprocess.run(['systemctl', 'is-active', 'keepalived'], stdout=subprocess.PIPE)keepalived_status = 1 if result.stdout.decode().strip() == 'active' else 0# 检查虚拟 IP 是否存在于本机ip_address = '110.120.100.48'result = subprocess.run(['ip', 'addr', 'show'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)ip_status = 1 if ip_address in result.stdout.decode() else 0# 返回 Prometheus 格式的指标metrics_data = '# HELP keepalived_status 状态,1表示keepalived服务正在运行,0表示未运行\n'metrics_data += '# TYPE keepalived_status gauge\n'metrics_data += f'keepalived_status {keepalived_status}\n'                  # 检查 keepalived 服务状态metrics_data += f'# HELP ip_reachability_secondary{{ip="{ip_address}"}} 虚拟IP是否存在,1表示存在,0表示不存在\n'    # 根据节点角色设置 Prometheus 格式的指标。主节点需要检查虚拟 IP 是否不存在,定义的指标项为ip_reachability_primary;备节点需要检查虚拟 IP 是否存在,定义的指标项为ip_reachability_secondarymetrics_data += '# TYPE ip_reachability_secondary gauge\n'metrics_data += f'ip_reachability_secondary{{ip="{ip_address}"}} {ip_status}\n'return Response(metrics_data, mimetype='text/plain')if __name__ == '__main__':app.run(host='0.0.0.0', port=4399)  # 监听 4399 端口

###脚本实现了两个监控:

  1. 检查了 keepalived 服务状态
  2. 检查了虚拟 IP 是否存在于本机,根据节点角色设置 Prometheus 格式的指标。主节点需要检查虚拟 IP 是否不存在,定义的指标项为ip_reachability_primary;备节点需要检查虚拟 IP 是否存在,定义的指标项为ip_reachability_secondary。虚拟ip是一个在主备节点之间共享的虚拟IP地址,永远只存在于同一个virtual_router_id组中的主节点上。也是就说监控主节点上ip是否存在,备节点监控ip是否不存在
       

###在如上脚本中,只需要将 ip_address = '110.120.100.48' 这里的IP替换为实际的VIP,其他地方不需要有任何变更
   
   

2)安装python和Prometheus所需依赖包

安装Python:通过yum进行安装。监控脚本是通过python实现的,因此需要安装python3,用于运行keepalived_monitor.py监控脚本

[root@mysql-db2 ~]# yum install python3
[root@mysql-db2 ~]# python3 --version

   

安装Flask:将Flask相关包上传至Linux的/software/Flask目录下。这里安装flask是因为在keepalived_monitor.py监控脚本中使用了 Flask 的以下关键组件

组件用途必要性
Flask创建轻量级Web服务器✅ 必须
@app.route暴露 /metrics 端点供Prometheus抓取✅ 必须
Response返回符合Prometheus格式的监控数据✅ 必须
flask相关包博主已打包上传至资源,需要的小伙伴直接下载即可

在这里插入图片描述
在这里插入图片描述

[root@mysql-db2 ~]# cd /software
[root@mysql-db2 ~]# unzip flask.zip
[root@mysql-db2 ~]# cd flask
[root@mysql-db2 ~]# pip3 install *.whl

PS小提示:如果不安装Flask。那么通过python3运行keepalived_monitor.py脚本时会报如下错误:
在这里插入图片描述
   
   

3)将监控脚本写入到linux启动服务项

[root@mysql-db2 ~]# cd /usr/lib/systemd/system
[root@mysql-db2 ~]# vi keepalived_monitor.service[Unit]
Description=Keepalived Monitor Script
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/prometheus/keepalived_exporter/keepalived_monitor.py
WorkingDirectory=/opt/prometheus/keepalived_exporter/
Restart=always
Environment=PATH=/usr/bin:/usr/local/bin:/usr/sbin
Environment=PYTHONUNBUFFERED=1[Install]
WantedBy=multi-user.target[root@mysql-db2 ~]# systemctl daemon-reload
[root@mysql-db2 ~]# systemctl start keepalived_monitor.service
[root@mysql-db2 ~]# systemctl enable keepalived_monitor.service
[root@mysql-db2 ~]# systemctl status keepalived_monitor.service

   

三、添加MySQL HA到prometheus中

注意:如下操作是在安装了prometheus和Grafana的主机上进行操作
   

1)将MySQL HA的信息加入到prometheus监控的配置文件prometheus.yml中

[root@prometheus ~]# vi /opt/prometheus/prometheus.yml     
在scrape_configs下面新增如下内容:
# keepalived_exporter配置- job_name: "MySQL keepalived status"         ###job_name 用来唯一标识一个监控任务。在同一个 prometheus.yml 文件中,不同的 scrape_config可以有不同的job_name,以便 Prometheus 能够区分和管理不同的监控目标和配置,用来将不同的监控目标分组。单位为监控keepalived设置一个独立的job_namescrape_interval: 15s                        ###指定这个job_name每隔多久从每个目标(如 Exporter、应用端点)拉取一次指标数据。优先级:会覆盖全局的 global:scrape_interval(如果存在)。file_sd_configs:- files:- /opt/prometheus/conf.d/keepalived_targets.json     # keepalived需要监控的实例都单独写在了keepalived_targets.json文件中,是为了避免prometheus.yml内容过多,看起来更简洁[root@prometheus ~]# vi /opt/prometheus/conf.d/keepalived_targets.json
[{"targets": [ "110.120.100.46:4399" ],"labels": { "instance": "数据库HA(keepalived)主库(IP:110.120.100.46)" }},{"targets": [ "110.120.100.47:4399" ],"labels": { "instance": "数据库HA(keepalived)从库(IP:110.120.100.47)" }}
]

   

2)配置告警规则文件

    除了如下告警规则之外,还需要单独配置一个Targets目标不可达(up)的相关规则,因为up 是一个布尔值指标,表示 Prometheus 是否能够成功地 scrape(抓取)到指定的目标(targets)数据,用于判断目标node-exporter相关进程是否在目标主机存活。关于up的规则文件参考:【prometheus+Grafana篇】从零开始:Linux 7.6 上二进制安装 Prometheus、Grafana 和 Node Exporter

[root@prometheus ~]# cd /opt/prometheus/rules/     ###在prometheus.yml文件中定义了告警规则文件rule_files参数
[root@prometheus rules]# vi keepalived_alerts.ymlgroups:- name: keepalived_alertsrules:- alert: KeepalivedDownexpr: keepalived_status == 0for: 3slabels:severity: criticalannotations:summary: "Keepalived 服务已停止"description: "Keepalived 服务在 {{ $labels.instance }} 上停止运行,请立即通过systemctl status keepalived检查服务状态!"- alert: PrimaryIPReachabilityDownexpr: ip_reachability_primary == 0for: 3slabels:severity: criticalannotations:summary: "主节点虚拟IP不可达"description: "主节点的虚拟 IP {{ $labels.ip }} 在 {{ $labels.instance }} 上不可达,请通过systemctl status keepalived检查服务状态,并且检查虚拟 IP 是否漂移到从库上!"- alert: secondaryIPReachabilityUpexpr: ip_reachability_secondary == 1for: 3slabels:severity: criticalannotations:summary: "虚拟IP漂移到备节点"description: "虚拟 IP {{ $labels.ip }} 已从主节点漂移到 {{ $labels.instance }} ,需要人工干预将其转移回主节点上运行!"

   

3)检查配置文件

[root@prometheus ~]# cd /opt/prometheus/
[root@prometheus ~]# ./promtool check config prometheus.yml      ###用于检查 Prometheus 配置文件(prometheus.yml)的语法和格式是否正确。

执行这条命令会执行以下操作:

  1. 验证配置文件的语法:检查 prometheus.yml 文件是否符合 Prometheus 配置格式规范。
  2. 检测潜在的错误或警告:如果配置文件中存在拼写错误、格式问题、无效的配置项等问题,它会提供相关的错误信息或警告。比如告警规则写的不对,就会有提示
  3. 输出有用的诊断信息:如果配置文件存在问题,promtool 会输出详细的错误信息。
    在这里插入图片描述
       

4)prometheus.yml文件添加了信息,所以重启prometheus进程或者重新加载配置文件(二选一)

#重载:前提是在prometheus.service启动服务项中加了–web.enable-lifecycle参数:–web.enable-lifecycle:###启用Prometheus的生命周期接口,允许通过HTTP请求来动态重新加载配置等操作。这对于在运行时更新配置或执行其他管理操作非常有用,当修改了prometheus的配置后,可以通过curl命令来重新加载配置文件,而不需要重启prometheus(推荐方式)

[root@prometheus ~]# curl -X POST http://localhost:9090/-/reload

   

#重启

[root@prometheus ~]# systemctl restart prometheus.service

   

5)在prometheus查看是否可以看到监控信息

网址:http://110.120.100.21:9090
菜单栏:Status—Targets
在这里插入图片描述

   

四、模拟主库故障,查看告警

主库:
[root@mysql-db1 ~]# service mysqld stop

触发如下告警

在这里插入图片描述
   
   
从库:

触发如下告警

在这里插入图片描述
   
   
    那么可以看到当主库故障时,监控到了主库上的keepalived故障,并且VIP发生了漂移,也收到了VIP在从库上的告警。那么后续就是先修复主库数据后,然后人工将VIP再切换到主库上就可以了,这里博主就不演示了


完结,撒花💓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90013.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90013.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90013.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s:利用kubectl部署postgis:17-3.5

1.离线环境CPU:Hygon C86 7285 32-core Processor 操作系统:麒麟操作系统 containerd:1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey:3.1.10 Harbor:2.13.1 Postgis:17-3.52.创建并执行postgresql-headless.yaml2.1创建apiVersion: v1…

Mysql(存储过程)

目录 介绍 特点 存储过程创建 系统变量(不重要) 用户变量 局部变量 if 判断 参数(in, out, inout) case while repeat loop 游标和条件处理程序-handler 存储函数 为了防止以后忘记,反复去看视频浪费时间,特写一篇 介绍 存储过程…

Effective Python 第14条: 用sort方法的key参数来表示复杂的排序逻辑

一、引言:Python排序功能的重要性 在Python开发中,排序功能是一个常见的需求。无论是处理数据、优化算法,还是提升用户体验,排序都是不可或缺的一部分。Python的列表内置了sort方法,提供了灵活的排序功能。然而&#…

react+antd 可拖拽模态框组件

DraggableModal 可拖拽模态框组件使用说明 概述 DraggableModal 是一个基于 dnd-kit/core 实现的可拖拽模态框组件,允许用户通过拖拽标题栏来移动模态框位置。该组件具有智能边界检测功能,确保模态框始终保持在可视区域内。 功能特性 ✅ 可拖拽移动&…

MySQL的基本操作及相关python代码

下面为你介绍 MySQL 的基本操作,以及对应的 Python 代码实现。我会先介绍 SQL 基本操作,再展示如何用 Python 连接 MySQL 并执行这些操作。 一、MySQL 基本操作(SQL 语句) 1. 连接数据库 bash mysql -u root -p2. 创建数据库 sql CREATE DATABASE testdb;3. 使用数据…

Armbian(斐讯N1)安装xfce桌面以及远程环境

安装xfce桌面以及vncserver(远程连接) 安装xfce桌面 apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils ubuntu的安装gdm3, apt install gdm3 debian安装lightdm。 apt install lightdm 安装vnc server apt-get install tightvncserver 中文字体…

【Oracle】Oracle 11g打补丁时遇到opatch apply命令无法识别

⚙️ 1. 使用完整路径执行命令 问题原因:若未将$ORACLE_HOME/OPatch加入系统PATH环境变量,直接输入opatch apply会因系统无法定位命令而报错。 解决方案: 改用绝对路径执行: $ORACLE_HOME/OPatch/opatch apply例如: /u…

单例模式详细讲解

一.定义单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点特点:1.构造函数和析构函数私有化2.禁用拷贝构造函数和赋值运算符重载(delete)3.利用静态成员函数和静态成员变量来给外界提供访问二…

KORGym:评估大语言模型推理能力的动态游戏平台

KORGym:评估大语言模型推理能力的动态游戏平台 现有评估基准多受领域限制或 pretraining 数据影响,难以精准测LLMs内在推理能力。KORGym平台应运而生,含50余款游戏,多维度评估,本文将深入解析其设计、框架、实验及发现…

ISPDiffuser文章翻译理解

ISPDiffuser: Learning RAW-to-sRGB Mappings with Texture-Aware Diffusion Models and Histogram-Guided Color Consistency翻译 Type: Conference paper Author: Yang Ren1,4, Hai Jiang1,4, Menglong Yang1,2,†, Wei Li1,2, Shuaicheng Liu3,4,† Select: ⭐️⭐️⭐️⭐…

C++线程池执行步骤分析,总结线程池流程

线程池流程总结:1、构造函数中创建线程,并添加到线程池(构造函数返回时,线程自动启动,并停在等待wait:从线程池取出一个任务处); 2、主线程中添加任务,到任务队列。并用“…

Java 通过 HttpURLConnection发送 http 请求

问题&#xff1a; 在调试 kill 接口的时候&#xff0c;对方的服务用的是 Django RestFramework 框架提供的接口&#xff0c;用 python 请求时得到的内容如下&#xff1a; ➜ ~ python3 test.py <Response [200]> "true" // 对应的代码是 print(response, r…

【PTA数据结构 | C语言版】列出连通集

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 给定一个有 n 个顶点和 m 条边的无向图&#xff0c;请用深度优先遍历&#xff08;DFS&#xff09;和广度优先遍历&#xff08;BFS&#xff09;分别列出其所有的连通集。假设顶点从 0 到 n−1 编号。…

GoLang教程005:switch分支

3.4 Switch分支 在 GoLand&#xff08;其实是 JetBrains 开发的 Go 编程语言 IDE&#xff09;中&#xff0c;switch 是 Go 语言&#xff08;Golang&#xff09; 的一个重要控制结构&#xff0c;用于替代多个 if-else 语句。 ✅ 特点说明特性说明自动 breakGo 的 switch 语句默认…

uniapp相关地图 API调用

目录 一、 注意事项&#xff1a; manifest.json需增加配置 二、获取用户收货地址 [uni.chooseAddress] 三、获取当前的地理位置、速度 [uni.getLocation] 四、打开地图选择位置、查看位置(导航) [uni.chooseLocation] [uni.openLocation] 五、使用腾讯地图逆地址解析接口实…

Java学习----NIO模型

在 Java 的 I/O 模型中&#xff0c;NIO&#xff08;Non - Blocking I/O&#xff0c;非阻塞 I/O&#xff09;是对 BIO 的重要改进。它为高并发场景提供了更高效的处理方式&#xff0c;在众多 Java 应用中发挥着关键作用。NIO模型的核心在于非阻塞和多路复用&#xff0c;其采用 “…

MySQL计数函数count原理分析

前言 统计表中数据的条数是非常常用的操作,但是咱们常用的InnoDB存储引擎计数函数是现时统计的,所以会出现性能的问题,这次我准备分享计数函数count的原理,保证之后遇到计数方面的问题都可以轻易灵活的解决 与MyISAM存储引擎相比,MyISAM存储引擎是自己记录了表中数据的条数,但…

Day07_网络编程20250721_大项目

基本代码&#xff1a;搭建服务器客户端&#xff0c;要求服务器使用 epoll 模型客户端使用多线程服务器打开数据库&#xff0c;表单格式如下name text primary key pswd text not null客户端做一个简单的界面&#xff1a;1&#xff1a;注册2&#xff1a;登录无论注册还是登录&am…

20250721

P5357 【模板】AC 自动机 - 洛谷 主要是构建fail树 /* 我们可以知道的是&#xff0c;当访问一个点x时&#xff0c;接下来需要跳转其fail[x]&#xff0c;以此类推&#xff0c;如果在某个fail[x]上出现了一个字符串&#xff0c;那么相应的统计次数应该加1&#xff0c;然后当访…

【INT四则优先算式】2022-9-22

缘由ccf201903-2二十四点我用暴力破解做的&#xff0c;但是两个程序一个拿到了满分&#xff0c;一个拿到了50分&#xff0c;看了很长时间也没看出问题在哪里&#xff0c;希望有英雄慧眼帮我看一下-编程语言-CSDN问答 void INT四则优先算式() {//缘由https://ask.csdn.net/ques…