【Kubernetes 企业项目实战】02、基于 Prometheus 和 K8s 构建智能化监控告警系统(上)

news2024/11/29 5:33:01

目录

一、Prometheus 基本介绍

二、Prometheus 特点

样本

三、Prometheus 组件介绍

四、Prometheus 工作流程

五、Prometheus 和 zabbix 对比分析

六、Prometheus 的几种部署模式 

6.1 基本高可用模式

6.2 基本高可用 + 远程存储

6.3 基本 HA + 远程存储 + 联邦集群方案

七、Prometheus 的四种数据类型

7.1 Counter

7.2 Gauge

7.3 histogram

7.4 summary

八、Prometheus 对 kubernetes 的监控


 

  • 项目环境:

        Prometheus+grafana+alertmanager 安装在 k8s 集群。

  • k8s 环境:
k8s 集群角色ip主机名配置
控制节点192.168.78.143k8s-master12vCPU / 2Gi 内存
工作节点192.168.78.144k8s-node12vCPU / 2Gi 内存
  • 项目目标:

        介绍 k8s 集群中部署 prometheus、grafana、alertmanager,并且配置 prometheus 的动态、静态服务发现,实现对容器、物理节点、service、pod 等资源指标监控,并在 Grafana 的 web 界面展示 prometheus 的监控指标,然后通过配置自定义告警规则,通过 alertmanager 实现qq、钉钉、微信报警。Promql 语法、prometheus 数据类型。

一、Prometheus 基本介绍

        Prometheus(普罗米修斯) 是一个开源的系统监控和报警系统,现在已经加入到 CNCF 基金会,成为继 k8s之后第二个在 CNCF 托管的项目,在 kubernetes 容器管理系统中,通常会搭配 prometheus 进行监控,同时也支持多种 exporter 采集数据,还支持 pushgateway 进行数据上报,Prometheus 性能足够支撑上万台规模的集群。

  • Prometheus 监控组件对应的 exporter 部署地址:Exporters and integrations | Prometheus 
  • Prometheus 配置:Configuration | Prometheus

二、Prometheus 特点

  1. 多维度数据模型:每一个时间序列数据都由 metric 度量指标名称和它的标签 labels 键值对集合唯一确定。这个metric 度量指标名称指定监控目标系统的测量特征(如:http_requests_total- 接收 http 请求的总计数)。labels 开启了 Prometheus 的多维数据模型:对于相同的度量名称,通过不同标签列表的结合, 会形成特定的度量维度实例。(例如:所有包含度量名称为 /api/tracks 的 http 请求,打上method=POST 的标签,则形成了具体的 http 请求)。这个查询语言在这些度量和标签列表的基础上进行过滤和聚合。改变任何度量上的任何标签值,则会形成新的时间序列图。
  2. 灵活的查询语言(PromQL):可以对采集的 metrics 指标进行加法、乘法、连接等操作。
  3. 可以直接在本地部署,不依赖其他分布式存储。
  4. 通过基于 HTTP 的 pull 方式采集时序数据。
  5. 可以通过中间网关 pushgateway 的方式把时间序列数据推送到 prometheus server 端。
  6. 可通过服务发现或者静态配置来发现目标服务对象(targets)。

  7. 有多种可视化图像界面,如 Grafana 等。

  8. 高效的存储,每个采样数据占 3.5 bytes左右,300万 的时间序列,30s 间隔,保留 60 天,消耗磁盘大概 200G。

  9. 做高可用,可以对数据做异地备份,联邦集群,部署多套 prometheus,pushgateway 上报数据。

样本

在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:

  1. 指标(metric):指标名称和描述当前样本特征的 labelsets;

  2. 时间戳(timestamp):一个精确到毫秒的时间戳;
  3. 样本值(value): 一个 folat64 的浮点型数据表示当前样本的值。

通过如下表达方式表示指定指标名称和指定标签集合的时间序列:

<metric name>{<label name>=<label value>, ...}

        例如,指标名称为 api_http_requests_total,标签为 method="POST" 和handler="/messages" 的时间序列可以表示为:

        api_http_requests_total{method="POST", handler="/messages"}

三、Prometheus 组件介绍

  1. Prometheus Server:用于收集和存储时间序列数据。

  2. Client Library:客户端库,检测应用程序代码,当 Prometheus 抓取实例的 HTTP 端点时,客户端库会将所有跟踪的 metrics 指标的当前状态发送到 prometheus server 端。
  3. Exporters:prometheus 支持多种 exporter,通过 exporter 可以采集 metrics 数据,然后发送到 prometheus server 端,所有向 promtheus server 提供监控数据的程序都可以被称为exporter。
  4. Alertmanager:从 Prometheus server 端接收到 alerts 后,会进行去重分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件、微信、钉钉、slack 等。
  5. Grafana:监控仪表盘,可视化监控数据。
  6. pushgateway:各个目标主机可上报数据到 pushgateway,然后 prometheus server 统一从pushgateway 拉取数据。

        从上图可发现,Prometheus 整个生态圈组成主要包括 prometheus、server、Exporter、pushgateway、alertmanager、grafana、Web ui 界面;Prometheus server 由三个部分组成:Retrieval、Storage,PromQL。

  1. Retrieval 负责在活跃的 target 主机上抓取监控指标数据;

  2. Storage 存储主要是把采集到的数据存储到磁盘中;
  3. PromQL 是 Prometheus 提供的查询语言模块。

四、Prometheus 工作流程

  1. Prometheus server 可定期从活跃的(up)目标主机上(target)拉取监控指标数据,目标主机的监控数据可通过配置静态 job 或者服务发现的方式被 prometheus server 采集到,这种方式默认的 pull 方式拉取指标;也可通过 pushgateway 把采集的数据上报到 prometheus server 中;还可通过一些组件自带的 exporter 采集相应组件的数据;

  2. Prometheus server 把采集到的监控指标数据保存到本地磁盘或者数据库;
  3. Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的报警发送到 alertmanager;
  4. Alertmanager 通过配置报警接收方,发送报警到邮件,微信或者钉钉等;
  5. Prometheus 自带的 web ui 界面提供 PromQL 查询语言,可查询监控数据;
  6. Grafana 可接入 prometheus 数据源,把监控数据以图形化形式展示出。

五、Prometheus 和 zabbix 对比分析

六、Prometheus 的几种部署模式 

6.1 基本高可用模式

        基本的 HA 模式只能确保 Promthues 服务的可用性问题,但是不解决 Prometheus Server 之间的数据一致性问题以及持久化问题(数据丢失后无法恢复),也无法进行动态的扩展。因此这种部署方式适合监控规模不大,Promthues Server 也不会频繁发生迁移的情况,并且只需要保存短周期监控数据的场景。

6.2 基本高可用 + 远程存储

        在解决了 Promthues 服务可用性的基础上,同时确保了数据的持久化,当 Promthues Server 发生宕机或者数据丢失的情况下,可以快速的恢复。同时 Promthues Server 可能很好的进行迁移。因此,该方案适用于用户监控规模不大,但是希望能够将监控数据持久化,同时能够确保Promthues Server 的可迁移性的场景。 

6.3 基本 HA + 远程存储 + 联邦集群方案

        Promthues 的性能瓶颈主要在于大量的采集任务,因此用户需要利用 Prometheus 联邦集群的特性,将不同类型的采集任务划分到不同的 Promthues 子服务中,从而实现功能分区。例如一个 Promthues Server 负责采集基础设施相关的监控指标,另外一个 Prometheus Server 负责采集应用监控指标,再有上层 Prometheus Server 实现对数据的汇聚。 

七、Prometheus 的四种数据类型

7.1 Counter

Counter 是计数器类型:

  • Counter 用于累计值,例如记录请求次数、任务完成数、错误发生次数。
  • 一直增加,不会减少。
  • 重启进程后,会被重置。

