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

【Project】基于Prometheus监控docker平台

一、设计背景

1.1项目简介

本项目旨在创建一个全面的容器化应用程序监控解决方案,基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中,容器化技术已成为一种关键的工具,使应用程序能够更快速、可靠地交付和扩展。然而,随着容器数量的增加和复杂性的提高,监控这些容器化服务的性能和健康状态变得至关重要。通过这个项目,我们的目标是提供一个完善的监控解决方案,帮助开发人员、系统管理员和运维团队更好地理解和管理他们的容器化应用程序。这将有助于提高应用程序的稳定性、可用性和性能,从而促进更快速、高效的软件开发和部署。

1.2课题目标

随着信息技术的不断发展,容器化技术已经成为现代应用程序开发和部署的主要趋势之一。Docker等容器平台的出现为应用程序的快速交付和部署提供了便利,然而,随之而来的挑战是如何有效地监控和管理这些容器化服务。在这个背景下,本毕业设计项目选择了基于Prometheus监控Docker平台作为研究课题。Prometheus作为一种开源的监控和警报工具,已经在容器环境中得到广泛应用,但如何将其有效地集成到Docker平台中,以确保容器化应用的性能、可用性和可伸缩性,仍然是一个具有挑战性的问题。因此,本项目旨在研究和实现一个可靠的监控解决方案,以满足容器化应用的监控需求。

二、设计思路

2.1 开发环境与工具

使用到的工具为:

VMware Workstation:VMware Workstation是一款虚拟机软件,可以用于创建和管理虚拟机。它提供了一个可视化界面,使用户可以在单个物理主机上同时运行多个虚拟机,以便在不同的操作系统环境中进行开发、测试或演示。

Centos7.9.2009:Centos7.9.2009是一种基于Linux的操作系统,它被广泛用作服务器操作系统。Centos提供了稳定、安全和可靠的基础系统,可以作为Docker平台的基础环境。

Docker:Docker是一种开源的容器化平台,它使得应用程序和其依赖项可以打包成轻量级、可移植的容器。通过使用Docker,开发人员可以更方便地构建、部署和管理应用程序,实现快速交付和跨平台运行。

Grafana Enterprise:Grafana Enterprise是一款功能强大的数据可视化工具。它提供了丰富的图表、面板和仪表盘,可以将来自各种数据源的指标数据进行可视化展示和交互式探索,帮助用户更好地理解和分析数据。

Alertmanager:Alertmanager是一种用于处理和管理告警的服务。它可以接收来自监控系统(如Prometheus)的告警通知,并根据预定义的规则进行分组、去重、静默或发送给相应的接收者,以便及时响应和解决问题。

Node Exporter:Node Exporter是用于收集主机指标数据的一个Prometheus导出器。它可以在主机上运行,定期采集主机的硬件和操作系统指标,并将其暴露给Prometheus进行监控和存储。

Prometheus:Prometheus是一款开源的监控和警报工具。它提供了强大的时间序列数据采集、存储和查询功能,能够监控多种数据源的指标,并支持设定灵活的告警规则。Prometheus还与Grafana等工具紧密集成,实现数据的可视化和分析。

表 2-1 开发环境

工具作用
VMware Workstation创建虚拟机
Centos7.9.2009作为平台基础系统
Docker容器平台
grafana-enterprise数据可视化
alertmanager告警服务
node_exporter收集数据服务
prometheus监控和警报工具

2.2 系统版本

以下是当前工具和系统使用的版本信息。

表 2-2 系统版本

系统版本
VMware Workstation pro16
Centos77.9.2009
docker18.06.3
grafana-enterprise9.4.3
alertmanager0.25.
node_exporter1.5.0
prometheus2.37.6

2.3 系统设计

这个系统设计旨在实现全面的监控,包括自身、Docker平台、以及Docker上运行的Nginx和MySQL,并将监控数据可视化通过Grafana展现。系统架构包括Prometheus服务器作为核心组件,负责数据采集和存储,Node Exporter用于监控宿主机系统性能,Docker监控通过cAdvisor或Docker自身的指标监测容器,Nginx Exporter用于收集Nginx服务器的性能数据,而MySQL Exporter则从MySQL数据库中提取性能指标。监控数据汇总后通过Grafana连接到Prometheus数据源,实现实时监控和创建仪表板。监控数据的采集和存储通过Prometheus进行,它定期从各个目标中收集性能数据,并存储在其内部数据库中,提供强大的查询和检索功能。最终,Grafana用于创建自定义仪表板,可视化展示监控数据,帮助实时监测系统和应用程序的性能,以及分析历史趋势。整个系统设计旨在提供全面的监控解决方案,以便有效地管理和优化运行中的自身、Docker平台、Nginx和MySQL等组件。

三、需求分析

3.1 项目平台要求

Docker平台搭建和管理需求:用户应能够轻松地搭建和管理Docker容器平台,包括容器编排和集群管理平台应支持多种操作系统和云环境,以满足不同用户的需求。

Prometheus集成和配置需求:用户应能够方便地配置Prometheus以监控Docker平台上的容器和服务,支持多个Prometheus实例的集成,以适应不同的监控需求。支持数据收集和存储的灵活性,以满足各种监控数据的需求。

监控规则和告警需求:用户应能够定义自定义监控规则,以检测容器和服务的性能问题,应支持告警规则的设置,以及多种告警通知渠道,如邮件、短信等。用户应能够灵活地调整告警阈值和策略,以适应不同应用的需求。

可视化和仪表板需求:系统应提供直观的仪表板和可视化工具,以帮助用户监控容器化应用程序的性能和状态。仪表板应支持自定义配置,以满足不同用户的可视化需求。用户应能够生成和导出有用的监控报告,以便进行性能分析和决策支持。

安全性和权限需求:系统应具有强大的安全性措施,包括身份验证、授权和数据加密,以保护监控数据的完整性和保密性,应支持多级权限管理,以确保不同用户具有适当的访问权限。

