【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(上)

news2025/1/15 20:41:20

目录

一、配置 Alertmanager 发送报警到 qq 邮箱

1.1 设置 163 邮箱

1.2 创建 alertmanager 配置文件

1.3 创建 prometheus 告警规则配置文件

1.4 安装 prometheus 和 alertmanager

1.5 部署 alertmanager 的 service

1.6 浏览器访问 Prometheus 和 alertmanager

二、配置 alertmanager 发送报警到钉钉

1.1 创建钉钉机器人

2.2 设置 webhook

2.3 查看钉钉群

三、Prometheus 查询语言 PromQL 介绍

3.1 数据类型

3.2 瞬时向量选择器

3.3 区间向量选择器

3.4 偏移向量选择器

3.5 聚合操作符

3.6 函数


本篇文章所用到的资料文件下载地址:alertmanager报警发送资料-kubernetes文档类资源-CSDN下载

一、配置 Alertmanager 发送报警到 qq 邮箱

  • 报警:指 prometheus 将监测到的异常事件发送给 alertmanager
  • 通知:alertmanager 将报警信息发送到邮件、微信、钉钉等

1.1 设置 163 邮箱

根据提示步骤开启 POP3/SMTP/IMAP 服务,并自行保存授权码,下面需要用到授权码:

1.2 创建 alertmanager 配置文件

[root@k8s-master1 prometheus]# vim alertmanager-cm.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor-sa
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.163.com:25'           # 163 邮箱的 SMTP 服务器地址+端口
      smtp_from: '13620xxx@163.com'               # 这是指定从哪个邮箱发送报警,写你自己的 163 邮箱
      smtp_auth_username: '13620xxx@163.com'      # 这是发送邮箱的认证用户,即邮箱账号
      smtp_auth_password: 'TJULxxx'               # 这是发送邮箱的授权码而不是邮箱登录密码,上面生成的授权码
      smtp_require_tls: false
    route:                                        # 用于配置告警分发策略
      group_by: [alertname]                       # alertmanager 会根据 group_by 配置将 Alert 分组 
      group_wait: 10s                             # 分组告警等待时间。也就是告警产生后等待 10s,如果有同组告警一起发出
      group_interval: 10s                         # 上下两组发送告警的间隔时间
      repeat_interval: 10m                        # 重复发送告警的时间,减少相同邮件的发送频率,默认是 1h
      receiver: default-receiver                  # 定义谁来收告警
    receivers:
    - name: 'default-receiver'
      email_configs:
      - to: '8651xxx@qq.com'                      # 指定发送到哪个邮箱,我发送到我的 qq 邮箱,大家需要写自己的邮箱地址,不应该跟 smtp_from 的邮箱名字重复
        send_resolved: true

[root@k8s-master1 prometheus]# kubectl apply -f alertmanager-cm.yaml 

[root@k8s-master1 prometheus]# kubectl get configmaps -n monitor-sa alertmanager 
NAME           DATA   AGE
alertmanager   1      10s

Prometheus 一条告警的触发流程、等待时间如下:

  1. Prometheus Server 监控目标主机上暴露的 http 接口(这里假设接口 A),通过 Promethes配置的 'scrape_interval' 定义的时间间隔,定期采集目标主机上监控数据;
  2. 当接口 A 不可用的时候,Server 端会持续的尝试从接口中取数据,直到 "scrape_timeout" 时间后停止尝试,这时候把接口的状态变为 “DOWN”;
  3. Prometheus 同时根据配置的 "evaluation_interval" 的时间间隔,定期(默认1min)的对 Alert Rule 进行评估;当到达评估周期的时候,发现接口 A 为 DOWN,即 UP=0 为真,激活Alert,进入 “PENDING” 状态,并记录当前 active 的时间;
  4. 当下一个 alert rule 的评估周期到来的时候,发现 UP=0 继续为真,然后判断警报 Active 的时间是否已经超出 rule 里的 ‘for’ 持续时间,如果未超出,则进入下一个评估周期;如果时间超出,则 alert 的状态变为 “FIRING”;同时调用 Alertmanager 接口,发送相关报警数据;
  5. AlertManager 收到报警数据后,会将警报信息进行分组,然后根据 alertmanager 配置的“group_wait” 时间先进行等待。等 wait 时间过后再发送报警信息;
  6. 属于同一个 Alert Group 的警报,在等待的过程中可能进入新的 alert,如果之前的报警已经成功发出,那么间隔 “group_interval” 的时间间隔后再重新发送报警信息。比如配置的是邮件报警,那么同属一个 group 的报警信息会汇总在一个邮件里进行发送;
  7. 如果 Alert Group 里的警报一直没发生变化并且已经成功发送,等待 ‘repeat_interval’ 时间间隔之后再重复发送相同的报警邮件;如果之前的警报没有成功发送,则相当于触发第 6 条条件,则需要等待 group_interval 时间间隔后重复发送。

        最后至于警报信息具体发给谁,满足什么样的条件下指定警报接收人,设置不同报警发送频率,这里由 alertmanager 的 route 路由规则进行配置。

