k8s集群 安装配置 Prometheus+grafana

news2024/9/21 20:49:02

k8s集群 安装配置 Prometheus+grafana

  • k8s环境如下:
    • 机器规划:
  • node-exporter组件安装和配置
    • 安装node-exporter
    • 通过node-exporter采集数据
      • 显示192.168.40.180主机cpu的使用情况
      • 显示192.168.40.180主机负载使用情况
  • Prometheus server安装和配置
    • 创建sa账号,对sa做rbac授权
    • 创建prometheus数据存储目录
    • 安装Prometheus server服务
    • 通过deployment部署prometheus
    • 给prometheus pod创建一个service
    • Prometheus热加载
  • 可视化UI界面Grafana的安装和配置
    • 安装Grafana
      • Grafana界面接入Prometheus数据源
    • 配置grafana界面:
      • 导入的监控模板,可在如下链接搜索
      • 如果Grafana导入Prometheusz之后,发现仪表盘没有数据,如何排查?
  • 安装kube-state-metrics组件
    • kube-state-metrics是什么?
    • 安装kube-state-metrics组件

k8s环境如下:

k8s集群: k8s的控制节点
ip:192.168.40.110
主机名:k8smaster1
配置:4vCPU/4Gi内存

k8s的工作节点:
ip:192.168.40.111
主机名:k8snode1
配置:4vCPU/4Gi内存

k8s版本1.25

机器规划:

我的实验环境使用的k8s集群是一个master节点和一个node节点
master节点的机器ip是192.168.40.110,主机名是k8smaster1
node节点的机器ip是192.168.40.111,主机名是k8snode1

node-exporter组件安装和配置

node-exporter介绍
node-exporter可以采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括CPU, 内存,磁盘,网络,文件数等信息。

安装node-exporter

node-exporter.tar.gz镜像压缩包上传到k8s的各个节点,手动解压:
链接:https://pan.baidu.com/s/1EBsJPfWDO3c1qMeaESe5Ig?pwd=7bbw
提取码:7bbw

kubectl create ns monitor-sa
ctr -n=k8s.io images import node-exporter.tar.gz
docker load -i node-exporter.tar.gz

node-export.yaml
链接:https://pan.baidu.com/s/1wqaDok9afK58AGTR-QlvGg?pwd=fjfr
提取码:fjfr

cat  node-export.yaml
kind: DaemonSet  #可以保证k8s集群的每个节点都运行完全一样的pod
	spec:
      hostPID: true
      hostIPC: true
      hostNetwork: true
# hostNetwork、hostIPC、hostPID都为True时,表示这个Pod里的所有容器
#会直接使用宿主机的网络,直接与宿主机进行IPC(进程间通信)通信,可以看到宿主机里正在运行的所有进程。
#加入了hostNetwork:true会直接将我们的宿主机的9100端口映射出来
#从而不需要创建service 在我们的宿主机上就会有一个9100的端口
 cpu: 0.15  #这个容器运行至少需要0.15核cpu
        securityContext:
          privileged: true  #开启特权模式
        args:
        - --path.procfs  #配置挂载宿主机(node节点)的路径
        - /host/proc
        - --path.sysfs  #配置挂载宿主机(node节点)的路径

        - '"^/(sys|proc|dev|host|etc)($|/)"'#通过正则表达式忽略某些文件系统挂载点的信息收集
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /rootfs
#将主机/dev、/proc、/sys这些目录挂在到容器中,这是因为我们采集的很多节点数据都是通过这些文件来获取系统信息的。

通过kubectl apply更新node-exporter.yaml文件

kubectl apply -f node-export.yaml

查看node-exporter是否部署成功

kubectl get pods -n monitor-sa

显示如下,看到pod的状态都是running,说明部署成功

在这里插入图片描述

通过node-exporter采集数据

显示192.168.40.180主机cpu的使用情况

