Nightingale 夜莺监控系统 - 部署篇(1)

news2024/9/22 13:44:09

Nightingale

Author:rab

官方文档:https://flashcat.cloud/docs


目录

    • 一、概述
    • 二、架构
      • 2.1 中心机房架构
      • 2.2 边缘下沉式混杂架构
    • 三、环境
    • 四、部署
      • 4.1 中心机房架构部署
        • 4.1.1 MySQL
        • 4.1.2 Redis
        • 4.1.3 Prometheus
        • 4.1.4 n9e
        • 4.1.5 Categraf
        • 4.1.6 验证
        • 4.1.7 配置数据源
      • 4.2 边缘下沉式混杂部署
        • 4.2.1 架构分析
        • 4.2.2 实验环境
        • 4.2.3 Prometheus
        • 4.2.4 n9e-edge
        • 4.2.5 Categraf
        • 4.2.6 验证
    • 总结


一、概述

以下为夜莺官方解释。

夜莺监控是一款开源云原生观测分析工具,采用 All-in-One 的设计理念,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。夜莺于 2020 年 3 月 20 日,在 github 上发布 v1 版本,已累计迭代 100 多个版本。

夜莺最初由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。夜莺的核心研发团队,也是 Open-Falcon 项目原核心研发人员。

二、架构

2.1 中心机房架构

image-20240108205038365

首先上图中间的飞鸟代表夜莺的核心进程 n9e (下文以 n9e 代替),它的集群方式非常简单只需部署多节点即可实现。

对于 n9e 来说,它本身依赖的存储有两个

  • Mysql : 存放配置类别信息,如用户,监控大盘,告警规则等
  • Redis : 存放访问令牌(JWT Token),心跳信息,如机器列表中 CPU、内存、时间偏移、核数、操作系统、CPU 架构等。

从 v6 版本开始,夜莺尝试转型为统一可观测性平台,n9e 不再仅支持接入时序数据源(Prometheus、Victoriametrics、M3DB、Thanos),也可以接入日志类数据源(Elasticsearch,Loki【预】),链路追踪数据源(Jaeger)。

这种中心架构还有一种就是:将 Prometheus、Thanos、VictoriaMetrics、M3DB、Mimir 等某个时序库作为夜莺的数据源,即只使用夜莺的告警管理功能。

image-20240108231154005

但是本次我们并不使用时序数据库“作为数据源”的这种方式,而是采用夜莺接收数据并存储到时序数据库的方式!

当然了,作为后端时序数据存储的 prometheus 也是可以在该架构中用作数据源,这样的话,n9e 不仅能展示数据,也能读取 prometheus 数据进行告警。

2.2 边缘下沉式混杂架构

image-20240108205100257

从 v6.0.0.ga.9 开始,合并了 n9e-alert、n9e-pushgw 模块为 n9e-edge,应对边缘机房的场景。n9e-edge 不依赖 mysql、redis,只依赖中心端的 n9e,所以 edge.toml 配置文件里,需要配置中心端 n9e 的地址。

三、环境

1、主机

OSVersionComment
Rocky Linux8.5/4.18.0-

2、服务

ServiceVersionComment
n9e6.7.2夜莺 - 服务端(数据展示)
Categraf0.3.45夜莺 - 客户端(数据采集)
MySQL5.7.36DB 存储
Redis6.2.6DB 缓存
Prometheus2.37.0时序数据库

时序数据存储选型:官方建议 VictoriaMetrics,但得根据你的实际业务场景来决定,如果你已经有 Prometheus 服务了,那也可以继续使用 Prometheus 直接作为数据源,如果没有,则可选择 VictoriaMetrics 作为时序库。

3、服务部署方式

DB 我采用 Docker 部署(当然你也可以采用其他方式部署),其他采用二进制部署!

四、部署

4.1 中心机房架构部署

4.1.1 MySQL

MySQL 用于存储用户、监控大盘、告警规则等。

# 部署过程略,本次通过shell脚本化部署

image-20240108210220829

4.1.2 Redis

存放访问令牌(JWT Token),心跳信息,如机器列表中CPU、内存、时间偏移、核数、操作系统、CPU架构等。

# 部署过程略,本次通过shell脚本化部署

image-20240108210220829

4.1.3 Prometheus

作为时序库接收 remote write 协议的数据,即夜莺收到时序数据之后,会将时序数据写入 Prometheus 中。夜莺也可以同时将此时的时序库用作 n9e 的数据源。