1.3 创建 prometheus 告警规则配置文件

        在 k8s 的控制节点生成一个 prometheus-alertmanager-cfg.yaml 文件,prometheus-alertmanager-cfg.yaml 文件(里面的内容很多)在前面的下载地址里,上传到 k8s 的 master1 节点:

# 手动修改 prometheus-alertmanager-cfg.yaml 文件下面内容:
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml 
······
    - job_name: 'kubernetes-etcd'
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/ca.crt
        cert_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/server.crt
        key_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/server.key
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.78.143:2379']    # 修改为 master 节点 ip
······

# 把上一篇文章讲解的 Prometheus 时创建的 configmap 删除
[root@k8s-master1 prometheus]# kubectl delete -f prometheus-cfg.yaml 

[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml 

1.4 安装 prometheus 和 alertmanager

需要把 alertmanager.tar.gz 镜像包上传的 k8s 的各个工作节点,手动解压:

[root@k8s-node1 ~]# docker load -i alertmanager.tar.gz 
[root@k8s-node2 ~]# docker load -i alertmanager.tar.gz 

[root@k8s-master1 prometheus]# vim prometheus-alertmanager-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitor-sa
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-node1
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.2.1
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/prometheus"
        args:
        - "--config.file=/etc/prometheus/prometheus.yml"
        - "--storage.tsdb.path=/prometheus"
        - "--storage.tsdb.retention=24h"
        - "--web.enable-lifecycle"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus
          name: prometheus-config
        - mountPath: /prometheus/
          name: prometheus-storage-volume
        - name: k8s-certs
          mountPath: /var/run/secrets/kubernetes.io/k8s-certs/etcd/
      - name: alertmanager
        image: prom/alertmanager:v0.14.0
        imagePullPolicy: IfNotPresent
        args:
        - "--config.file=/etc/alertmanager/alertmanager.yml"
        - "--log.level=debug"
        ports:
        - containerPort: 9093
          protocol: TCP
          name: alertmanager
        volumeMounts:
        - name: alertmanager-config
          mountPath: /etc/alertmanager
        - name: alertmanager-storage
          mountPath: /alertmanager
        - name: localtime
          mountPath: /etc/localtime
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
        - name: prometheus-storage-volume
          hostPath:
           path: /data
           type: Directory
        - name: k8s-certs
          secret:
           secretName: etcd-certs
        - name: alertmanager-config
          configMap:
            name: alertmanager
        - name: alertmanager-storage
          hostPath:
           path: /data/alertmanager
           type: DirectoryOrCreate
        - name: localtime
          hostPath:
           path: /usr/share/zoneinfo/Asia/Shanghai

注意:配置文件指定了 nodeName: k8s-node1,这个位置要写你自己环境的 k8s 的 node 节点名字。

# 生成一个 etcd-certs,这个在部署 prometheus 时需要
[root@k8s-master1 prometheus]# kubectl -n monitor-sa create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.key  --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/ca.crt

# 先删除上一篇文章创建的 Prometheus
[root@k8s-master1 prometheus]# kubectl delete -f prometheus-deploy.yaml 

[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml 

# 查看 prometheus 是否部署成功
[root@k8s-master1 prometheus]# kubectl get pods -n monitor-sa | grep prometheus
prometheus-server-bf4569646-tvk6k   2/2     Running   0             22s

1.5 部署 alertmanager 的 service

[root@k8s-master1 prometheus]# vim alertmanager-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: prometheus
    kubernetes.io/cluster-service: 'true'
  name: alertmanager
  namespace: monitor-sa
spec:
  ports:
  - name: alertmanager
    nodePort: 30066
    port: 9093
    protocol: TCP
    targetPort: 9093
  selector:
    app: prometheus
  sessionAffinity: None
  type: NodePort

[root@k8s-master1 prometheus]# kubectl apply -f alertmanager-svc.yaml 

# 查看 service 在物理机映射的端口
[root@k8s-master1 prometheus]# kubectl get svc -n monitor-sa 
NAME           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
alertmanager   NodePort   10.96.7.204      <none>        9093:30066/TCP   7s
prometheus     NodePort   10.108.228.243   <none>        9090:30812/TCP   41h

        上面可以看到 prometheus 的 service 在物理机映射的端口是 30812,alertmanager 的 service 在物理机映射的端口是 30066。

1.6 浏览器访问 Prometheus 和 alertmanager

  • 访问 Prometheus:http://192.168.78.143:30812

点击 status -> targets,可看到如下:

点击 Alerts,可看到如下:

kubernetes-etcd (1 active) 展开,可看到如下:

        FIRING 表示 prometheus 已经将告警发给 alertmanager,在 Alertmanager 中可以看到有一个 alert。 

  • 访问 alertmanager:http://192.168.78.143:30066

 这样在我的 qq 邮箱就可以收到报警了,如下:

二、配置 alertmanager 发送报警到钉钉

1.1 创建钉钉机器人

注意:钉钉机器人只能在 PC 端应用创建!

        PC 端钉钉中 -> 选择右上角 "+" 号 -> 发起群聊 -> 面对面进群 -> 在群设置里找到“智能群助手” -> 添加机器人 -> 选择“自定义” -> 添加 -> 自定义“机器人名字” ->   勾选“自定义关键词” -> 输入关键词:cluster1 -> 完成。

        保存好生成的 webhook,如果没保存的童鞋可以重新在智能群助手中找到刚刚创建的机器人,可以看到 webhook。

2.2 设置 webhook

在 k8s 的控制节点 master1 安装钉钉的 webhook 插件:

# 上传 prometheus-webhook-dingtalk-0.3.0.linux-amd64.tar.gz 文件
[root@k8s-master1 ~]# tar -zxvf prometheus-webhook-dingtalk-0.3.0.linux-amd64.tar.gz 
[root@k8s-master1 ~]# cd prometheus-webhook-dingtalk-0.3.0.linux-amd64/

# 启动钉钉报警插件
[root@k8s-master1 prometheus-webhook-dingtalk-0.3.0.linux-amd64]# nohup ./prometheus-webhook-dingtalk --web.listen-address="0.0.0.0:8060" --ding.profile="cluster1=https://oapi.dingtalk.com/robot/send?access_token=9f03aa13d7ec4274806c4f0e2398e9277712bf3a27d808ef37de5d01dd5e3d62" &

# 上述 cluster1 为创建机器人时的关键词;url 为 webhook。

# 对原来的 alertmanager-cm.yaml 文件做备份
[root@k8s-master1 prometheus]# cp alertmanager-cm.yaml alertmanager-cm.yaml.bak
[root@k8s-master1 prometheus]# cat > alertmanager-cm.yaml <<EOF
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor-sa
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.163.com:25'
      smtp_from: '13620xxx@163.com'
      smtp_auth_username: '13620xxx@163.com'
      smtp_auth_password: 'TJULUxxx'
      smtp_require_tls: false
    route:
      group_by: [alertname]
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 10m
      receiver: cluster1        # 创建机器人的关键词
    receivers:
    - name: cluster1            # 创建机器人的关键词
      webhook_configs:
      - url: 'http://192.168.78.143:8060/dingtalk/cluster1/send'    # 安装 webhook 插件的节点 ip
        send_resolved: true
EOF

[root@k8s-master1 prometheus]# kubectl apply -f alertmanager-cm.yaml 

[root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml 
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml 

2.3 查看钉钉群

三、Prometheus 查询语言 PromQL 介绍

        PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多。使用它可以对时序数据进行筛选和聚合。

3.1 数据类型

PromQL 表达式计算出来的值有以下几种类型:

  • 瞬时向量 (Instant vector):一组时序,每个时序只有一个采样值。
  • 区间向量 (Range vector):一组时序,每个时序包含一段时间内的多个采样值。
  • 标量数据 (Scalar):一个浮点数。
  • 字符串 (String):一个字符串,暂时未用。

3.2 瞬时向量选择器

        瞬时向量选择器用来选择一组时序在某个采样点的采样值。最简单的情况就是指定一个度量指标,选择出所有属于该度量指标的时序的当前采样值。比如下面的表达式:

apiserver_request_total

        可以通过在后面添加用大括号包围起来的一组标签键值对来对时序进行过滤。比如下面的表达式筛选出了 job 为 kubernetes-apiservers,并且 resource为 pod 的时序:

apiserver_request_total{job="kubernetes-apiserver",resource="pods"}

匹配标签值时可以是等于,也可以使用正则表达式。总共有下面几种匹配操作符:

  • = :完全相等
  • != :不相等
  • =~ :正则表达式匹配
  • !~ :正则表达式不匹配

下面的表达式筛选出了 container 是 kube-scheduler 或 kube-proxy 或 kube-apiserver 的时序数据

container_processes{container=~"kube-scheduler|kube-proxy|kube-apiserver"}

3.3 区间向量选择器

        区间向量选择器类似于瞬时向量选择器,不同的是它选择的是过去一段时间的采样值。可以通过在瞬时向量选择器后面添加包含在 [] 里的时长来得到区间向量选择器。

        比如下面的表达式选出了所有度量指标为 apiserver_request_total 且 resource 是 pod 的时序在过去 1 分钟的采样值:

apiserver_request_total{job="kubernetes-apiserver",resource="pods"}[1m]

时长的单位可以是下面几种之一:

  • s :seconds
  • m :minutes
  • h :hours
  • d :days
  • w :weeks
  • y :years

3.4 偏移向量选择器

        前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用 offset 来指定要偏移的量。

比如下面的表达式选择度量名称为 apiserver_request_total 的所有时序在 5 分钟前的采样值:

apiserver_request_total{job="kubernetes-apiserver",resource="pods"} offset 5m

下面的表达式选择 apiserver_request_total 度量指标在 1 周前的这个时间点过去 5 分钟的采样值:

apiserver_request_total{job="kubernetes-apiserver",resource="pods"} [5m] offset 1w

3.5 聚合操作符

PromQL 的聚合操作符用来将向量里的元素聚合得更少。总共有下面这些聚合操作符:

  • sum:求和
  • min:最小值
  • max:最大值
  • avg:平均值
  • stddev:标准差
  • stdvar:方差
  • count:元素个数
  • count_values:等于某值的元素个数
  • bottomk:最小的 k 个元素
  • topk:最大的 k 个元素
  • quantile:分位数

1、计算 k8s-master1 节点所有容器总计内存:

sum(container_memory_usage_bytes{instance=~"k8s-master1"})/1024/1024/1024

2、计算 k8s-master1 节点最近 1m 所有容器 cpu 使用率:

sum (rate (container_cpu_usage_seconds_total{instance=~"k8s-master1"}[1m])) / sum (machine_cpu_cores{ instance =~"k8s-master1"}) * 100

3、计算最近 1m 所有容器 cpu 使用率:

sum (rate (container_cpu_usage_seconds_total{id!="/"}[1m])) by (id)

3.6 函数

Prometheus 内置了一些函数来辅助计算,下面介绍一些典型的:

  • abs():绝对值
  • sqrt():平方根
  • exp():指数计算
  • ln():自然对数
  • ceil():向上取整
  • floor():向下取整
  • round():四舍五入取整
  • delta():计算区间向量里每一个时序第一个和最后一个的差值
  • sort():排序

上一篇文章:【Kubernetes 企业项目实战】02、基于 Prometheus 和 K8s 构建智能化监控告警系统(下)_Stars.Sky的博客-CSDN博客

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

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

相关文章

ELK日志(2)

elasticsearch群集状态颜色&#xff1a;灰色&#xff1a;未连接绿色&#xff1a;数据完整态黄色&#xff1a;副本不完整红色&#xff1a;数据分片不完整紫色&#xff1a;数据分片复制过程群集主机角色&#xff1a;主节点master&#xff1a;负责管理调度工作节点&#xff1a; 负…

从IPv6的普及看中国未来网络的发展

最近看了一篇《邬贺铨&#xff1a;IPv6或是未来主流网络》的文章,谈到了未来网络的发展问题。IPv6也许是未来主流网络的发展方向。那么什么是IPv6呢,不妨来看下关于他的另一篇文章《邬贺铨&#xff1a;IPv6是IPv6规模部署第三阶段重要抓手》。 他谈到&#xff0c;IPv6是下一代互…

单绞机张力开环控制(绞臂行星差速机构算法)

PLC的开环和闭环张力控制算法,可以参看下面的文章链接: PLC张力控制(开环闭环算法分析)_plc张力控制程序_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的…

动态内存管理(1)

TIPS 1. 2. malloc, free, calloc, realloc 这些的基本前提都是在内存堆区 内存堆区不能与内存栈区两者混淆乱套 动态内存管理存在的原因 1. 为什么要有动态内存管理&#xff1f;其实我们之前学过比如说对内存的管理&#xff0c;比方说我申请一块内存空间&#xff1a; 1.…

任意方向边界框——day64 读论文:基于自适应目标定位特征卷积神经网络的高分辨率遥感影像多面向目标检测

Multi-Oriented Object Detection in High-Resolution Remote Sensing Imagery Based on Convolutional Neural Networks with Adaptive Object Orientation Features 基于自适应目标定位特征卷积神经网络的高分辨率遥感影像多面向目标检测1. Introduction2. Materials and Met…

jQuery ajax中dataFilter的用法

参考资料 jquery的ajax的dataFilter参数的使用 ⏹用于处理 XMLHttpRequest 原始响应数据的函数 运行在success函数之前, 对Ajax请求返回的原始数据进行预处理 可以对返回的json数据中的null属性进行过滤可以对返回的json数据添加一些自定义的属性 如果不返回原始数据,返回其他…

零代码连接邮箱腾讯云企业网盘,附件管理超轻松

在日常工作中&#xff0c;想必大家每天都会收到各种各样的工作邮件&#xff0c;并且很多重要的文件材料也是通过邮件附件的形式来传输的&#xff0c;那么如何一站式管理这些文件&#xff0c;对于提高办公效率就至关重要了。关于邮件附件管理&#xff0c;相信大家也都碰到过这样…

全面了解文件上传漏洞, 通关upload-labs靶场

靶场简介 upload-labs是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列模拟文件上传漏洞的实验环境&#xff0c;用于帮助用户了解文件上传漏洞的原理和防御技术。 这个靶场包括了常见的文件上传漏洞类型&#xff0c;如文件名欺骗、文件类型欺骗、文件上传功能…

1582_C代码实现的快速、可移植MD5信息摘要算法

全部学习汇总&#xff1a; GreyZhang/c_units: A small piece of code which can be reuse anywhere, I call it a unit. This is a collection of unit in C language! Ok, yes, it would be my toolbox. (github.com) 工作之中&#xff0c;同事用到了MD5信息摘要算法&#x…

面试加分题--socket是否是并发安全的?

今天和大家聊一个有点儿东西的面试题&#xff1a;socket是否是并发安全的&#xff1f; 为了帮助大家理解&#xff0c;我们先假设一个场景。 就拿游戏架构来说&#xff0c;我们想象中的游戏架构是下面这样的。 想象中的游戏架构 也就是用户客户端直接连接游戏核心逻辑服务器&…

解决⾃动驾驶中计算机视觉的⽬标检测问题

来源&#xff1a;投稿 作者&#xff1a;cairuyi01 编辑&#xff1a;学姐 最近读了《Object detection with location-aware deformable convolution and backward attention filtering》&#xff0c;这是⼀篇2019年刊登在CVPR上的CV论⽂。与解决普适性的CV任务不同&#xff0c…

SpringMVC如何优化Ajax技术

SpringMVC如何优化Ajax技术&#xff1f; AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 Ajax 不是一种新的编程语言&#xff0c;而是一种用于创…

EIoU和Focal-EIoU Loss

1、论文 论文题目&#xff1a;《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》 2、引言 CIoU Loss虽然考虑了边界框回归的重叠面积、中心点距离、高宽比。但是其公式中的v反映的是高宽的差异&#xff0c;而不是高宽分别与其置信度的真实差异。因此&…

蚂蚁智能内容合规审核产品探秘

随着互联网服务的不断深化&#xff0c;产品营销的形式从传统文本、长图文&#xff0c;增加到短视频、直播等新媒介形态&#xff0c;展现形式愈加丰富的同时&#xff0c;也为营销宣传内容合规审核带来了诸多难题。如何解决与日俱增的审核量与合规审核人员有限之间的矛盾&#xf…

【阶段三】Python机器学习31篇:机器学习项目实战:基于皮尔逊相关系数搭建电影智能推荐系统

本篇的思维导图: 项目背景 在当今这个大数据时代,智能推荐系统的应用越来越广泛,网上购物、在线观影、新闻推送的背后都有智能推荐系统算法的支持。人们经常会在视频平台上观看电影,有时明确想要观看某部电影,有时则仅仅是随机搜寻。如果视频平台能利用基于物品的…

DDOS攻击

把我掘金的文章同步一份过来 最近网上爆火的一款游戏 Goose Goose Duck (鹅鸭杀) 游戏官方在近日发布了一则公告&#xff0c;宣布由于服务器屡次遭受黑客攻击&#xff0c;该游戏服务器将暂时关服三天进行维护 遭到了DDOS攻击&#xff0c;背后原因&#xff0c;我们不做讨论&…

代码随想录算法训练营第十七天二叉树 java : . 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

文章目录前言Leetcode 110.平衡二叉树题目讲解思路Leetcode 257. 二叉树的所有路径题目讲解这道题涉及到了回溯Leetcode 404.左叶子之和题目讲解总结前言 选择一个简单的理念&#xff0c;矢志不渝地去执行&#xff08;Take one simple idea and take it seriously 递归三部曲…

【Nginx】Nginx搭建高可用集群

1. KeepalivedNginx 高可用集群&#xff08;主从模式&#xff09;2. 配置高可用的准备工作3. 在两台服务器上安装keepalived4. 完成高可用配置(主从配置)5. 最终测试 1. KeepalivedNginx 高可用集群&#xff08;主从模式&#xff09; 2. 配置高可用的准备工作 需要两台服务器…

Revit如何将明细表导出为DWG格式【批量导出图纸】

一、Revit中怎样将明细表导出到DWG文件中 有时需要将Revit中生成的各种明细表导入到CAD中使用&#xff0c;但是在明细表视图中并没有导出成DWG格式的选项如图1所示&#xff0c;应该如何操作才能导出成CAD可识别文件呢&#xff1f; 方法一&#xff1a;将明细表通过导出为报表选项…

Java 核心技术卷 I 基础知识笔记(一)

Java 的基本程序设计结构 2.1 一个简单的 Java 应用程序 一个最简单的 Java 应用程序&#xff0c;它只发送一条消息到控制台窗口中&#xff1a;/*** This is the first sample program in Core Java Chapter 3* version 1.01 1997-03-22* author Gary Cornell*/ public class…