curl  http://虚拟机ip:9100/metrics
curl http://192.168.40.110:9100/metrics | grep node_cpu_seconds

在这里插入图片描述

  • #HELP:解释当前指标的含义,上面表示在每种模式下node节点的cpu花费的时间,以s为单位
  • #TYPE:说明当前指标的数据类型,上面是counter类型
node_cpu_seconds_total{cpu="0",mode="idle"}
  • cpu0上idle进程占用CPU的总时间,CPU占用时间是一个只增不减的度量指标,从类型中也可以看出node_cpu的数据类型是counter(计数器)
  • counter计数器:只是采集递增的指标

显示192.168.40.180主机负载使用情况

curl http://192.168.40.180:9100/metrics | grep node_load

在这里插入图片描述

  • node_load1该指标反映了当前主机在最近一分钟以内的负载情况,系统的负载情况会随系统资源的使用而变化,因此node_load1反映的是当前状态,数据可能增加也可能减少,从注释中可以看出当前指标类型为gauge(标准尺寸)
  • gauge标准尺寸:统计的指标可增加可减少

Prometheus server安装和配置

创建sa账号,对sa做rbac授权

创建一个sa账号monitor

kubectl create serviceaccount monitor -n monitor-sa 

把sa账号monitor通过clusterrolebing绑定到clusterrole上

kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin  --serviceaccount=monitor-sa:monitor

注意:行上面授权可能回报错,那就需要下面的授权命令

kubectl create clusterrolebinding monitor-clusterrolebinding-1  -n monitor-sa --clusterrole=cluster-admin   --user=system:serviceaccount:monitor:monitor-sa

创建prometheus数据存储目录

在k8s集群的xianchaonode1节点上创建数据存储目录

#在节点创建
mkdir /data
chmod 777 /data/

安装Prometheus server服务

创建一个configmap存储卷,用来存放prometheus配置信息
通过kubectl apply更新configmap
prometheus-cfg.yaml文件上传到k8s控制节点k8smaster1上:
链接:https://pan.baidu.com/s/1lQGQLp7ikDHSanOusSMTWQ?pwd=w6w4
提取码:w6w4

kubectl apply  -f  prometheus-cfg.yaml
cat prometheus-cfg.yaml
      scrape_interval: 15s  #采集目标主机监控据的时间间隔
      scrape_timeout: 10s  # 数据采集超时时间,默认10s
      evaluation_interval: 1m   #触发告警检测的时间,默认是1m
      #我们写了超过80%的告警,结果收到多条告警,但是真实超过80%的只有一个时间点。
	#这是另外一个参数影响的
evaluation_interval #这个是触发告警检测的时间,默认为1m。假如我们的指标是5m被拉取一次。
#检测根据evaluation_interval 1m一次,所以在值被更新前,我们一直用的旧值来进行多次判断,造成了1m一次,同一个指标被告警了4次。

#scrape_configs:配置数据源,称为target,每个target用job_name命名。又分为静态配置和服务发现
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
#使用的是k8s的服务发现
      - role: node
# 使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。
      relabel_configs:
#重新标记
      - source_labels: [__address__] #配置的原始标签,匹配地址
        regex: '(.*):10250'   #匹配带有10250端口的url
        replacement: '${1}:9100'  #把匹配到的ip:10250的ip保留
        target_label: __address__ #新生成的url是${1}获取到的ip:9100
        action: replace
      - action: labelmap 
#匹配到下面正则表达式的标签会被保留,如果不做regex正则的话,默认只是会显示instance标签
        regex: __meta_kubernetes_node_label_(.+)