1、二进制包下载

二进制包下载:https://prometheus.io/download/

image-20240109090747109

2、解药安装包

tar xf prometheus-2.45.2.linux-amd64.tar.gz -C /data/

3、配置 Systemd 管理

注意:启动 Prometheus 时需要在启动参数里添加 --enable-feature=remote-write-receiver ,否则夜莺转发数据的时候会报 404,因为没有这个参数,Prometheus 就不会开启 /api/v1/write 接口的处理监听。

cat <<EOF >/etc/systemd/system/prometheus.service
[Unit]
Description="prometheus"
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple

ExecStart=/data/prometheus-2.45.2.linux-amd64/prometheus  --config.file=/data/prometheus-2.45.2.linux-amd64/prometheus.yml --storage.tsdb.path=/data/prometheus-2.45.2.linux-amd64/data --web.enable-lifecycle --enable-feature=remote-write-receiver --query.lookback-delta=2m 

Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=prometheus


[Install]
WantedBy=multi-user.target
EOF

4、启动

systemctl daemon-reload
systemctl enable prometheus
systemctl restart prometheus
systemctl status prometheus

image-20240109170418430

5、访问验证

http://yourIP:9090/

image-20240108212205194

4.1.4 n9e

生产环境中建议使用二进制方式部署,便于后续的升级维护等管理。

1、二进制包下载

二进制包下载链接:https://flashcat.cloud/download/nightingale/

image-20240108213423464

2、创建 work 目录

mkdir /data/n9e

3、上传安装包至服务器并解压

tar xzf n9e-v6.7.2-linux-amd64.tar.gz -C /data/n9e/

image-20240108213939722

4、导入 sql 文件

mysql -h 10.206.0.17 -u root -p'Zhurs@123' < /data/n9e/n9e.sql

image-20240108221431660

创建监控用户并授权:

CREATE USER 'nightingale'@'%' IDENTIFIED BY '67by5DV7vK3fiygm';
GRANT ALL PRIVILEGES ON n9e_v6.* TO 'nightingale'@'%';

5、修改配置文件

主要修改 DB 部分。

cp etc/config.toml etc/config.toml.bak
vim etc/config.toml

image-20240108223343819

时序数据库配置:

如果你想把数据转发给后端多个时序库,就可以配置多个 [[Pushgw.Writers]],比如:

[Pushgw]
LabelRewrite = true
[[Pushgw.Writers]]
Url = "http://127.0.0.1:8428/api/v1/write"
[[Pushgw.Writers]]
Url = "http://127.0.0.1:9090/api/v1/write"

image-20240108223451867

配置完成后,此时夜莺接收到 categraf、telegraf、grafana-agent 等各类 agent 上报上来的监控数据,都会转发给后端的 Prometheus。

6、配置 systemd 管理并启动

cat <<EOF >/etc/systemd/system/n9e.service
[Unit]
Description="n9e.service"
After=network.target

[Service]
Type=simple
ExecStart=/data/n9e/n9e
WorkingDirectory=/data/n9e
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=n9e.service
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start  n9e.service
systemctl enable n9e.service
systemctl status n9e.service

image-20240108223734971

监听 17000 端口:

image-20240111222355081

4.1.5 Categraf

1、概述

需要部署 categraf 上报监控数据,因为夜莺本身其实只是一个服务端组件,不负责数据采集。但如果我们 Prometheus、VictoriaMetrics、Thanos 等时序数据库已经存储有相关的监控指标数据,那也可以将他们作为夜莺的数据源使用,此时夜莺就相当于 Grafana 一样。

比如原本有一套 Prometheus + 各类 Exporter 的体系,复用即可,不需要非得用 categraf 替换采集逻辑,把这套 Prometheus 作为数据源接入夜莺,用夜莺告警就可以了。

我觉得官方文档说得已经非常明白了。

2、客户端下载

下载地址:https://github.com/flashcatcloud/categraf

image-20240108225959479

3、上传服务器并解压

tar xzf categraf-v0.3.45-linux-amd64.tar.gz -C /data/

4、修改配置文件

官方参考文档:https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/agent/categraf/