例如:

http_response_total{method="GET",endpoint="/api/tracks"}  100

http_response_total{method="GET",endpoint="/api/tracks"}  160

        Counter 类型数据可以让用户方便的了解事件产生的速率的变化,在 PromQL 内置的相关操作函数可以提供相应的分析,比如以 HTTP 应用请求量来进行说明:

  • 通过 rate() 函数获取 HTTP 请求量的增长率

        rate(http_requests_total[5m])

  • 查询当前系统中,访问量前 10 的 HTTP 地址

        topk(10, http_requests_total)

7.2 Gauge

Gauge 是测量器类型:

  • Gauge 是常规数值,例如温度变化、内存使用变化。
  • 可变大,可变小。
  • 重启进程后,会被重置。

例如:

memory_usage_bytes{host="master-01"}   100

memory_usage_bytes{host="master-01"}   30

memory_usage_bytes{host="master-01"}   50

memory_usage_bytes{host="master-01"}   80

        对于 Gauge 类型的监控指标,通过 PromQL 内置函数 delta() 可以获取样本在一段时间内的变化情况。例如,计算 CPU 温度在两小时内的差异:

        dalta(cpu_temp_celsius{host="zeus"}[2h])

        你还可以通过 PromQL 内置函数 predict_linear() 基于简单线性回归的方式,对样本数据的变化趋势做出预测。例如,基于 2 小时的样本数据,来预测主机可用磁盘空间在 4 个小时之后的剩余情况:

        predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

7.3 histogram

histogram 是柱状图,在 Prometheus 系统的查询语言中,有三种作用:

  1. 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中. 后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
  2. 对每个采样点值累计和 (sum)。
  3. 对采样点的次数累计和 (count)。

度量指标名称:[basename]_,上面三类的作用度量指标名称:

  • [basename]_bucket{le="上边界"}, 这个值为小于等于上边界的所有采样点数量
  • [basename]_sum
  • [basename]_count

小结:如果定义一个度量类型为 Histogram,则 Prometheus 会自动生成三个对应的指标。

为什需要用 histogram 柱状图?

        在大多数情况下人们都倾向于使用某些量化指标的平均值,例如 CPU 的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统 API 调用的平均响应时间为例:如果大多数 API 请求都维持在 100ms 的响应时间范围内,而个别请求的响应时间需要 5s,那么就会导致某些 WEB 页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。

        为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 0~10ms 之间的请求数有多少,而 10~20ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 和 Summary 都是为了能够解决这样问题的存在,通过 Histogram 和 Summary 类型的监控指标,我们可以快速了解监控样本的分布情况。

Histogram 类型的样本会提供三种指标(假设指标名称为 <basename>):

        样本的值分布在 bucket 中的数量,命名为 <basename>_bucket{le="<上边界>"}。解释的更通俗易懂一点,这个值表示指标值小于等于上边界的所有样本数量。

1、在总共 2 次请求当中,http 请求响应时间 <=0.005 秒的请求次数为 0

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0

2、在总共 2 次请求当中,http 请求响应时间 <=0.01 秒的请求次数为 0

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0

 3、在总共 2 次请求当中,http 请求响应时间 <=0.025 秒的请求次数为 0

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.05",} 0.0

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.075",} 0.0

4、在总共 2 次请求当中,http 请求响应时间 <=10 秒的请求次数为 2

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="10.0",} 2.0

        io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="+Inf",} 2.0

所有样本值的大小总和,命名为 <basename>_sum。

注意:

        bucket 可以理解为是对数据指标值域的一个划分,划分的依据应该基于数据值的分布。注意后面的采样点是包含前面的采样点的,假设 xxx_bucket{...,le="0.01"} 的值为 10,而 xxx_bucket{...,le="0.05"} 的值为 30,那么意味着这 30 个采样点中,有 10 个是小于 0.01s 的,其余 20 个采样点的响应时间是介于 0.01s 和 0.05s 之间的。

        可以通过 histogram_quantile() 函数