- job_name: 'kubernetes-node-cadvisor'
# 抓取cAdvisor数据,是获取kubelet上/metrics/cadvisor接口数据来获取容器的资源使用情况
      - action: labelmap  #把匹配到的标签保留
        regex: __meta_kubernetes_node_label_(.+)   #保留匹配到的具有__meta_kubernetes_node_label的标签
      - target_label: __address__  #获取到的地址:__address__="192.168.40.110:10250"
        replacement: kubernetes.default.svc:443  #把获取到的地址替换成新的地址kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name] #把原始标签中__meta_kubernetes_node_name值匹配到
        regex: (.+)

        target_label: __metrics_path__   #获取__metrics_path__对应的值
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor    #把metrics替换成新的值api/v1/nodes/k8smaster1/proxy/metrics/cadvisor
#  ${1}是__meta_kubernetes_node_name获取到的值
#新的url就是https://kubernetes.default.svc:443/api/v1/nodes/k8smaster1/proxy/metrics/cadvisor

    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints  #使用k8s中的endpoint服务发现,采集apiserver 6443端口获取到的数据
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]  #endpoint这个对象的名称空间 ,endpoint对象的服务名,exnpoint的端口名称]
        action: keep  #采集满足条件的实例,其他实例不采集
        regex: default;kubernetes;https #正则匹配到的默认空间下的service名字是kubernetes,协议是https的endpoint类型保留下来
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
# 重新打标仅抓取到的具有 "prometheus.io/scrape: true" 的annotation的端点,意思是说如果某个service具有prometheus.io/scrape = true annotation声明则抓取,annotation本身也是键值结构,所以这里的源标签设置为键,而regex设置值true,当值匹配到regex设定的内容时则执行keep动作也就是保留,其余则丢弃。
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
#重新设置scheme,匹配源标签__meta_kubernetes_service_annotation_prometheus_io_scheme也就是prometheus.io/scheme annotation,如果源标签的值匹配到regex,则把值替换为__scheme__对应的值。
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
# 应用中自定义暴露的指标,也许你暴露的API接口不是/metrics这个路径,那么你可以在这个POD对应的service中做一个"prometheus.io/path = /mymetrics" 声明,上面的意思就是把你声明的这个路径赋值给__metrics_path__,其实就是让prometheus来获取自定义应用暴露的metrices的具体路径,不过这里写的要和service中做好约定,如果service中这样写 prometheus.io/app-metrics-path: '/metrics' 那么你这里就要
__meta_kubernetes_service_annotation_prometheus_io_app_metrics_path这样写。
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
# 暴露自定义的应用的端口,就是把地址和你在service中定义的 "prometheus.io/port = <port>" 声明做一个拼接,然后赋值给__address__,这样prometheus就能获取自定义应用的端口,然后通过这个端口再结合__metrics_path__来获取指标,如果__metrics_path__值不是默认的/metrics那么就要使用上面的标签替换来获取真正暴露的具体路径。

在这里插入图片描述

scrape_configs:
#scrape_configs:配置数据源,称为target,每个target用job_name命名。又分为静态配置和服务发现
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
#使用的是k8s的服务发现
      - role: node
# 使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。
      relabel_configs:
#重新标记
      - source_labels: [__address__] #配置的原始标签,匹配地址
        regex: '(.*):10250'   #匹配带有10250端口的url
        replacement: '${1}:9100'  #把匹配到的ip:10250的ip保留
        target_label: __address__ #新生成的url是${1}获取到的ip:9100
        action: replace
      - action: labelmap 
#匹配到下面正则表达式的标签会被保留,如果不做regex正则的话,默认只是会显示instance标签
        regex: __meta_kubernetes_node_label_(.+)

通过deployment部署prometheus

镜像prometheus-2-2-1.tar.gz上传到k8s的工作节点k8snode1上,手动解压
链接:https://pan.baidu.com/s/1arlhVb0q-9tWe9KHZG1Htg?pwd=j6m1
提取码:j6m1

ctr -n=k8s.io images import prometheus-2-2-1.tar.gz
#1.24前用  docker load -i prometheus-2-2-1.tar.gz

prometheus-deploy.yaml 上传至k8smaster1
链接:https://pan.baidu.com/s/11QOcz5udgbMpxGoYD6pP9w?pwd=rkp6
提取码:rkp6