vim /data/categraf-v0.3.45-linux-amd64/conf/config.toml
  • 将数据推送到 n9e 服务端

    数据到达 n9e 时,然后 n9e 服务端再将数据写入后端时序数据库(本次我们配置的是 Prometheus)

    这里要清楚,官方文档说了,写入 prometheus 前,会将监控数据的一些元数据存储到 DB 中(MySQL/Redis)

    image-20240109220640979

  • Categraf 建立与 n9e 的心跳检测

    image-20240109220749231

5、配置 systemd 管理

cat <<EOF >/etc/systemd/system/categraf.service
[Unit]
Description="categraf.service"
After=network.target

[Service]
Type=simple
ExecStart=/data/categraf-v0.3.45-linux-amd64/categraf
WorkingDirectory=/data/categraf-v0.3.45-linux-amd64
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=categraf.service
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start  categraf.service
systemctl enable categraf.service
systemctl status categraf.service

image-20240108232848711

因此这里我们要清楚的是,采集器(客户端)不止 Categraf,还有 telegraf、grafana-agent 等。

6、那该 agent 是如何采集数据的呢?

我们下载后的安装包中就包含了基本的采集项:即以 input. 开头的目录就是各种采集插件的配置目录,运行 Categraf 客户端时,它就会通过这些目录的配置去采集数据。如果某个采集器 xx 不想启用,把 input.xx 改个其他前缀(或者删除这个目录),比如 bak.input.xx,categraf 就会忽略这个采集器。

image-20240109221817391