来计算 Histogram 类型样本的分位数。分位数可能不太好理解,你可以理解为分割数据的点。我举个例子,假设样本的 9 分位数(quantile=0.9)的值为 x,即表示小于 x 的采样值的数量占总体采样值的 90%。Histogram 还可以用来计算应用性能指标值(Apdex score
)。

7.4 summary

        与 Histogram 类型类似,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。它也有三种作用:

  1. 对于每个采样点进行统计,并形成分位图。(如:正态分布一样,统计低于 60 分不及格的同学比例,统计低于 80分 的同学比例,统计低于 95 分的同学比例);
  2. 统计班上所有同学的总成绩 (sum);
  3. 统计班上同学的考试总人数 (count)。

带有度量指标的 [basename] 的 summary 在抓取时间序列数据有如下命名:

  • 观察时间的 φ-quantiles (0 ≤ φ ≤ 1),显示为 [basename]{分位数="[φ]"};
  • [basename]_sum,是指所有观察值的总和;
  • [basename]_count,是指已观察到的事件计数值。

样本值的分位数分布情况,命名为 <basename>{quantile="<φ>"}

1、含义:http 请求中有 50% 的请求响应时间是 3.052404983s

        io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.5",} 3.052404983

2、含义:http 请求中有 90% 的请求响应时间是 8.003261666s

        io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.9",} 8.003261666

所有样本值的大小总和,命名为 <basename>_sum

1、含义:http 请求的总响应时间为 51.029495508s

        io_namespace_http_requests_latency_seconds_summary_sum{path="/",method="GET",code="200",} 51.029495508

样本总数,命名为 <basename>_count

1、含义:当前一共发生了 12 次 http 请求

        io_namespace_http_requests_latency_seconds_summary_count{path="/",method="GET",code="200",} 12.0

现在可以总结一下 Histogram 与 Summary 的异同:

它们都包含了 <basename>_sum 和 <basename>_count 指标;

Histogram 需要通过 <basename>_bucket 来计算分位数,而 Summary 则直接存储了分位数的值。

prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463

prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.9"} 0.014458005

prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.99"} 0.017316173

prometheus_tsdb_wal_fsync_duration_seconds_sum 2.888716127000002

prometheus_tsdb_wal_fsync_duration_seconds_count 216

        从上面的样本中可以得知当前 Promtheus Server 进行 wal_fsync 操作的总次数为 216 次,耗时 2.888716127000002s。其中中位数(quantile=0.5)的耗时为 0.012352463,9 分位数(quantile=0.9)的耗时为 0.014458005s。

八、Prometheus 对 kubernetes 的监控

对于 Kubernetes 而言,我们可以把当中所有的资源分为几类:

  1. 基础设施层(Node):集群节点,为整个集群和应用提供运行时资源;
  2. 容器基础设施(Container):为应用提供运行时环境;
  3. 用户应用(Pod):Pod 中会包含一组容器,它们一起工作,并且对外提供一个(或者一组)功能;
  4. 内部服务负载均衡(Service):在集群内,通过 Service 在集群暴露应用功能,集群内应用和应用之间访问时提供内部的负载均衡;
  5. 外部访问入口(Ingress):通过 Ingress 提供集群外的访问入口,从而可以使外部客户端能够访问到部署在 Kubernetes 集群内的服务

因此,如果要构建一个完整的监控体系,我们应该考虑,以下 5 个方面:

  1. 集群节点状态监控:从集群中各节点的 kubelet 服务获取节点的基本运行状态;
  2. 集群节点资源用量监控:通过 Daemonset 的形式在集群中各个节点部署 Node Exporter 采集节点的资源使用情况;
  3. 节点中运行的容器监控:通过各个节点中 kubelet 内置的 cAdvisor 中获取个节点中所有容器的运行状态和资源使用情况;
  4. 如果在集群中部署的应用程序本身内置了对 Prometheus 的监控支持,那么我们还应该找到相应的 Pod 实例,并从该 Pod 实例中获取其内部运行状态的监控指标;
  5. 对 k8s 本身的组件做监控:apiserver、scheduler、controller-manager、kubelet、kube-proxy等。