kubectl apply -f prometheus-deploy.yaml
cat prometheus-deploy.yaml
          - --storage.tsdb.path=/prometheus  #旧数据存储目录
          - --storage.tsdb.retention=720h    #何时删除旧数据,默认为15天。
          - --web.enable-lifecycle   #开启热加载

注意:在上面的prometheus-deploy.yaml文件有个nodeName字段,这个就是用来指定创建的这个prometheus的pod调度到哪个节点上,我们这里让nodeName=k8snode1,也即是让pod调度到k8snode1节点上,因为k8snode1节点我们创建了数据目录/data,所以大家记住:你在k8s集群的哪个节点创建/data,就让pod调度到哪个节点,nodeName根据你们自己环境主机去修改即可。

查看prometheus是否部署成功

kubectl get pods -n monitor-sa

在这里插入图片描述

给prometheus pod创建一个service

prometheus-svc.yaml文件上传到k8s的控制节点k8smaster1上:
链接:https://pan.baidu.com/s/1j9Nz7trUT6rgZ9kS-ANb7Q?pwd=hgql
提取码:hgql

kubectl apply -f prometheus-svc.yaml

查看service在物理机映射的端口

kubectl get svc -n monitor-sa

在这里插入图片描述

通过上面可以看到service在宿主机上映射的端口是31090,这样我们访问k8s集群的master1节点的ip:31090,就可以访问到prometheus的web ui界面了
#访问prometheus web ui界面
火狐浏览器输入如下地址:

http://192.168.40.110:31090/graph

可看到如下页面:

在这里插入图片描述

点击页面的Status->Targets,可看到如下,说明我们配置的服务发现可以正常采集数据
在这里插入图片描述

Prometheus热加载

为了每次修改配置文件可以热加载prometheus,也就是不停止prometheus,就可以使配置生效,想要使配置生效可用如下热加载命令:

kubectl get pods -n monitor-sa -o wide -l app=prometheus

在这里插入图片描述

10.244.249.2是prometheus的pod的ip地址,如何查看prometheus的pod ip

想要使配置生效可用如下命令热加载:

curl -X POST http://10.244.249.2:9090/-/reload
  • 热加载速度比较慢,可以暴力重启prometheus,如修改上面的prometheus-cfg.yaml文件之后,可执行如下强制删除:
kubectl delete -f prometheus-cfg.yaml
kubectl delete -f prometheus-deploy.yaml
  • 然后再通过apply更新:
kubectl apply -f prometheus-cfg.yaml
kubectl apply -f prometheus-deploy.yaml

注意:线上最好热加载,暴力删除可能造成监控数据的丢失

可视化UI界面Grafana的安装和配置

安装Grafana

镜像heapster-grafana-amd64_v5_0_4.tar.gz上传到k8s的工作节点k8snode1上,手动解压:
链接:https://pan.baidu.com/s/1CMP6Ju-Zi-4dmJy2eSVtew?pwd=fkls
提取码:fkls

ctr -n=k8s.io images import  heapster-grafana-amd64_v5_0_4.tar.gz

grafana.yaml文件上传到k8s的控制节点:

kubectl apply -f grafana.yaml

查看grafana是否创建成功:

kubectl get pods -n kube-system -l task=monitoring

在这里插入图片描述

Grafana界面接入Prometheus数据源

查看grafana前端的service

kubectl get svc -n kube-system | grep grafana  

在这里插入图片描述

登陆grafana,在浏览器访问
192.168.40.110:30551

配置grafana界面:

选择Create your first data source
Name: Prometheus
Type: Prometheus
HTTP 处的URL写 如下:

http://prometheus.monitor-sa.svc:9090

配置好的整体页面如下:
在这里插入图片描述

点击左下角Save & Test,出现如下Data source is working,说明prometheus数据源成功的被grafana接入了