categraf启动时 可以通过-configs参数指定配置目录,如果不指定,会默认读取工作目录下的conf。 conf 目录结构如下:

  • config.toml # 主配置
  • logs.toml # logs-agent 配置
  • prometheus.toml # prometheus agent 配置
  • traces.yaml # trace-agent 配置
  • conf/input.*/*.toml 插件配置文件

主配置文件看官方文档解释就行,说得很清楚了。

一般地,Categraf 采集 agent 中的采集插件已经实现了基本的数据采集(CPU、内存、磁盘、磁盘 IO、网络),因此我们直接运行采集客户端 Categraf 时就会帮我们采集这些基础数据。

4.1.6 验证

默认账户/密码:root/root.2020

默认的密码可登陆后自行更改即可。

image-20240108222522859

image-20240108223934509

查看是否监控到主机:

但此时的主机是没有归组的,我们可创建用户及团队,然后将对应主机放入该团队中,那团队中的用户就可以看见监控主机了。

image-20240108234045362

创建用户:

image-20240108233805632

创建团队:

注意书写:rab-dev => 这表示一个层级关系,如下图

image-20240108233839674

创建业务组:

image-20240108234552546

将监控的机器归到指定的业务组中:

image-20240108234308622

image-20240108234711536

此时该服务器就属于 cctv/web 这个业务组了,同时这个业务组中的团队就可以查看这些服务器:

image-20240108234820158

4.1.7 配置数据源

如何将我们的时序库作为 n9e 的数据源(如下操作即可):

image-20240109215605932

image-20240108233325711

image-20240109215647054

4.2 边缘下沉式混杂部署

4.2.1 架构分析

官方文档说的很清楚【看文档】,无需再造轮子。

边缘监控无需依赖 MySQL、Redis 存储。

所谓的下沉,其思想就是将中心 N9e 的时序数据库下沉部署到边缘机房,避免大量时序数据传输到中心机房带来的网络带宽压力,同时也避免了因网络问题,边缘机房无法上报数据的问题。但是其本质还是需要和中心机房建立网络通信,尽管有时也会因为网络原因,边缘监控与中心监控也会存在延迟,但是边缘机房的监控数据是不会丢的。

image-20240111175232606

图中 region02 的机房中采集器使用的是 vmagent,并把采集的数据直接写入时序数据库,通过 n9e-edge 对监控数据做告警判断。这种架构比较简洁,但是会有一点点小问题,由于采集数据没有流经 n9e-edge,就没法从数据流中解析出机器信息,也就没法把机器信息写入数据库 target 表,也就导致页面上机器列表页面看不到相关的机器。这不影响告警,看图这些核心功能,只是用不了机器分组,自定义标签,告警自愈之类的功能。

更推荐使用 Categraf + n9e-edge 的方式来采集数据,其架构如图 region01 所示。当 Categraf 采集的数据上报给 n9e-edge 后,n9e-edge 就可以从监控数据中解析出机器信息,然后通过中心端的 n9e 写入数据库 target 表,这样就可以在页面上看到机器列表了。就可以使用机器分组,自定义标签,告警自愈之类的功能。

4.2.2 实验环境

在 4.1 你会看到服务器的主机名是 blog,为了实验方便查看,我这里先将主机命令为 n9e,另一个测试主机为 pro-blog。

hostnamectl set-hostname n9e
OSHostComment
RockyLinux 8.5n9e(10.206.0.17)VPC/南京
RockyLinux 8.5pro-blog(172.xx.xx.15)VPC/香港

这里相当于模拟了两个机房,n9e 作为监控中心机房,pro-blog 作为边缘监控机房。

4.2.3 Prometheus

上面说了,边缘主机的监控数据会采集到边缘主机的时序库(Prometheus、VIVTORIA 等时序库),因此这里需要部署时序数据库。

部署方式同 4.1.3 小结,这里不再演示。

image-20240111215650680

4.2.4 n9e-edge

这个应用程序已经包含在 n9e 压缩包中,直接使用即可。

1、二进制包下载

二进制包下载链接:https://flashcat.cloud/download/nightingale/

image-20240108213423464

2、创建 work 目录

mkdir -p /data/n9e-edge

3、解压二进制包

tar xzf n9e-v6.7.2-linux-amd64.tar.gz -C /data/n9e-edge/

4、配置 n9e-edge 连接中心 n9e

从 v6.0.0.ga.9 开始,合并了 n9e-alert、n9e-pushgw 模块为 n9e-edge,应对边缘机房的场景。n9e-edge 不依赖 mysql、redis,只依赖中心端的 n9e,所以 edge.toml 配置文件里,需要配置中心端 n9e 的地址。

vim /data/n9e-edge/etc/edge/edge.toml
...
[CenterApi]
Addrs = ["http://119.45.140.59:17000"]
BasicAuthUser = "user001"
BasicAuthPass = "ccc26da7b9aba533cbb263a36c07dcc5"
# unit: ms
Timeout = 9000
...

认证信息(BasicAuthUser、BasicAuthPass)对应中心端 n9e 的 HTTP.APIForService.BasicAuth 配置段,如下:

/data/n9e/etc/config.toml

当然,这个值是可自定义的。

image-20240111220034535

5、配置 n9e-edge 时序数据库

vim /data/n9e-edge/etc/edge/edge.toml

# 填写时序库IP+Port即可

image-20240111220631504

6、启动 n9e-edge

cat <<EOF >/etc/systemd/system/n9e-edge.service
[Unit]
Description="n9e-edge.service"
After=network.target

[Service]
Type=simple
ExecStart=/data/n9e-edge/n9e-edge --configs /data/n9e-edge/etc/edge
WorkingDirectory=/data/n9e-edge
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=n9e-edge.service
[Install]
WantedBy=multi-user.target
EOF
systemctl start n9e-edge.service
systemctl enable n9e-edge.service
systemctl status n9e-edge.service

image-20240111221900462

注意,n9e-edge 启动命令中 --configs 选项指定的是一个目录,而不能是文件,否则报错:

image-20240111221726442

监听 19000 端口:

image-20240111222509747

问题?

边缘机房的 n9e-edge 如果只有一个实例,挂了就麻烦了,如何做高可用?简单,只需要在边缘机房部署多台 n9e-edge 就可以了,注意,同一个 edge 集群,edge.toml 里配置的 EngineName 要一样。n9e-edge 前面再搞个负载均衡,给 agent 上报数据、心跳使用,这样就可以实现 n9e-edge 的高可用了。

4.2.5 Categraf

安装同 4.1.5 小节,这里不再演示。

不同之处1:上报数据

注意端口号

image-20240111223431753

不同之处2:心跳检测

categraf 向 n9e-edge 心跳的话,urlpath 就不能写 /v1/n9e/heartbeat 了,而要写成 /v1/n9e/edge/heartbeat

image-20240111223052413

4.2.6 验证

配置好后,就去中心夜莺监控,看边缘机房的数据是否正常采集成功。

1、到 n9e 去查看告警引擎

如下图,n9e-edge 已经和 n9e 建立心跳连接了。

image-20240111225437654

边缘机房的 n9e-edge 默认的引擎名字是 edge,与中心端 n9e 的引擎名字(default)相区分。注意:边缘机房的时序库在夜莺里添加数据源的时候,要选择边缘机房的告警引擎(edge)。如果你有两个边缘机房,注意两个边缘机房的 n9e-edge 的引擎名字要不一样。下图是配置数据源的时候,选择告警引擎的地方:

20230531105059

如何设置每个边缘机房的 n9e-egde 的引擎名?

vim /data/n9e-edge/etc/edge/edge.toml

# 修改其配置文件即可
...
[Alert]
[Alert.Heartbeat]
# auto detect if blank
IP = ""
# unit ms
Interval = 1000
EngineName = "edge"        # 修改此处(保证各个边缘机房的引擎名唯一)

# [Alert.Alerting]
# NotifyConcurrency = 10
...

2、中心 n9e 配置数据源

image-20240111231938880

image-20240111232239741

3、查看数据

image-20240111232400926

注意:边缘式下沉部署不是通过 n9e-edge 推送数据,而是将 n9e-edge 边缘机房的时序数据库作为 n9e 中心机房的数据源。

总结

1. 中心机房

  • 工作流:n9e 作为中心机房的 Server 端,Categraf 作为 Agent 目标数据采集端,上报数据给 n9e,然后 n9e 将相关数据对于存储于 MySQL、Redis、时序库中;
  • 存储:n9e 依赖 MySQL、Redis,用于存储用户、规则等相关元信息;
  • 时序数据库:Prometheus、influxDB 等时序库;
  • 单点问题:部署多实例 n9e 并采用 Nginx 负载均衡/反代/VIP。

2. 边缘机房

  • 工作流:n9e-edge 作为下沉机房的 Server 端,Categraf 作为 Agent 目标数据采集端,上报数据给 n9e-edge,然后 n9e-edge 将相关数据对于存储于时序库中;
  • 存储:n9e-edge 不依赖于 MySQL、Redis;
  • 时序数据库:Prometheus、influxDB 等时序库;
  • 单点问题:部署多实例 n9e-edge 并采用 Nginx 负载均衡/反代/VIP。

官方:如果机房之间网络链路很好,就让所有的 categraf 和中心端的 n9e 通信即可,如果某个机房和中心端网络链路不好,就让 categraf 和 n9e-edge 通信,n9e-edge 和中心端的 n9e 通信。

—END

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

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

相关文章

突然又对 Go 感兴趣,GOPATH entry cannot start with shell metacharacter 错误

打发无聊时间&#xff0c;水文一篇&#xff5e; 事情是这样的&#xff0c;因为我们上架的渠道包基本是定制化混淆出包&#xff0c; 混淆出包有一个关键点就是指定映射文件&#xff0c;映射文件的内容有一部分是使用外部工具在打包前按照一定规律随机生成包名、类名&#xff0c…

flutter使用get库管理路由,并设页面跳转动画和常见动画

get库还是非常强大的一个仓库&#xff0c;里面包含了非常常用的一些方法&#xff0c;比如路由管理&#xff0c;这是最常见和最常用的一个功能了&#xff0c;我们可以先配置一个路由对象&#xff0c;然后在里面配置路由列表&#xff0c;并且设置路由跳转方式。 第一种方式&…

vue3-计算属性

计算属性 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。 根据作者今年是否看过书展示不同信息 <script lang"ts" setup> import { ref, reactive } from "…

java实现局域网内视频投屏播放(五)视频搜索和投屏自动切换下一个

代码链接 这次对ui做了一些调整&#xff0c;整体分成了5个类别分别为 搜索设备播放任务已下载视频列表视频搜索下载任务列表 视频搜索 搜索 点击搜索后&#xff0c;会从执行所有VideoResolver实现类的search方法&#xff0c;将搜索到的结果汇总到一起&#xff0c;根据视频的…

设计模式⑤ :一致性

一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》&#xff08;【日】结城浩 著&#xff09;。该系列文章可随意转载。 …

node-sass@4.7.2 postinstall: `node scripts/build.js`

Can‘t find Python executable “D:\Python36\python.EXE“, you can set the PYTHON env variable.-CSDN博客 gyp ERR! build error gyp ERR! stack Error: C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe failed with exit code: 1 gyp ERR! stack at Chil…

【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中&#xff0c;大规模数据的存储常常会用到DDR。为了方便用户使用&#xff0c;Xilinx提供了DDR MIG IP核&#xff0c;用户能够通过AXI接口进行DDR的读写访问&#xff0c;然而MIG内部自动实现了许多环节&#xff0c;不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…

使用emu8086实现——顺序程序设计

一、实验目的 1. 掌握顺序程序设计方法 2. 掌握汇编语言编程设计方法。 二、实验内容 1.用查表的方法将一位十六进制数转换成它相应的ASCII码。 代码及注释&#xff1a; Data segment ;定义数据段Tab db 30h,31h,32h,33h,34h,35,36h,37h,38h,39h ;定义一个Tab的字节型…

云卷云舒:AI for DB、DB for AI

云卷云舒&#xff1a;算力网络云原生&#xff08;下&#xff09;&#xff1a;云数据库发展的新篇章-CSDN博客https://blog.csdn.net/bishenghua/article/details/135050556 随着数据库和AI技术的分支同向演进&#xff0c;AI 和数据库间的关联越发紧密了。 大模型的演进发展&a…

mybatisplus配置

一、新建项目&#xff1a;com.saas.plusdemo 二、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

借助Gitee将typora图片上传CSDN

概述 前面已经发了一个如何借助Github将typora上的图片上传到csdn上&#xff0c;但这有个缺陷&#xff1a;需要科学上网才能加速查看已经上传到github上的图片&#xff0c;否则就会出现已经上传的图片&#xff0c;无法正常查看的问题 如何解决&#xff1f; 那就可以使用Gite…

WEB 3D技术 three.js 聚光灯

本文 我们来说说 点光源和聚光灯 点光源 就像一个电灯泡一样 想四周发散光 而聚光灯就像手电筒一样 像一个方向射过去 距离越远范围越大 光越弱 我们先来看一个聚光灯的效果 我们可以编写代码如下 import ./style.css import * as THREE from "three"; import { O…

陪诊小程序|北京陪诊系统满足医疗陪诊需求的便捷工具

陪诊小程序是一种创新的线上医疗服务工具&#xff0c;旨在为用户提供便捷的医疗陪诊服务。通过陪诊小程序&#xff0c;用户可以轻松预约陪诊服务&#xff0c;选择合适的服务时间和医院科室&#xff0c;并了解服务详情和其他用户的评价。同时&#xff0c;陪诊员也可以利用小程序…

二、Sharding-JDBC系列02:自定义主键生成策略

目录 一、概述 二、自定义主键生成策略 (1)、自定义MyShardingKeyGenerator (2)、SPI接口配置 (3)、配置主键ID生成策略 (4)、测试数据插入 一、概述 实际应用中&#xff0c;大部分场景按照MySQL主键ID自增就能满足需求&#xff0c;但是在分库分表后&#xff0c;MySQL的…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4&#xff1a;十进制点分制 ipv6&#xff1a;十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手&#xff1a;

双向冒泡排序的数据结构实验报告

目录 实验目的&#xff1a; 实验内容&#xff08;实验题目与说明&#xff09; 算法设计&#xff08;核心代码或全部代码&#xff09; 运行与测试&#xff08;测试数据和实验结果分析&#xff09; 总结与心得&#xff1a; 实验目的&#xff1a; 理解双向冒泡排序算法的原…

FreeRTOS 学习相关笔记 附C语言内容补充

学习视频为【正点原子】手把手教你学FreeRTOS实时系统 文章目录 RTOS 入门裸机RTOSFreeRTOS任务调度方式任务状态 FreeRTOS 移植系统配置文件 API函数任务创建和删除动态方式创建任务静态方式创建任务删除任务 任务挂起和恢复函数调度器挂起与恢复临界区任务调度器的挂起和恢复…

估算监控最低可以存储的时长

监控可以存储的时长&#xff0c;主要取决于码率&#xff0c;知道了码率就知道一天可以的视频产生多少视频数据。 以乐橙官网给出的计算&#xff0c;我们可以推出这个设备8MP本地的录像码率大概在4Mbps左右。 同样的我们这里附一张表格&#xff0c;大家可以根据这个来估算存储…

leetcode14. 最长公共前缀

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 解题方法&#xff1a; 1.首先找到数组中长度最短的数据&#xff0c;与数组第一个数进行交换&#xff08;公共前缀的长度肯定不会大于列表中长度最短的字符串&#x…

大模型实战营Day3 作业

基础作业&#xff1a; 复现课程知识库助手搭建过程 (截图) 进阶作业&#xff1a; 选择一个垂直领域&#xff0c;收集该领域的专业资料构建专业知识库&#xff0c;并搭建专业问答助手&#xff0c;并在 OpenXLab 上成功部署&#xff08;截图&#xff0c;并提供应用地址&#xf…