可扩展性和性能需求:系统应具备良好的可扩展性,以适应不断增长的容器数量和监控需求,应能够高效处理大量的监控数据,以保持系统的性能稳定。

文档和培训需求:系统应提供清晰的文档和培训材料,以帮助用户快速上手和有效使用监控工具。

3.2 监控需求分析

节点监控:监控Docker主机的硬件资源利用率,包括CPU、内存、磁盘和网络等指标。这可以通过Prometheus的节点导出器(例如node_exporter)实现。

容器监控:监控Docker容器的运行状态和资源消耗情况,包括CPU使用率、内存使用量、网络流量和磁盘I/O等指标。可以使用cAdvisor或者Docker自身的监控API获取容器的指标,并由Prometheus进行采集和存储。

服务健康监测:监控Docker中运行的服务的可用性和性能。可以使用Prometheus的黑盒监测(Blackbox Exporter)对服务进行定期的HTTP或TCP健康检查,并记录响应时间、状态码等指标。

日志监控:集成日志收集工具(如ELK/EFK)以监控Docker容器的日志输出。可以使用Filebeat将容器日志发送到Logstash/Elasticsearch/Fluentd等进行处理和存储,并通过Prometheus的日志导出器进行查询和分析。

告警与警报:设置告警规则,当某个指标超过阈值或触发特定条件时,发送警报给运维人员或团队。Prometheus具有灵活的告警管理机制,可以根据业务需求设置告警规则,并通过邮件、短信、Slack等方式发送警报。

可视化与报表:使用Grafana等工具构建监控仪表盘,将采集到的指标进行可视化展示,以便查看和分析。可以创建图表、面板和报表来监控Docker平台的整体状态和趋势。

五、系统实现

5.1 部署prometheus

5.1.1 服务器物理配置规划

服务器的硬件配置如下。

表 5-1 配置规划

角色系统架构内存大小核心数量
prometheusCentos7.9.20094G4cpu
dockerCentos7.9.20098G8cpu

5.1.2 IP地址、主机名称规划

服务器的IP地址规划如下。

表 5-2 主机ip地址

**IP **地址主机名角色
网卡1:192.168.100.250 nat模式Prometheus监控服务器
网卡1:192.168.100.251 nat模式Docker容器服务器

5.1.3 环境准备

修改服务器名称,关闭防火墙,并创建用于运行Prometheus的用户。

Prometheus节点


#修改服务器名称
hostnamectl set-hostname Prometheus
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
#创建prometheus工作目录
mkdir -p /opt/prometheus/
#创建运行Prometheus服务的用户
useradd -M -s /usr/sbin/nologin prometheus

5.1.4 软件包下载

去各组件的官方网站下载项目对应的软件包。

Prometheus节点