导入的监控模板,可在如下链接搜索

https://grafana.com/dashboards?dataSource=prometheus&search=kubernetes

上面Save & Test测试没问题之后,就可以返回Grafana主页面
点击左侧+号下面的Import,出现如下界面
在这里插入图片描述

可直接导入node_exporter.json监控模板,这个可以把node节点指标显示出来
node_exporter.json
链接:https://pan.baidu.com/s/1lK43XIWKuMYiQoWBAtJJ-Q?pwd=j01k
提取码:j01k

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

docker_rev1.json,显示容器资源指标的
链接:https://pan.baidu.com/s/1F_9ApBvKCV3lkHvxPLP-OQ?pwd=wkph
提取码:wkph

导入docker_rev1.json监控模板,步骤和上面导入node_exporter.json步骤一样,导入之后显示如下:
在这里插入图片描述

如果Grafana导入Prometheusz之后,发现仪表盘没有数据,如何排查?

打开grafana界面,找到仪表盘对应无数据的图标
在这里插入图片描述

Edit之后出现如下:

在这里插入图片描述

node_cpu_seconds_total 就是grafana上采集的cpu的时间,需要到prometheus ui界面看看采集的指标是否是node_cpu_seconds_total

在这里插入图片描述

如果在prometheus ui界面输入node_cpu_seconds_total没有数据,那就看看是不是prometheus采集的数据是node_cpu_seconds_totals,怎么看呢?

在这里插入图片描述

安装kube-state-metrics组件

kube-state-metrics是什么?

  • kube-state-metrics通过监听API Server生成有关资源对象的状态指标,比如Node、Pod,需要注意的是kube-state-metrics只是简单的提供一个metrics数据,并不会存储这些指标数据,所以我们可以使用Prometheus来抓取这些数据然后存储,主要关注的是业务相关的一些元数据,
  • 比如Pod副本状态等;调度了多少个replicas?现在可用的有几个?多少个Pod是running/stopped/terminated状态?Pod重启了多少次?我有多少job在运行中。

安装kube-state-metrics组件

创建sa,并对sa授权
kube-state-metrics-rbac.yaml文件上传到k8s的控制节点:
链接:https://pan.baidu.com/s/1fNAovsSfabcQMTpX4AknnQ?pwd=m6r0
提取码:m6r0

kubectl apply -f kube-state-metrics-rbac.yaml

安装kube-state-metrics组件
kube-state-metrics_1_9_0.tar.gz组件上传到k8s各个工作节点,手动解压:
链接:https://pan.baidu.com/s/1UufIAWnnQgP1vYSTvushSw?pwd=uunh
提取码:uunh

ctr -n=k8s.io images import kube-state-metrics_1_9_0.tar.gz

kube-state-metrics-deploy.yaml上传到k8smaster1节点
链接:https://pan.baidu.com/s/1GnMeja2VQUwHXj9MPsCHqQ?pwd=n0o9
提取码:n0o9

kubectl apply -f kube-state-metrics-deploy.yaml

查看kube-state-metrics是否部署成功

kubectl get pods -n kube-system -l app=kube-state-metrics

在这里插入图片描述

创建service
kube-state-metrics-svc.yaml文件上传到k8s的k8smaster1节点:
链接:https://pan.baidu.com/s/1DjZuLFDcH9mjRXY6CHJNfw?pwd=uo52
提取码:uo52

kubectl apply -f kube-state-metrics-svc.yaml

查看service是否创建成功

kubectl get svc -n kube-system | grep kube-state-metrics

在这里插入图片描述

在grafana web界面导入Kubernetes Cluster (Prometheus)-1577674936972.json和Kubernetes cluster monitoring (via Prometheus) (k8s 1.16)-1577691996738.json

导入Kubernetes Cluster (Prometheus)-1577674936972.json文件
链接:https://pan.baidu.com/s/1SpGM2hb0uuEsyJaYnhE_Rw?pwd=u1dz
提取码:u1dz
在这里插入图片描述