上一篇文章:

【Kubernetes 企业项目实战】01、使用 kubeadm 安装 K8s-v1.23 高可用集群_Stars.Sky的博客-CSDN博客

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

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

相关文章

Word文档内容如何添加双删除线

我们有时需要在Word里面添加双删除线&#xff0c;那么怎么添加呢&#xff1f;看看小编是怎么操作的吧。 首先&#xff0c;运行speedoffice并打开Word文件&#xff0c;选中需要添加双删除线的内容&#xff1b; 然后&#xff0c;点击鼠标右键&#xff0c;在右键菜单中选择“高级…

如何搭建云进销存-采购管理系统?

1、简介 1.1、案例简介 本文将介绍&#xff0c;如何搭建云进销存-采购管理。 1.2、应用场景 云进销存-采购管理应用支持多种商品特性管理&#xff0c;灵活适配不同主流行业商品管理要求&#xff0c;并可通过报表追溯查询&#xff0c;实现差异化的品类管理及分析。 2、设置…

【Linux】-- 进程终止进程等待

目录 深入理解fork 进程终止 进程常见退出场景 退出码 总结 进程等待 进程等待必要性 wait与waitpid 阻塞等待 非阻塞等待 总结 深入理解fork 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为…

Rhce第三次作业

1. 基于同一IP的不同端口访问不同的网站(可以通过域名去访问)ipport1 -> 对应一个域名ipport2 -> 对应一个域名使用域名1我应该访问到 ipport1对应的内容使用域名2我应该访问到 ipport2对应的内容/etc/hosts文件下写入ip和域名&#xff0c;进行域名解析写入192.168.137.1…

vue3学习笔记之TransitionTransitionGroup

文章目录Transition&TransitionGroup动画组件1. Transition1.1 Transition API1.2 基于CSS的过渡效果自定义过渡class Animate动画库同时使用 transition 和 animation深层级过渡与显式过渡时长duration&#xff08;总持续时间&#xff09;1.3 JavaScript 钩子 GreenSock…

FPGA知识汇集-GPGPU与FPGA

虽然FPGA的功能很强大&#xff0c;但是并非所有的设计都会使用到这样的芯片。很多系统架构师在开始的时候会斟酌到底是使用FPGA还是其他的代替方案&#xff0c;例如GPGPU&#xff08;通用的图形处理单元&#xff09;。 由于GPGPU特有的架构和处理能力&#xff0c;在很多现代的设…

SpringBoot+VUE前后端分离项目学习笔记 - 【20 权限菜单 上】

数据库 新建sys_role角色表 与sys_menu菜单表 CREATE TABLE sys_role (id int NOT NULL AUTO_INCREMENT COMMENT id,name varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 名称,description varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 描述…

【C++】list模拟实现

看源码观察结构 由源码可以得知,list的底层是带头双向循环链表 — 结点类模拟实现 list实际上是一个带头双向循环链表,要实现list,则首先需要实现一个结点类,而一个结点需要存储的信息为:数据、前驱指针、后继指针 而对于该结点类的成员函数来说,我们只需实现一个构造函数即…

Linux磁盘根目录扩容

Linux磁盘根目录扩容 1.输入命令:df -hl 红色框标记的呢就是服务器的主目录&#xff0c;我们能看到总容量17G &#xff0c;已使用2.1G 可用15G 我们要扩张磁盘空间的就是挂载点为:/ (的这个) 2.查询磁盘分区 命令&#xff1a;fdisk -l 我们找到/dev/sdb 这个磁盘名称就是…

Linux常用命令——nethogs命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) nethogs 终端下的网络流量监控工具 补充说明 有很多适用于Linux系统的开源网络监视工具。比如说&#xff0c;你可以用命令iftop来检查带宽使用情况。netstat用来查看接口统计报告&#xff0c;还有top监控系统当…