#Prometheus下载
wget [https://ghproxy.com/https://github.com/prometheus/prometheus/releases/download/v2.37.6/prometheus-2.37.6.linux-amd64.tar.gz](https://ghproxy.com/https://github.com/prometheus/prometheus/releases/download/v2.37.6/prometheus-2.37.6.linux-amd64.tar.gz)
#alertmanager下载
wget [https://ghproxy.com/https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz](https://ghproxy.com/https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz)
#node_exporter下载
wget [https://ghproxy.com/https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz](https://ghproxy.com/https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz)
#grafana下载
wget [https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3.linux-amd64.tar.gz](https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3.linux-amd64.tar.gz)

5.1.5 解压软件包

解压下载的软件包。

#解压所有软件包
tar -zxvf alertmanager-0.25.0.linux-amd64.tar.gz -C /opt/prometheus/
tar -zxvf grafana-enterprise-9.4.3.linux-amd64.tar.gz -C /opt/prometheus/
tar -zxvf prometheus-2.37.6.linux-amd64.tar.gz -C /opt/prometheus/
tar -zxvf node_exporter-1.5.0.linux-amd64.tar.gz -C /opt/prometheus/
#重新命名软件包
mv /opt/prometheus/node_exporter-1.5.0.linux-amd64/ /opt/prometheus/node_exporter
mv /opt/prometheus/alertmanager-0.25.0.linux-amd64/  /opt/prometheus/alertmanager
mv /opt/prometheus/grafana-9.4.3/  /opt/prometheus/grafana
mv /opt/prometheus/prometheus-2.37.6.linux-amd64/  /opt/prometheus/prometheus

5.1.6 部署node_exporter服务

开始部署node_exporter服务,用于当前服务器的数据采集。

Prometheus节点


#编写systemd文件cat >> /usr/lib/systemd/system/node_exporter.service << EOF[Unit]Description=node_exporterDocumentation=https://prometheus.io/After=network.target[Service]User=prometheusGroup=prometheusExecStart=/opt/prometheus/node_exporter/node_exporterRestart=on-failure[Install]WantedBy=multi-user.targetEOF#递归的将用户和组改为prometheuschown -R prometheus:prometheus /opt/prometheus#重载systemd配置,并启动node_exporter服务systemctl daemon-reloadsystemctl start node_exportersystemctl enable node_exporter

查看node_exporter状态,浏览器访问http://prometheus_ip:9100/metrics查看node_exporter服务数据。


查看node_exporter状态

2 查看node_exporter网页数据

5.1.7 部署alertmanager服务

部署告警服务器。

Prometheus节点


#编写systemd文件cat >> /usr/lib/systemd/system/alertmanager.service << EOF[Unit]Description=Alert ManagerWants=network-online.targetAfter=network-online.target[Service]Type=simpleUser=prometheusGroup=prometheusExecStart=/opt/prometheus/alertmanager/alertmanager \--config.file=/opt/prometheus/alertmanager/alertmanager.yml \--storage.path=/opt/prometheus/alertmanager/dataRestart=always[Install]WantedBy=multi-user.targetEOF#递归的将用户和组改为prometheuschown -R prometheus:prometheus /opt/prometheus#重载systemd配置,并启动alertmanager服务systemctl daemon-reloadsystemctl start alertmanagersystemctl enable alertmanager

查看alertmanager状态,浏览器访问http://prometheus_ip: 9093/#/status查看alertmanager服务状态。

查看alertmanager状态

图5-4 alertmanager服务状态

5.1.8 部署prometheus服务

部署普罗米修斯服务,修改对应的配置文件,正式启动监控服务。

Prometheus节点


#编写systemd文件cat >> /usr/lib/systemd/system/prometheus.service << EOF[Unit]Description=Prometheus ServerDocumentation=https://prometheus.io/docs/introduction/overview/After=network-online.target[Service]Type=simpleUser=prometheusGroup=prometheusRestart=on-failureExecStart=/opt/prometheus/prometheus/prometheus \--config.file=/opt/prometheus/prometheus/prometheus.yml \--storage.tsdb.path=/opt/prometheus/prometheus/data \--storage.tsdb.retention.time=60d \--web.enable-lifecycle[Install]WantedBy=multi-user.targetEOF#配置告警规则cat >> /opt/prometheus/prometheus/alert.yml << EOFgroups:- name: Prometheus alertrules:# 对任何实例超过30s无法联系的情况发出警报- alert: 服务告警expr: up == 0for: 30slabels:severity: criticalannotations:instance: "{{ $labels.instance }}"description: "{{ $labels.job }} 服务已关闭"EOF#修改prometheus.yml配置cat > /opt/prometheus/prometheus/prometheus.yml << EOF# my global configglobal:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# Alertmanager configurationalerting:alertmanagers:- static_configs:- targets:- localhost:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.rule_files:- "alert.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:# Here it's Prometheus itself.scrape_configs:# The job name is added as a label  to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["localhost:9090"]- job_name: 'alertmanager'scrape_interval: 15sstatic_configs:- targets: ['localhost:9093']- job_name: 'node-exporter'scrape_interval: 15sstatic_configs:- targets: ['localhost:9100']labels:instance: Prometheus服务器EOF#递归的将用户和组改为prometheuschown -R prometheus:prometheus /opt/prometheus#重载systemd配置,并启动prometheus服务systemctl daemon-reloadsystemctl start prometheussystemctl enable prometheus

查看prometheus状态,浏览器访问http://prometheus_ip: 9090查看三个服务状态是否正常。

5 查看prometheus状态

6查看三个服务状态

5.1.9 部署grafana服务

部署grafana实现数据的可视化,对接普罗米修斯。

Prometheus节点

#编写systemd文件cat >> /usr/lib/systemd/system/grafana-server.service << EOF[Unit]Description=Grafana serverDocumentation=http://docs.grafana.org[Service]Type=simpleUser=prometheusGroup=prometheusRestart=on-failureExecStart=/opt/prometheus/grafana/bin/grafana-server \--config=/opt/prometheus/grafana/conf/defaults.ini \--homepath=/opt/prometheus/grafana[Install]WantedBy=multi-user.targetEOF#递归的将用户和组改为prometheuschown -R prometheus:prometheus /opt/prometheus#重载systemd配置,并启动grafana服务systemctl daemon-reloadsystemctl start grafana-serversystemctl enable grafana-server

查看grafana状态,浏览器访问http://prometheus_ip:3000可以看到grafana的登录页面。

图5-7 查看grafana状态

图5-8 grafana的登录页面

5.1.10 配置grafana对接Prometheus

浏览器访问http://prometheus_ip:3000登录grafana,账号密码默认为admin/admin,登录后提示修改密码。

图5-9 登录配置

修改完密码后,我们配置grafana的数据源为Prometheus,点击左下角“设置图标”点击Data sources 点击Prometheus。

0 配置数据源

设置Prometheus服务地址,这里两个服务都在同一台主机可以直接使用localhost,点击save&test保存测试能否成功。

1 配置Prometheus地址

2 保存测试数据源

设置好数据源后,我们需要设置node_exporter的dashboard方便我们观察到监控数据。

3 进入配置dashboard界面

4 配置dashboard-json

关于配置dashboard的方法有两种,一种是上传json文件,一种是以id的方式配置,获取id和json文件的方式需要访问https://grafana.com/grafana/dashboards/因为网络原因,我们此次使用提前准备的json文件配置。

5 node_exporter-dashboard配置

6 可以复制id或者下载json文件

上传json文件后,进行基本的设置,设置完成后点击import,即可配置完毕,查看到本机linux服务器数据仪表盘。

基本配置

Linux服务器数据dashboard

5.2 部署docker

5.2.1 基本环境配置

配置docker主机的主机名,和基本的环境配置,关闭防火墙等。

#docker节点执行#修改主机名hostnamectl set-hostname docker-server#关闭防火墙systemctl stop firewalldsystemctl disable firewalldsetenforce 0sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

5.2.2 部署docker服务

使用docker提供的网络源安装docker服务器,并且配置阿里云镜像加速器。

docker节点执行


#安装必要的一些系统工具sudo yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo [http://download.docker.com/linux/centos/docker-ce.repo](http://download.docker.com/linux/centos/docker-ce.repo)#加载元数据sudo yum makecache fast#安装dockeryum -y install docker-ce-18.06.3.ce-3.el7yum -y install docker-composemkdir -p /etc/dockercat >> /etc/docker/daemon.json <<EOF{"registry-mirrors":["https://fem5eo07.mirror.aliyuncs.com"]}EOF#启动dockersystemctl start dockersystemctl enable docker

5.2.3 部署cadvisor容器

部署docker的数据采集容器。

#docker节点执行#拉取镜像文件docker pull google/cadvisor#编写docker-compose.yaml文件cat >> docker-compose.yaml << EOFversion: "3.0"services:monitor:container_name: cadvisorimage: google/cadvisorrestart: alwaysvolumes:- /:/rootfs:ro- /var/run:/var/run:rw- /sys:/sys:ro- /var/lib/docker/:/var/lib/docker:roports:- 8080:8080EOF#启动容器docker-compose up -d#查看状态[root@docker-server ~]# docker-compose psName                Command               State           Ports--------------------------------------------------------------------------cadvisor   /usr/bin/cadvisor -logtostderr   Up      0.0.0.0:8080->8080/tcp.

使用浏览器访问cadvisor服务http://192.168.100.251:8080/metrics,查看metrics数据。


metrics数据

5.2.4 配置Prometheus获取cadvisor服务数据

Cadvisor容器获取了docker容器平台的大部分数据,并且数据格式符合Prometheus的规范,Prometheus可以直接获取数据。

#Prometheus节点执行cat >>/opt/prometheus/prometheus/prometheus.yml<< EOF- job_name: 'Docker'scrape_interval: 15sstatic_configs:- targets: ['192.168.100.251:8080']labels:instance: Docker服务器EOF#热加载配置curl -X POST http://localhost:9090/-/reload

访问http://192.168.100.250:9090/targets?search=查看Prometheus是否成功添加了docker平台数据,

0 查看状态

5.2.5 配置docker监控的dashboard

访问grafana的dashboard-import,导入docker-dashboard的dashboard-ID号11600。

1添加docker-dashboard JSON文件

2 查看dashboard

5.2.6 配置docker的告警配置文件

修改普罗米修斯的配置文件,编写一个告警规则。

#Prometheus节点执行#创建文件夹mkdir -p /opt/prometheus/prometheus/rules/#编辑prometheus.ymlvi prometheus.yml#添加红色配置rule_files:- "alert.yml"<font style="color:red;">  - "rules/*.yml"</font>#编写告警配置文件cat >> /opt/prometheus/prometheus/rules/docker.yml << EOFgroups:- name: DockerContainersrules:- alert: Containerkilledexpr: time() - container_last_seen > 60for: 0mlabels:severity: warningannotations:isummary: "Docker容器被杀死 容器: $labels.instance"description: "{{ $value }}个容器消失了"- alert: ContainerAbsentexpr: absent(container_last_seen)for: 5mlabels:severity: warningannotations:summary: "无容器 容器: $labels.instance"description: "5分钟检查容器不存在,值为: {{ $value }}"EOF#重新加载配置chown -R prometheus:prometheus /opt/Prometheuscurl -X POST http://localhost:9090/-/reload

访问Prometheus查看是否成功。

docker告警

5.3 监控docker平台服务

5.3.1 监控docker-nginx容器

5.3.1.1部署nginx容器

部署用于测试的nginx容器。

#docker节点#创建目录mkdir -p /root/nginx/conf.d#编写nginx配置文件cat >> /root/nginx/conf.d/server.conf << EOFserver {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;
}
}
EOF#编写nginx的docker-compose.yamlcat >>/root/nginx/docker-compose.yaml<< EOF
version: "3.0"
services:nginx:image: nginxcontainer_name: nginxports:- 80:80volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d/- /root/nginx/html:/usr/share/nginx/html- /root/nginx/log:/var/log/nginx
EOF
#检查是否安装with-http_stub_status_module模块
docker-compose exec  nginx  nginx -V |grep -o with-http_stub_status_module
with-http_stub_status_module
#开启stub_status配置
cat > /root/nginx/conf.d/server.conf << EOF
server {listen       80;server_name  localhost;location /stub_status {stub_status on;access_log off;#allow nginx_exporter的ip;allow 0.0.0.0/0;deny all;}location / {root   /usr/share/nginx/html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;
}
}
EOF#nginx重新加载配置文件docker exec -it nginx nginx -s reload#检查是否正常开启[root@docker-server nginx]# curl 192.168.100.251/stub_statusActive connections: 1server accepts handled requests1 1 1Reading: 0 Writing: 1 Waiting: 0
5.3.1.2部署nginx-exporter

部署用于收集nginx数据的exporter


#docker节点#创建目录mkdir -p /root/nginx/mon#编写nginx-exporter的docker-compose.yamlcat >>/root/nginx/mon/docker-compose.yaml<< EOFversion: '3.0'services:nginx_exporter:image: nginx/nginx-prometheus-exporter:0.11container_name: nginx_exporterhostname: nginx_exportercommand:- '-nginx.scrape-uri=http://192.168.100.251/stub_status'restart: alwaysports:- "9113:9113"EOF#启动nginx_exporterdocker-compose up -d#检查状态[root@docker-server mon]# docker-compose psName                   Command               State           Ports--------------------------------------------------------------------------------nginx_exporter   /usr/bin/nginx-prometheus- ...   Up      0.0.0.0:9113->9113/tcp添加到prometheus配置。#prometheus节点#加入以下配置vi /opt/prometheus/prometheus/prometheus.yml- job_name: 'Docker-nginx'scrape_interval: 15sstatic_configs:- targets: ['192.168.100.251:9113']labels:instance: Docker服务器nginx#热加载配置curl -X POST http://localhost:9090/-/reload

访问grafana的dashboard-import,导入nginx-dashboard-ID号12708,即可添加nginx的dashboard。

4 nginx-dashboard

5.3.1.3配置nginx的告警设置

配置nginx的邮箱告警规则。

#prometheus节点#编写告警配置文件cat >>/opt/prometheus/prometheus/rules/nginx.yml<< EOFgroups:- name: Nginxrules:- alert: NginxDownexpr: nginx_up == 0for: 30slabels:severity: criticalannotations:isummary: "nginx异常,实例:{{ $labels.instance }}"description: "{{ $labels.job }} nginx已关闭"EOF#重新加载配置chown -R prometheus:prometheus /opt/prometheuscurl -X POST http://localhost:9090/-/reload

访问Prometheus查看是否成功。

mysql告警

5.3.2 监控docker-mysql容器

5.3.2.1部署mysql容器

部署mysql测试容器。


#docker节点#创建目录mkdir /root/mysql#编写docker-compose.yamlcat >> docker-compose.yaml<< EOFversion: '3.0'services:db:image: mysqlrestart: alwayscontainer_name: mysqlports:- 3306:3306environment:MYSQL_DATABASE: prometheusMYSQL_USER: user1MYSQL_PASSWORD: '000000'MYSQL_RANDOM_ROOT_PASSWORD: '000000'EOF#部署mysqldocker-compose up -d#查看状态docker-compose ps[root@docker-server mysql]# docker-compose psName              Command             State                 Ports-------------------------------------------------------------------------------mysql   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
5.3.2.2部署mysqld-exporter‘

部署用于采集mysql容器数据的exporter。


#docker节点执行#创建工作目录mkdir /root/mysql/mon#编写docker-compose.yamlcat >> docker-compose.yaml<< EOFversion: '3.0'services:mysql-exporter:image: prom/mysqld-exportercontainer_name: mysqld-exporterrestart: alwayscommand:- '--collect.info_schema.processlist'- '--collect.info_schema.innodb_metrics'- '--collect.info_schema.tablestats'- '--collect.info_schema.tables'- '--collect.info_schema.userstats'- '--collect.engine_innodb_status'environment:- DATA_SOURCE_NAME=prometheus:000000@(192.168.100.251:3306)/ports:- 9104:9104EOF#部署mysqld-exporterdocker-compose up -d#查看状态[root@docker-server mon]# docker-compose psName                    Command               State           Ports---------------------------------------------------------------------------------mysqld-exporter   /bin/mysqld_exporter --col ...   Up      0.0.0.0:9104->9104/tcp添加到prometheus配置。#prometheus节点#加入以下配置vi /opt/prometheus/prometheus/prometheus.yml- job_name: 'Docker-mysql'scrape_interval: 15sstatic_configs:- targets: ['192.168.100.251:9104']labels:instance: Docker服务器mysql#热加载配置
curl -X POST http://localhost:9090/-/reload

访问grafana的dashboard-import,导入7362和9625,分别为mysql数据库,和mysql数据表的dashboard-ID号。

6 数据库dashboard

27数据表dashboard

5.3.2.3配置mysql的告警设置

配置mysql的邮箱告警配置文件。

#prometheus节点#编写告警配置文件cat >>/opt/prometheus/prometheus/rules/mysql.yml<< EOFgroups:- name: DockerContainersrules:- alert: Containerkilledexpr: time() - container_last_seen > 60for: 0mlabels:severity: warningannotations:isummary: "Docker容器被杀死 容器: {{ $labels.instance }}"description: "{{ $value }}个容器消失了"- alert: ContainerAbsentexpr: absent(container_last_seen)for: 5mlabels:severity: warningannotations:summary: "无容器 容器: {{ $labels.instance }}"description: "5分钟检查容器不存在,值为: {{ $value }}"EOF#重新加载配置chown -R prometheus:prometheus /opt/Prometheuscurl -X POST http://localhost:9090/-/reload

访问Prometheus查看是否成功。

8 mysql告警

5.4 alertmanager配置163邮箱告警

5.4.1 配置163邮箱

登录配置163邮箱开启POP3/SMTP服务。

9配置开启服务

0 开启服务

开启后会获得一个授权码,后续我们将使用这个授权码配置alertmanager.yml文件对接我们的163邮箱。

5.4.2 修改alertmanager配置

修改alertmanager配置文件,将我们的邮箱添加到alertmanager。


#Prometheus节点执行cat  >>alertmanager.yml<< EOFglobal:
#配置告警邮箱smtp_smarthost: 'smtp.163.com:465'
#163服务器smtp_from: 'a351719672@163.com'
#发邮件的邮箱smtp_auth_username: 'a351719672@163.com'
#发邮件的邮箱用户名smtp_auth_password: 'xxxxx'
#发邮件的邮箱密码smtp_require_tls: false
#进行tls验证
route:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'email'
#全局报警组,这个参数必选receivers:- name: 'email'email_configs:- to: '351719672@qq.com'#收邮件的邮箱inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']EOF#热加载配置curl -X POST http://localhost:9093/-/reload

5.4.3 测试告警服务

测试各个告警配置是否能成功生效

5.4.3.1 Nginx告警测试

停止nginx,测试nginx存活检测是否正常.

#docker节点执行

#测试nginx存活检测是否正常

[root@docker-server ~]# docker stop nginx

nginx

实例转为pending,进而变而FIRING。

nginx状态pending

nginx状态firing

可以看到邮箱正常接收到了nginx的告警。

邮箱nginx告警

5.4.3.2 Mysql告警测试

测试mysql存活检测是否正常

#docker节点执行

[root@docker-server ~]# docker stop mysql

Mysql

实例转为pending,进而变而FIRING。

4 mysql状态pending

5 mysql状态firing

可以看到邮箱正常接收到了mysql的告警。

邮箱mysql告警

5.4.3.3 docker容器告警测试

测试docker检测是否正常

#docker节点执行

#测试docker检测是否正常

[root@docker-server cadvisor]# docker stop cadvisor

cadvisor

实例转为pending进而变而FIRING。

docker状态pending

docker状态firing

可以看到邮箱正常接收到了docker的告警。

邮箱docker告警

相关文章:

【Project】基于Prometheus监控docker平台

一、设计背景 1.1项目简介 本项目旨在创建一个全面的容器化应用程序监控解决方案&#xff0c;基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中&#xff0c;容器化技术已成为一种关键的工具&#xff0c;使应用程序能够更快速、可靠地交付和扩展。然而&…...

AcWing 蓝桥杯集训·每日一题2025·密接牛追踪2

密接牛追踪2 农夫约翰有 N 头奶牛排成一排&#xff0c;从左到右依次编号为 1∼N。 不幸的是&#xff0c;有一种传染病正在蔓延。 最开始时&#xff0c;只有一部分奶牛受到感染。 每经过一个晚上&#xff0c;受感染的牛就会将病毒传染给它左右两侧的牛&#xff08;如果有的话…...

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用&#xff0c;如何实现&#xff1f; 在前端开发中&#xff0c;当需要渲染大量数据时&#xff0c;传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中&#xff0c;不仅会导致页面加载缓慢&#xff0c;还可能占用大量内存&#x…...

Linux基础 -- ARM 32位常用机器码(指令)整理

ARM 32位常用机器码&#xff08;指令&#xff09;整理 1. 数据处理指令&#xff08;运算、逻辑、比较&#xff09; 指令含义示例备注MOV赋值&#xff08;寄存器传输&#xff09;MOV R0, R1直接将 R1 复制到 R0MVN取反MVN R0, R1R0 ~R1ADD加法ADD R0, R1, R2R0 R1 R2ADC带进…...

【JAVA】阿里云百炼平台对接DeepSeek-V3大模型使用详解

1、DeepSeek简介 DeepSeek的火热让全世界见证了一场国产AI大模型走向巅峰的盛宴。DeepSeek的横空出世一方面让AI大模型的格局得到重塑&#xff0c;另一方面&#xff0c;对于普通人来说&#xff0c;也有机会零距离的体验到更懂国人的AI大模型。从很多使用过后的小伙伴们的反馈来…...

STM32之时钟树

左边是时钟产生电路&#xff0c;右边是时钟分配电路。中间的SYSCLK就是系统时钟72MHz&#xff0c;在产生电路有四个时钟源&#xff0c;分别是内部8MHz高速RC振荡器&#xff0c;外部的4-16MHz高速石英晶体振荡器&#xff0c;这个一般接8MHz,第三个是外部的32.768kHz低速晶振&…...

QT day1

作业 代码 class Widget: public QWidget {QPushButton* button; //按钮Widget* other; //显示对面 public:Widget(){button new QPushButton("按钮",this); //控件 认this作父this->resize(300,300); //界面大小button->resize(100,10…...

【机器学习】梯度下降法及使用一元二次方程模拟使用梯度下降法的代码实现

梯度下降法 一、摘要二、梯度下降法三、线性方程中使用梯度下降法 一、摘要 文本主要讲述了梯度下降法作为机器学习中的一种优化方法&#xff0c;用于最小化损失函数。它并非直接解决机器学习问题&#xff0c;而是作为求解最优参数的工具。通过二维坐标图直观展示了梯度下降法…...

Hive配置

目录 1. 引言2. 通过docker-compose联动启动Hadoop和MySQL容器3. 配置Hive3.1 下载并解压Hive-4.0.12.2 配置环境变量2.3 安装mysql-connector的jar包2.4 配置Hive2.4.1 hive-env.sh2.4.2 hive-site.xml2.4.2.1 javax.jdo.option.ConnectionURL2.4.2.2 javax.jdo.option.Connec…...

网络安全 越权分为几种

1. 权限查看 Linux 系统中的每个文件和目录都有访问许可权限&#xff0c;通过其确定谁可以通过何种方式对文件和目录进行访问和操作。 文件或目录的访问权限分为只读、只写和可执行3种。以文件为例&#xff0c;只读权限表示只允许读其内容&#xff0c;而禁止对其做任何的更改…...

PHP面试题--后端部分

本文章持续更新内容 之前没来得及整理时间问题导致每次都得找和重新背 这次整理下也方便各位小伙伴一起更轻松的一起踏入编程之路 欢迎各位关注博主不定期更新各种高质量内容适合小白及其初级水平同学一起学习 一起成为大佬 数组函数有那些 ps&#xff1a;本题挑难的背因为…...

HTTP~文件 MIME 类型

MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;类型&#xff0c;即多用途互联网邮件扩展类型&#xff0c;是一种标准&#xff0c;用来表示文档、文件或字节流的性质和格式。最初是为了在电子邮件系统中支持非 ASCII 字符文本、二进制文件附件等而设计的&a…...

工程化与框架系列(4)--Webpack 高级配置详解

Webpack 高级配置详解 &#x1f6e0;️ Webpack 是前端工程化中最流行的构建工具之一&#xff0c;掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。 Webpack 核心概念回顾 &#x1f31f; &#x1f4a1; 小知识&#xf…...

Let‘s Encrypt免费证书的应用示例

文章目录 前言证书申请证书介绍cert.pemchain.pemfullchain.pemprivkey.pem 使用步骤搭建简易demo应用新建nginx配置文件测试SSL是否生效 总结 前言 最近在搞苹果应用上架的问题&#xff0c;据说用HTTP会被拒&#xff0c;但貌似不绝对&#xff0c;2017年苹果曾发公告说必须要求…...

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…...

455. 分发饼干(LeetCode)

题目来源&#xff1a; 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 题目内容&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xf…...

Harmony os next~鸿蒙应用开发入门教程

鸿蒙应用开发入门教程 基础准备与环境搭建 1. 了解鸿蒙系统 1.1 核心理念学习 HarmonyOS&#xff08;鸿蒙系统&#xff09;是华为推出的全场景分布式操作系统&#xff0c;其核心特点如下&#xff1a; 分布式能力 设备协同&#xff1a;手机、平板、智能手表、IoT设备等可无…...

数据库数据恢复—SQL Server附加数据库报错“错误 823”怎么办?

SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”&#xff0c;附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份&#xff0c;备份时间太久&#xff0c;或者其他原因导致备份不可用&#xff0c;那么就需要通过专业手段对数据库进行数据恢复…...

树莓派安装ros docker

系统&#xff1a;bookworm或者ubuntu24都行 一、下载docker和拉取ros:noetic镜像 ubuntu 用鱼香ros脚本安装docker并拉取ros:noetic镜像&#xff1a; https://fishros.org.cn/forum/topic/20/小鱼的一键安装系列 wget http://fishros.com/install -O fishros && . …...

MyBatis-Plus 自动填充功能

MyBatis-Plus&#xff08;MP&#xff09; 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时&#xff0c;自动为某些字段赋值&#xff0c;免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间 和 更新时间 字段的自动填充&#xff0c;帮助开发…...

折半搜索笔记

前言 01 01 01 爆搜的时间复杂度通常为 O ( 2 n ) O(2^n) O(2n)&#xff0c;只能应付 N N N 为 20 20 20 左右的题目&#xff0c;但是折半搜索可以应付 N N N 为 30 30 30 ~ 40 40 40 的题目。 思想 将 N N N 个数分为前后两半&#xff0c;先搜索前一半的状态&#xf…...

vue 项目部署到nginx 服务器

一 vue 项目打包 1 本地环境 npm run build 2 打包完成生成一个dist 文件夹&#xff0c;将其放到服务器指定的文件夹&#xff0c;此文件夹可以在nginx 配置文件中配置 二 nginx 1 根据对应的系统搜索安装命令 sudo yum install nginx 2 查看conf位置 如果不知道的话 ng…...

JavaWeb基础专项复习6——AJAX

系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 5、JavaWeb基础专项复习5——请求对象…...

RabbitMQ快速入门

目录 MQ简介 1、同步通信 图片 2、异步通信 图片 RabbitMQ快速上手 基本介绍&#xff1a; Producer和Consumer Connection和Channel Virtual host Queue Exchange 工作流程 AMQP Java编写RabbitMQ生产者消费者 生产者 1.建立连接 2.开启信道 3.声明交换机 4.声…...

内存中的缓存区

在 Java 的 I/O 流设计中&#xff0c;BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区&#xff08;具体是 JVM 堆内存的一部分&#xff09;&#xff0c;但它们的作用是优化数据的传输效率&#xff0c;并不是直接操作硬盘和内存之间的缓存。以下是详…...

快速列出MS Word中所有可用字体

Word中有很多字体&#xff0c;虽然在字体下拉列表中提供了字体的样例&#xff0c;但是并不全面&#xff0c;例如使用Batang字体的话&#xff0c;数字会显示成什么效果&#xff0c;就无法直观的看到。 打开Word应用程序&#xff0c;新建一个空白文档&#xff0c;按AltF11打开VBE…...

《机器学习数学基础》补充资料:矩阵的LU分解

本文是对《机器学习数学基础》第2章2.3.3节矩阵LU分解的拓展。 判断是否可LU分解 并非所有矩阵都可以实现LU分解。 定理1&#xff1a; 若 n n n 阶可逆矩阵 A \pmb{A} A 可以进行LU分解&#xff0c;则 A \pmb{A} A 的 k k k 阶顺序主子阵&#xff08;leading principal s…...

seasms v9 注入漏洞 + order by注入+​information_schema​解决方法

目录 一、当注入时&#xff0c;information_schema被禁用的解决方法 1.通过sys库可以获取到表名和库名 2.通过无列名注入join获取列名 二、seasms v9 注入漏洞 三、order by注入 一、当注入时&#xff0c;information_schema被禁用的解决方法 information_schema数据库是My…...

跨端方案选型:对比Uni-app与Taro在复杂电商项目中的技术选型依据参考

跨端方案选型:对比Uni-app与Taro在复杂电商项目中的技术选型依据参考 请赏析: Uni-app与Taro复杂电商项目选型对比指南 一、核心选型维度速记 技术栈匹配 → 跨端能力 → 性能优化 → 开发效率 → 生态支持 → 长期维护二、关键维度对比分析 1. 技术栈匹配性 框架技术栈适…...

C语言32个关键字

32个关键字 1.基本数据类型 signed unsigned char int float double short long void 2.构造数据类型 struct union enum 3.数据存储类别 auto static extern register 4.数据优化 const volatile 5. 9条基本语句 if else switch case break default while do for…...

音乐游戏Drummania(GITADORA)模拟器

文章目录 &#xff08;一&#xff09;Drummania和GITADORA&#xff08;1.1&#xff09;基本情况&#xff08;1.2&#xff09;机体 &#xff08;二&#xff09;模拟器&#xff08;2.1&#xff09;主程序&#xff08;2.2&#xff09;模拟器主题 &#xff08;三&#xff09;曲谱文…...

WPF中对滚动条进行平滑滚动

有时候我们在动态添加内容时&#xff0c;需要将滚动条滚动到指定内容处。 一般我们会调用ScrollViewer的ScrollToVerticalOffset&#xff08;垂直方向&#xff09;函数和ScrollToHorizontalOffset&#xff08;水平方向&#xff09;函数来控制滚动条滚动到指定位置。 正常滚动效…...

【通俗讲解电子电路】——从零开始理解生活中的电路(一)

导言&#xff1a;电子电路为什么重要&#xff1f; ——看不见的“魔法”&#xff0c;如何驱动你的生活&#xff1f; 清晨&#xff0c;当你的手机闹钟响起时&#xff0c;你可能不会想到&#xff0c;是电子电路在精准控制着时间的跳动&#xff1b;当你用微波炉加热早餐时&#…...

达梦:内存相关参数

目录 28个相关参数1. 内存池相关MEMORY_POOLMEMORY_N_POOLSMEMORY_BAK_POOL 2. 大缓冲区相关HUGE_BUFFERHUGE_BUFFER_POOLS 3. 共享缓冲区相关BUFFERBUFFER_POOLSBUFFER_MODEMAX_BUFFER 4. 快速池相关FAST_POOL_PAGES 5. 回收池相关RECYCLE_POOLS 6. 回滚段池相关ROLLSEG_POOLS…...

MySql面试总结(一)

mysql中排序是怎么实现的? MySQL 中的排序主要通过ORDER BY子句来实现,其底层实现方式有文件排序和索引排序两种,以下是具体介绍: 通过ORDER BY子句实现排序 这是 MySQL 中进行排序的基本方式,语法为SELECT column1, column2,... FROM table_name ORDER BY column_name…...

YOLOv5 + SE注意力机制:提升目标检测性能的实践

一、引言 目标检测是计算机视觉领域的一个重要任务&#xff0c;广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本&#xff0c;以其高效性和准确性在实际应用中表现出色。然而&#xff0c;随着应用场景的复杂化&#xff0c;传统的卷积神经网络在处…...

第十四届蓝桥杯大赛软件赛国赛C/C++大学C组

A 【跑步计划——日期问题】-CSDN博客 B 【残缺的数字】-CSDN博客 C 题目 代码 #include <bits/stdc.h> using namespace std;void change(int &x) {int sum 0, t x;while(t){sum t % 10;t / 10;}x - sum; } int main() {int n;cin >> n;int ans 0;…...

【备份】php项目处理跨域请求踩坑

这都是老生常谈的东西了。我还在踩坑&#xff0c;记录一下。 我在项目入口明明写了如下代码&#xff1a; // 处理预检请求 (OPTIONS) if ($_SERVER[REQUEST_METHOD] OPTIONS) {header("Access-Control-Allow-Origin: https://xxx.vip");header("Access-Cont…...

编程题 - 汽水瓶【JavaScript/Node.js解法】

‌“学如逆水行舟&#xff0c;不进则退。”‌ ——《增广贤文》 目录 汽水瓶 题目&#xff1a;解答分析&#xff1a;js代码解答 -ACM模式&#xff1a;代码通过&#xff1a;题解分析&#xff1a;简洁思路代码&#xff1a; 汽水瓶 题目&#xff1a; 某商店规定&#xff1a;三个空…...

【考研】复试相关上机题目

文章目录 22机试回忆版1、判断燃气费描述输入格式输出格式输入样例输出样例 C o d e Code Code 2、统计闰年数量描述输入格式输出格式输入样例输出样例 C o d e Code Code 3、打印图形描述输入格式输出格式 C o d e Code Code 4、密文数据描述输入格式输出格式输入样例输出样例…...

HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统

适用型号&#xff1a;【BOD-WXX9】 MagicBook 15 2021款 i7 独显 MX450 16GB512GB (BDR-WFE9HN) MagicBook 15 2021款 i5 独显 MX450 16GB512GB (BDR-WFH9HN) MagicBook 15 2021款 i5 集显 16GB512GB (BDR-WFH9HN) 链接&#xff1a;https://pan.baidu.com/s/1S6L57ADS18fnJZ1…...

微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果

一、效果图 1、主页面 根据物品信息进行菜单分类&#xff0c;点击单项购物车图标添加至购物车&#xff0c;记录总购物车数量 2、购物车详情页 根据主页面选择的项&#xff0c;根据后台查询展示到页面&#xff0c;可进行多选&#xff0c;数量加减等 二、代码 1、主页面 页…...

Spring Boot集成MyBatis访问MySQL:从项目搭建到基础数据库查询(基础入门)

Spring Boot集成MyBatis访问MySQL 一、引言 在当今企业级应用开发中&#xff0c;Spring Boot、MyBatis与MySQL的组合凭借其高效性和灵活性&#xff0c;成为构建数据驱动型应用的首选方案。本文将带你从零开始搭建项目&#xff0c;掌握Spring Boot集成MyBatis的基础入门内容。…...

基于STM32的智能家居能源管理系统

1. 引言 传统家庭能源管理存在能耗监控粗放、设备联动不足等问题&#xff0c;难以适应绿色低碳发展需求。本文设计了一款基于STM32的智能家居能源管理系统&#xff0c;通过多源能耗监测、负荷预测与优化调度技术&#xff0c;实现家庭能源的精细化管理与智能优化&#xff0c;提…...

OpenAI发布GPT-4.5:功能非常特殊,推理很贵

今天凌晨4点&#xff0c;OpenAI进行了在线技术直播&#xff0c;发布了最新模型GPT-4.5。 GPT-4.5与之前的模型相比&#xff0c;本次最大的亮点是加上了“情商”&#xff0c;这也是目前所有大模型最缺、最难的功能。 此外&#xff0c;GPT-4.5 在SimpleQA上的测试数据显示&…...

DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略

DualPipe简介 今天是DeepSeek开源周的第四天&#xff0c;官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学&#xff0c;对这个技术并不陌生。 开源地址&#xff1a;https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…...

RabbitMQ系列(七)基本概念之Channel

RabbitMQ 中的 Channel&#xff08;信道&#xff09; 是客户端与 RabbitMQ 服务器通信的虚拟会话通道&#xff0c;其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析&#xff1a; 一、Channel 的核心定义 虚拟通信链路 Channel 是建立在 TCP 连…...

LeetCode 热题 100_有效的括号(69_20_简单_C++)(栈;栈+哈希表(建立左右括号的对应关系))

LeetCode 热题 100_有效的括号&#xff08;69_20&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;栈&#xff09;&#xff1a;思路二&#xff08;栈哈希表&#xff08;建立左右括号的对应关系&#xff09;&a…...

c#-LINQ与lambda表达式学习笔记

https://blog.csdn.net/m0_56259289/article/details/144134122 static void Main(string[] args) //程序入口{int[] arr1 new int[] { 1, 2, 3, 4, 5, 6, 7 };int[] arr2 new int[] { 1, 2, 3, 4, 5, 6, 7 };var query1 from n in arr1 select n;var query2 from a in arr…...

数据库基础二(数据库安装配置)

打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是&#xff1a; 1&#xff1a;安装所有 MySQL 数据库需要的产品&#xff1b; 2&#xff1a;仅使用 MySQL 数据库的服务器&#xff1b; 3&a…...