在grafana web界面导入Kubernetes cluster monitoring (via Prometheus) (k8s 1.16)-1577691996738.json
链接:https://pan.baidu.com/s/1v-zwCmwqC3iRix1M5s_GnA?pwd=2jhl
提取码:2jhl
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法/天梯赛训练】天梯赛模拟题集

L1-009 N个数求和 #include <iostream> #include <algorithm>using namespace std;typedef long long ll; const int N 105;typedef struct node {ll x, y; }node; node a[N];ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >>…

三伏天,艾灸这2处,既能祛寒湿、还能补阳气,效果是平时的好几倍~

这周开始&#xff0c;我们就进入了最炎热的三伏天&#xff01;今年的三伏整整40天&#xff0c;高温闷热&#xff0c;汗流浃背&#xff0c;想想都崩溃~ 最热最难熬的这段时间&#xff0c;也是天赐的良机&#xff01;此时阳气达到一年中的鼎盛&#xff0c;人体阳气也最为充沛&…

金航标kinghelm萨科微slkor总经理宋仕强(Huaqiangbei Songshiqiang )为大家介绍连接器时说

金航标kinghelm萨科微slkor总经理宋仕强&#xff08;Huaqiangbei Songshiqiang &#xff09;为大家介绍连接器时说&#xff0c;连接器通常可以分为以下几大类&#xff1a;1. 矩形连接器&#xff0c;这种连接器的外形通常呈矩形&#xff0c;具有较多的接触点&#xff0c;可传输多…

vue3中引入、封装和使用svg矢量图的实现示例

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是码喽的自我修养&#xff01;今天给大家分享vue3中引入和封装svg矢量图的实现示例&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到带大家&#xff0c;欢迎…

[python]pycharm设置清华源

国内镜像源有以下几个&#xff0c;因为都是国内的&#xff0c;基本速度差不了太多。 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣&…

【单片机毕业设计选题24071】-基于STM32的超声波驱鸟器设计

系统功能: 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用智能驱鸟系统请稍后”&#xff0c;两秒后进入正常显示界面。 如果红外避障模块检测到物体后OLED显示“Detected”&#xff0c;蜂鸣器报警&#xff0c;继电器吸合 超声波换能器发出超声波。如果红外避障模块未…

synchronized的实现原理和锁升级 面试重点

1.synchronized的实现原理 synchronized是Java 中的一个很重要的关键字&#xff0c;主要用来加锁&#xff0c;synchronized所添加的锁有以下几个特点。synchronized的使用方法比较简单&#xff0c;主要可以用来修饰方法和代码块。根据其锁定的对象不同&#xff0c;可以用来定义…

前端基础之JavaScript学习——运算符、分支/循环语句、数组

大家好我是来自CSDN的前端寄术区博主PleaSure乐事&#xff0c;今天我们继续有关JavaScript的学习&#xff0c;使用的编译器为vscode&#xff0c;浏览器为谷歌浏览器。大家使用webstorm等编译器或其他浏览器效果效果问题不大&#xff0c;都可以使用。 目录 运算符 赋值运算符 …

微服务设计原则——高性能:锁

文章目录 1.锁的问题2.无锁2.1 串行无锁2.2 无锁数据结构 3.减少锁竞争参考文献 1.锁的问题 高性能系统中使用锁&#xff0c;往往带来的坏处要大于好处。 并发编程中&#xff0c;锁带解决了安全问题&#xff0c;同时也带来了性能问题&#xff0c;因为锁让并发处理变成了串行操…

【node-RED 4.0.2】连接操作 Oracle 数据库实现 增 删 改 查【新版,使用新插件:@hylink/node-red-oracle】