CMake快速入门

介绍 之前讲的Makefile的配置跟你当前的系统非常强的相关&#xff0c;例如在Linux或苹果下配置完Makefile&#xff0c;放到Windows下就会有问题&#xff0c;因为编译器会不同、路径会不同等。 如果要做跨平台的软件&#xff0c;要给不同的操作系统&#xff0c;不同的编译环境…

靶机测试Connect-the-dots笔记

靶机描述DescriptionBack to the TopLevel: Beginner-IntermediateUser flag: user.txtRoot flag: root.txtDescription: The machine is VirtualBox compatible but can be used in VMWare as well (not tested but it should work). The DHCP will assign an IP automaticall…

一款兼容双系统、为代码而生的机械键盘--Keychron K3

&#x1f525;前言 从去年的9月份记得就有小伙伴发私信问我有没有值得推荐的键盘&#xff0c;前段时间又有几个小伙伴在发私信询问。于是我写下这篇文章去给大家推荐一款十分好用的矮轴机械键盘 > keychron K3蓝牙无线矮轴超薄机械键盘,从而让大家更好的去敲代码&#xff0c…

【PWA学习】4. 使用 Push API 实现消息推送

引言 在接下来的内容里&#xff0c;我们会探究 PWA 中的另一个重要功能——消息推送与提醒(Push & Notification)。这个能力让我们可以从服务端向用户推送各类消息并引导用户触发相应交互 Web Push 效果Push API 和 Notification API 其实是两个独立的技术&#xff0c;完全…

很好用的URL工具类

&#x1f4e2; &#x1f4e2; &#x1f4e2; &#x1f4e3; &#x1f4e3; &#x1f4e3;哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步 &#x1f91d; &#x1f91d;一位上进心十足的【Java ToB端…

【C++】deque双端队列

目录deque的原理介绍deque的优点和缺陷deque的原理介绍 1.deque(双端队列)&#xff1a;是一种双开口的“连续”空间的数据结构&#xff0c;双开口的含义是&#xff1a;在头尾两端都可以进行插入和删除操作&#xff0c;且时间复杂度为O(1)。 需要注意的是deque并不是真正连续的…

制作一个微信小程序步骤_分享个人微信小程序开发步骤

微信小程序的功能不断提高&#xff0c;以及用户对小程序的使用的增加&#xff0c;使得新一批的流量融入小程序中&#xff0c;越开越多的企业开始开发小程序&#xff0c;想要从中分一碗羹&#xff0c;今天内容就从如何制作一个微信小程序说起&#xff0c;希望对你有帮助。微信小…

Vue鼠标移入移出事件(冒泡问题)

一、定义1、mouseenter&#xff1a;在鼠标光标从元素外部首次移动到元素范围之内时触发&#xff0c;这个事件不冒泡。2、mouseleave&#xff1a;在位于元素上方的鼠标光标移动到元素范围之外时触发&#xff0c;这个事件不冒泡。3、mouseover&#xff1a;在鼠标指针位于一个元素…

Flink学习31:Table API SQL之注册表

table API tableAPI & flink SQL flink SQL是最上层的封装&#xff0c;封装了流处理的DataStream API 和 批处理的DataSet API。 但是DataStream API 、DataSet API、table API、flink SQL 这几层并没有分到不同层中&#xff0c;所以应用程序可以同时使用这几层。 Table A…

合合信息——用智能文字识别技术赋能古彝文原籍数字化

文章目录1. 背景介绍&#xff1a;古彝文是什么&#xff1f;为什么要保护它&#xff1f;如何保护它&#xff1f;2. 传统方法保护古彝文&#xff1a;原籍难获、翻译困难2.1. 古彝文原籍的破损与古法保存2.2 古彝文原籍的保护与翻译2.2.1 获取古彝文原籍2.2.2 修复古彝文原籍2.2.3…