总览 上节课&#xff0c;我们说到&#xff0c;在 node-red 上链接 oracle 数据库 我们使用的插件是 node-red-contrib-agur-connector。 其实后来我发现&#xff0c;有一个插件更简便&#xff0c;并且也更好用&#xff1a;hylink/node-red-oracle &#xff01;&#xff01;&am…

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述&#xff0c;在苹果电脑&#xff08;Mac&#xff09;上搭建一套Stable Diffusion本地服务&#xff0c;以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库&#xff0c;包括cmake,protobuf,rust,python3.10,git,wge…

第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025)

#先投稿&#xff0c;先送审# 第四届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2025&#xff09; 2025 4th International Conference on Cyber Security, Artificial Intelligence and Digital Economy 重要信息 会议官网&#xff1a;www.csaide.net 会…

企业用蚓链数字化营销思维做新赛道设计

​在当今数字化时代&#xff0c;企业面临着日益激烈的竞争和不断变化的市场环境。运用数字化营销思维进行新赛道设计已成为企业寻求突破和创新的关键策略。 数字化营销思维为企业提供了更精准的市场洞察能力。通过大数据分析和用户行为追踪&#xff0c;企业能够深入了解消费者的…

运动用什么骨传导耳机好?推荐这五款运动骨传导耳机!

在运动生涯&#xff0c;我见证了自我挑战与超越的每一个瞬间&#xff0c;而这一切都离不开那如影随形的运动骨传导耳机。一款出色的运动耳机&#xff0c;其重要性不言而喻——它不仅是提升运动效率的得力助手&#xff0c;更是开启多元化运动体验的金钥匙。近年来&#xff0c;运…

集群技术,一主一从的部署和原理方式

集群概述 所谓集群&#xff0c;就是将多台服务器集中在一起&#xff0c;同时处理用户对服务器的请求 比如&#xff0c;我们现在开启的这一台mysql服务器&#xff0c;可以同时处理1000个用户的请求&#xff0c;那么我们开启两个这样的服务器&#xff0c;就可以同时处理2000 数…

Unity3d开发google chrome的dinosaur游戏

游戏效果 游戏中&#xff1a; 游戏中止&#xff1a; 一、制作参考 如何制作游戏&#xff1f;【15分钟】教会你制作Unity小恐龙游戏&#xff01;新手15分钟内马上学会&#xff01;_ unity教学 _ 制作游戏 _ 游戏开发_哔哩哔哩_bilibili 二、图片资源 https://download.csdn.…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代&#xff0c;视频已成为我们记录生活、分享快乐的重要工具。然而&#xff0c;大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下&#xff0c;轻松减小视频文件大小&#xff1f;今天&#xff0c;就让我们一起探索苹果电脑上的几种高效视频压缩…

前端书籍翻页效果

目录 前端书籍翻页效果前言代码示例创建模板页面css样式编写js代码 结论 前端书籍翻页效果 前端实现翻书效果&#xff0c;附带vue源码 源码下载地址 前言 实际业务开发中&#xff0c;有时候会遇到需要在前端页面内实现翻书效果的需求&#xff0c;本篇文章就为大家介绍如何使…

STM32MP135裸机编程:唯一ID(UID)、设备标识号、设备版本

0 资料准备 1.STM32MP13xx参考手册1 唯一ID&#xff08;UID&#xff09;、设备标识号、设备版本 1.1 寄存器说明 &#xff08;1&#xff09;唯一ID 唯一ID可以用于生成USB序列号或者为其它应用所使用&#xff08;例如程序加密&#xff09;。 &#xff08;2&#xff09;设备…

stm32入门-----EXTI外部中断(上 ——理论篇)

目录 前言 一、中断系统 1.基本概念 2.执行过程 二、stm32中断 1.stm32中断类型 2.NVIC总管 3.NVIC的优先级分组 三、EXIT外部中断 1.基本概念 2.AFIO复用IO口 3.EXIT执行过程 前言 本期我们就开始进入到学习stm32的中断系统了&#xff0c;在此之前我们学习过51的知道中…