tdengine学习笔记-整体架构及docker安装

官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据

 整体架构

TDENGINE是分布式,高可靠,支持水平扩展的架构设计

 TDengine分布式架构的逻辑结构图如下

 一个完整的 TDengine 系统是运行在一到多个物理节点上的,包含应用(app) tdengine驱动(TAOSC) ,数据节点(dnode),多个数据节点组成一个集群。应用通过taosc的API与集群进行互动。

物理节点(pnode):pnode是物理机,虚拟机,或者docker容器。物理节点通过FQDN来标记,TDENGINE完全依赖FQDN来进行网络通讯。

数据节点(dnode):dnode 是 TDengine 服务器侧执行代码 taosd 在物理节点上的一个运行实例。在一个 TDengine 系统中,至少需要一个 dnode 来确保系统的正常运行。

dnode 在 TDengine 集群中的唯一标识由其实例的 endpoint(EP)决定。endpoint 是由dnode 所在物理节点的 FQDN 和配置的网络端口组合而成。通过配置不同的端口,一个pnode(无论是物理机、虚拟机还是 Docker 容器)可以运行多个实例,即拥有多个 dnode。

虚拟节点(vnode): 为了更好地支持数据分片、负载均衡以及防止数据过热或倾斜,TDengine 引入了 vnode(虚拟节点)的概念。虚拟节点被虚拟化为多个独立的 vnode 实例(如上面架构图中的 V2、V3、V4 等),每个 vnode 都是一个相对独立的工作单元,负责存储和管理一部分时序数据。

每个 vnode 都拥有独立的运行线程、内存空间和持久化存储路径,确保数据的隔离性和高效访问。一个 vnode 可以包含多张表(即数据采集点),这些表在物理上分布在不 同的 vnode 上,以实现数据的均匀分布和负载均衡。

当在集群中创建一个新的数据库时,系统会自动为该数据库创建相应的 vnode。一个dnode 上能够创建的 vnode 数量取决于该 dnode 所在物理节点的硬件资源,如 CPU、内存和存储容量等。需要注意的是,一个 vnode 只能属于一个数据库,但一个数据库可以包含多个 vnode。

除了存储时序数据以外,每个 vnode 还保存了其包含的表的 schema 信息和标签值等元数据。这些信息对于数据的查询和管理至关重要。

在集群内部,一个 vnode 由其所归属的 dnode 的 endpoint 和所属的 vgroup ID 唯一标识。管理节点负责创建和管理这些 vnode,确保它们能够正常运行并协同工作。

管理节点(mnode): mnode(管理节点)是 TDengine 集群中的核心逻辑单元,负责监控和维护所有 dnode的运行状态,并在节点之间实现负载均衡(如图 15-1 中的 M1、M2、M3 所示)。作为元数据(包括用户、数据库、超级表等)的存储和管理中心,mnode 也被称为 MetaNode。

计算节点(qnode): qnode(计算节点)是 TDengine 集群中负责执行查询计算任务的虚拟逻辑单元,同时也处理基于系统表的 show 命令。为了提高查询性能和并行处理能力,集群中可以配置多个 qnode,这些 qnode 在整个集群范围内共享使用(如图 15-1 中的 Q1、Q2、Q3 所示)。

与 dnode 不同,qnode 并不与特定的数据库绑定,这意味着一个 qnode 可以同时处理来自多个数据库的查询任务。每个 dnode 上最多有一个 qnode,并由其所归属的 dnode 的endpoint 唯一标识。

当客户端发起查询请求时,首先与 mnode 交互以获取当前可用的 qnode 列表。如果在集群中没有可用的 qnode,计算任务将在 vnode 中执行。当执行查询时,调度器会根据执行计划分配一个或多个 qnode 来共同完成任务。qnode 能够从 vnode 获取所需的数据,并将计算结果发送给其他 qnode 进行进一步处理。

通过引入独立的 qnode,TDengine 实现了存储和计算的分离。

流计算节点(snode): snode(流计算节点)是 TDengine 集群中专门负责处理流计算任务的虚拟逻辑单元(如上架构图 中的 S1、S2、S3 所示)。为了满足实时数据处理的需求,集群中可以配置多个 snode,这些 snode 在整个集群范围内共享使用。

与 dnode 类似,snode 并不与特定的流绑定,这意味着一个 snode 可以同时处理多个流的计算任务。每个 dnode 上最多有一个 snode,并由其所归属的 dnode 的 endpoint 唯一标识。

当需要执行流计算任务时,mnode 会调度可用的 snode 来完成这些任务。如果在集群中没有可用的 snode,流计算任务将在 vnode 中执行。

通过将流计算任务集中在 snode 中处理,TDengine 实现了流计算与批量计算的分离,从而提高了系统对实时数据的处理能力。

虚拟节点组(VGroup):

vgroup(虚拟节点组)是由不同 dnode 上的 vnode 组成的一个逻辑单元。这些 vnode之间采用 Raft 一致性协议,确保集群的高可用性和高可靠性。在 vgroup 中,写操作只能在 leader vnode 上执行,而数据则以异步复制的方式同步到其他 follower vnode,从而在多个物理节点上保留数据副本。

vgroup 中的 vnode 数量决定了数据的副本数。要创建一个副本数为 N 的数据库,集群必须至少包含 N 个 dnode。副本数可以在创建数据库时通过参数 replica 指定,默认值为 1。利用 TDengine 的多副本特性,企业可以摒弃昂贵的硬盘阵列等传统存储设备,依然实现数据的高可靠性。

vgroup 由 mnode 负责创建和管理,并为其分配一个集群唯一的 ID,即 vgroup ID。如果两个 vnode 的 vgroup ID 相同,则说明它们属于同一组,数据互为备份。值得注意的是,vgroup 中的 vnode 数量可以动态调整,但 vgroup ID 始终保持不变,即使 vgroup 被删除,其 ID 也不会被回收和重复利用。

通过这种设计,TDengine 在保证数据安全性的同时,实现了灵活的副本管理和动态扩展能力

Taosc

taosc(应用驱动)是 TDengine 为应用程序提供的驱动程序,负责处理应用程序与集群之间的接口交互。taosc 提供了 C/C++ 语言的原生接口,并被内嵌于 JDBC、C#、Python、Go、Node.js 等多种编程语言的连接库中,从而支持这些编程语言与数据库交互。

应用程序通过 taosc 而非直接连接集群中的 dnode 与整个集群进行通信。taosc 负责获取并缓存元数据,将写入、查询等请求转发到正确的 dnode,并在将结果返回给应用程序之前,执行最后一级的聚合、排序、过滤等操作。对于 JDBC、C/C++、C#、Python、Go、Node.js 等接口,taosc 是在应用程序所处的物理节点上运行的。

此外,taosc 还可以与 taosAdapter 交互,支持全分布式的 RESTful 接口。这种设计使得 TDengine 能够以统一的方式支持多种编程语言和接口,同时保持高性能和可扩展性。

一个典型的消息流程​

为解释 vnode、mnode、taosc 和应用之间的关系以及各自扮演的角色,下面对写入数据这个典型操作的流程进行剖析。

TDengine Database 典型的操作流程

图 2 TDengine 典型的操作流程

  1. 应用通过 JDBC 或其他 API 接口发起插入数据的请求。
  2. taosc 会检查缓存,看是否保存有该表所在数据库的 vgroup-info 信息。如果有,直接到第 4 步。如果没有,taosc 将向 mnode 发出 get vgroup-info 请求。
  3. mnode 将该表所在数据库的 vgroup-info 返回给 taosc。Vgroup-info 包含数据库的 vgroup 分布信息(vnode ID 以及所在的 dnode 的 End Point,如果副本数为 N,就有 N 组 End Point),还包含每个 vgroup 中存储数据表的 hash 范围。如果 taosc 迟迟得不到 mnode 回应,而且存在多个 mnode,taosc 将向下一个 mnode 发出请求。
  4. taosc 会继续检查缓存,看是否保存有该表的 meta-data。如果有,直接到第 6 步。如果没有,taosc 将向 vnode 发出 get meta-data 请求。
  5. vnode 将该表的 meta-data 返回给 taosc。Meta-data 包含有该表的 schema。
  6. taosc 向 leader vnode 发起插入请求。
  7. vnode 插入数据后,给 taosc 一个应答,表示插入成功。如果 taosc 迟迟得不到 vnode 的回应,taosc 会认为该节点已经离线。这种情况下,如果被插入的数据库有多个副本,taosc 将向 vgroup 里下一个 vnode 发出插入请求。
  8. taosc 通知 APP,写入成功。

对于第二步,taosc 启动时,并不知道 mnode 的 End Point,因此会直接向配置的集群对外服务的 End Point 发起请求。如果接收到该请求的 dnode 并没有配置 mnode,该 dnode 会在回复的消息中告知 mnode EP 列表,这样 taosc 会重新向新的 mnode 的 EP 发出获取 meta-data 的请求。

对于第四和第六步,没有缓存的情况下,taosc 无法知道虚拟节点组里谁是 leader,就假设第一个 vnodeID 就是 leader,向它发出请求。如果接收到请求的 vnode 并不是 leader,它会在回复中告知谁是 leader,这样 taosc 就向建议的 leader vnode 发出请求。一旦得到插入成功的回复,taosc 会缓存 leader 节点的信息。

上述是插入数据的流程,查询、计算的流程也完全一致。taosc 把这些复杂的流程全部封装屏蔽了,对于应用来说无感知也无需任何特别处理。

通过 taosc 缓存机制,只有在第一次对一张表操作时,才需要访问 mnode,因此 mnode 不会成为系统瓶颈。但因为 schema 有可能变化,而且 vgroup 有可能发生改变(比如负载均衡发生),因此 taosc 会定时和 mnode 交互,自动更新缓存。

存储模型与数据分区、分片

存储模型​

TDengine 存储的数据包括采集的时序数据以及库、表相关的元数据、标签数据等,这些数据具体分为三部分:

时序数据:时序数据由data、head、sma、和stt 4类文件组成,采用了“一个数据采集点一张表”的模型来优化存储和查询性能

数据表元数据:包含标签信息和table scheme信息,存放于vnode里的meta文件,支持增删改查,支持标签数据的索引,元数据全内存存储,效率更快

数据库元数据:存放于mnode里包含系统节点、用户、DB、STable Schema等信息,支持增删改

与传统的 NoSQL 存储模型相比,TDengine 将标签数据与时序数据完全分离存储,它具有两大优势:

显著降低标签数据存储的冗余:标签和时序数据分离存储,降低冗余

实现极为高效的多表之间的聚合查询:通过标签过滤条件找出符合条件的表,减少了需要扫描的数据集大小,提高查询效率

数据分片​

在进行海量数据管理时,为了实现水平扩展,通常需要采用数据分片(sharding)和数据分区(partitioning)策略。TDengine 通过 vnode 来实现数据分片,并通过按时间段划分数据文件来实现时序数据的分区。

vnode 不仅负责处理时序数据的写入、查询和计算任务,还承担着负载均衡、数据恢复以及支持异构环境的重要角色。为了实现这些目标,TDengine 将一个 dnode 根据其计算和存储资源切分为多个 vnode。这些 vnode 的管理过程对应用程序是完全透明的,由TDengine 自动完成。。

数据分区​

除了通过 vnode 进行数据分片以外,TDengine 还采用按时间段对时序数据进行分区的策略。每个数据文件仅包含一个特定时间段的时序数据,而时间段的长度由数据库参数 duration 决定。这种按时间段分区的做法不仅简化了数据管理,还便于高效实施数据的保留策略。一旦数据文件超过了规定的天数(由数据库参数 keep 指定),系统将自动删除这些过期的数据文件。

此外,TDengine 还支持将不同时间段的数据存储在不同的路径和存储介质中。这种灵活性使得大数据的冷热管理变得简单易行,用户可以根据实际需求实现多级存储,从而优化存储成本和访问性能。

负载均衡与扩容​

每个 dnode 都会定期向 mnode 报告其当前状态,包括硬盘空间使用情况、内存大小、CPU 利用率、网络状况以及 vnode 的数量等关键指标。这些信息对于集群的健康监控和资源调度至关重要。

关于负载均衡的触发时机,目前 TDengine 允许用户手动指定。当新的 dnode 被添加到集群中时,用户需要手动启动负载均衡流程,以确保集群在最佳状态下运行。

数据写入与复制流程​

在一个具有 N 个副本的数据库中,相应的 vgroup 将包含 N 个编号相同的 vnode。在这些 vnode 中,只有一个被指定为 leader,其余的都充当 follower 的角色。这种主从架构确保了数据的一致性和可靠性。

当应用程序尝试将新记录写入集群时,只有 leader vnode 能够接受写入请求。如果 follower vnode 意外地收到写入请求,集群会立即通知 taosc 需要重新定向到 leader vnode。这一措施确保所有的写入操作都发生在正确的 leader vnode 上,从而维护数据的一致性和完整性。

通过这种设计,TDengine 确保了在分布式环境下数据的可靠性和一致性,同时提供高效的读写性能。

Leader Vnode 写入流程​

Leader Vnode 遵循下面的写入流程:

TDengine Database Leader写入流程

图 3 TDengine Leader 写入流程

  • 第 1 步: leader vnode 收到应用的写入数据请求,验证 OK,验证有效性后进入第 2 步;
  • 第 2 步:vnode 将该请求的原始数据包写入数据库日志文件 WAL。如果 wal_level 设置为 2,而且 wal_fsync_period 设置为 0,TDengine 还将 WAL 数据立即落盘,以保证即使宕机,也能从数据库日志文件中恢复数据,避免数据的丢失;
  • 第 3 步:如果有多个副本,vnode 将把数据包转发给同一虚拟节点组内的 follower vnodes,该转发包带有数据的版本号(version);
  • 第 4 步:写入内存,并将记录加入到 skip list。但如果未达成一致,会触发回滚操作;
  • 第 5 步:leader vnode 返回确认信息给应用,表示写入成功;
  • 第 6 步:如果第 2、3、4 步中任何一步失败,将直接返回错误给应用;

Follower Vnode 写入流程​

对于 follower vnode,写入流程是:

TDengine Database Follower 写入流程

图 4 TDengine Follower 写入流程

  • 第 1 步:follower vnode 收到 leader vnode 转发了的数据插入请求。
  • 第 2 步:vnode 将把该请求的原始数据包写入数据库日志文件 WAL。如果 wal_level 设置为 2,而且 wal_fsync_period 设置为 0,TDengine 还将 WAL 数据立即落盘,以保证即使宕机,也能从数据库日志文件中恢复数据,避免数据的丢失。
  • 第 3 步:写入内存,更新内存中的 skip list。

与 leader vnode 相比,follower vnode 不存在转发环节,也不存在回复确认环节,少了两步。但写内存与 WAL 是完全一样的。

主从选择​

每个 vnode 都维护一个数据的版本号,该版本号在 vnode 对内存中的数据进行持久化存储时也会被一并持久化。每次更新数据时,无论是时序数据还是元数据,都会使版本号递增,确保数据的每次修改都被准确记录。

当 vnode 启动时,它的角色(leader 或 follower)是不确定的,且数据处于未同步状态。为了确定自己的角色并同步数据,vnode 需要与同一 vgroup 内的其他节点建立 TCP连接。在连接建立后,vnode 之间会互相交换版本号、任期等关键信息。基于这些信息,vnode 将使用标准的 Raft 一致性算法完成选主过程,从而确定谁是 leader,谁应该作为follower。

这一机制确保在分布式环境下,vnode 之间能够有效地协调一致,维护数据的一致性和系统的稳定性

同步复制​

在 TDengine 中,每次 leader vnode 接收到写入数据请求并将其转发给其他副本时,它并不会立即通知应用程序写入成功。相反,leader vnode 需要等待超过半数的副本(包括自身)达成一致意见后,才会向应用程序确认写入操作已成功。如果在规定的时间内未能获得半数以上副本的确认,leader vnode 将返回错误信息给应用程序,表明写入数据操作失败。

这种同步复制的机制确保了数据在多个副本之间的一致性和安全性,但同时也带来了写入性能方面的挑战。为了平衡数据一致性和性能需求,TDengine 在同步复制过程中引入了流水线复制算法。

流水线复制算法允许不同数据库连接的写入数据请求确认过程同时进行,而不是顺序等待。这样,即使某个副本的确认延迟,也不会影响到其他副本的写入操作。通过这种方式,TDengine 在保证数据一致性的同时,显著提升了写入性能,满足了高吞吐量和低延迟的数据处理需求。

 1,用docker安装

docker pull tdengine/tdengine:3.3.3.0

启动镜像

docker run -d -p 6030:6030 -p 6041:6041 -p 6043:6043 -p 6044-6049:6044-6049 -p 6044-6045:6044-6045/udp -p 6060:6060 tdengine/tdengine:3.3.3.0

 2,进入容器

docker ps  查看镜像的id

docker exec -it 镜像id bash

3,造数据

执行下列命令会造数据

taosBenchmark -y

系统将自动在数据库 test 下创建一张名为 meters的超级表。这张超级表将包含 10,000 张子表,表名从 d0 到 d9999,每张表包含 10,000条记录。每条记录包含 ts(时间戳)、current(电流)、voltage(电压)和 phase(相位)4个字段。时间戳范围从“2017-07-14 10:40:00 000” 到 “2017-07-14 10:40:09 999”。每张表还带有 location 和 groupId 两个标签,其中,groupId 设置为 1 到 10,而 location 则设置为 California.Campbell、California.Cupertino 等城市信息。

执行该命令后,系统将迅速完成 1 亿条记录的写入过程。实际所需时间取决于硬件性能,但即便在普通 PC 服务器上,这个过程通常也只需要十几秒。

taosBenchmark 提供了丰富的选项,允许用户自定义测试参数,如表的数目、记录条数等。要查看详细的参数列表,请在终端中输入如下命令

taosBenchmark --help

有关taosBenchmark 的详细使用方法,请参考taosBenchmark 参考手册

4,TDengine 命令行界面

执行taos;

体验查询​

使用上述 taosBenchmark 插入数据后,可以在 TDengine CLI(taos)输入查询命令,体验查询速度。

  1. 查询超级表 meters 下的记录总条数
SELECT COUNT(*) FROM test.meters;

  1. 查询 1 亿条记录的平均值、最大值、最小值
SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters;

  1. 查询 location = "California.SanFrancisco" 的记录总条数
SELECT COUNT(*) FROM test.meters WHERE location = "California.SanFrancisco";

  1. 查询 groupId = 10 的所有记录的平均值、最大值、最小值
SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters WHERE groupId = 10;

  1. 对表 d1001 按每 10 秒进行平均值、最大值和最小值聚合统计
SELECT _wstart, AVG(current), MAX(voltage), MIN(phase) FROM test.d1001 INTERVAL(10s);

在上面的查询中,使用系统提供的伪列 _wstart 来给出每个窗口的开始时间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【支持向量机(SVM)】:相关概念及API使用

文章目录 1 SVM相关概念1.1 SVM引入1.1.1 SVM思想1.1.2 SVM分类1.1.3 线性可分、线性和非线性的区分 1.2 SVM概念1.3 支持向量概念1.4 软间隔和硬间隔1.5 惩罚系数C1.6 核函数 2 SVM API使用2.1 LinearSVC API 说明2.2 鸢尾花数据集案例2.3 惩罚参数C的影响 1 SVM相关概念 1.1…

git 基础之 merge 和 rebase 的比较

在团队软件开发过程中,代码合并是一个基本且频繁执行的任务。 Git 提供了多种合并代码的策略,其中最常用的是 merge 和 rebase。 尽管二者的终极目标是相同的——整合代码变更——它们的方法和推荐的使用场景却有所区别。本文将详细介绍和比较这两种策…

sagemaker中使用pytorch框架的DLC训练和部署cifar图像分类任务

参考资料 https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-python-sdk/pytorch_cnn_cifar10/pytorch_local_mode_cifar10.ipynbhttps://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html 获取训练数据 # s3://zhaojiew-sa…

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

vite+vue3+ts编译vue组件后,编译产物中d.ts文件为空

一、前言 使用vue3vitets实现一个UI组件库,为了生成类型文件便于其他项目引用该组件库。根据推荐使用了vite-plugin-dts插件进行ts文件的生成 二、版本 组件版本vue ^3.5.12 vite ^5.4.10 vite-plugin-dts ^4.3.0 typescript ~5.6.2 三、问题描述 使用vitevi…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定:实现两种模态数据融合_红外相机标定-CSDN博客 ,介绍了如何利用标定板实现外参标定;但实测下来发现2个问题: (1)红外标定板尺寸问题,由于标定板小…

柔性仿人手指全覆盖磁皮肤,具备接触觉和运动觉的双模态感知能力

人体精细触觉和本体运动觉依赖于相同类型的感受器,这些感受器位于肌肉、肌腱、关节和皮肤中,负责感知轻触、挠痒、细微压力、形状变化、肌肉张力、肌腱拉伸和关节位置变化等信息。因此方斌教授团队着手于具有高精度、小尺寸、可定制等优势的磁触觉传感器…

【摘要】正点原子--Makefile--学习笔记

目录 一、Makefile 基础1、Makefile引入2、Makefile初次编写 二、Makefile语法1、Makefile规则格式2、Makefile第一次升级 一、Makefile 基础 1、Makefile引入 2、Makefile初次编写 二、Makefile语法 1、Makefile规则格式 2、Makefile第一次升级

【WPF】Prism学习(八)

Prism Dependency Injection 1.处理解析错误 1.1. 处理解析错误: 这个特性是在Prism 8中引入的,如果你的应用目标是早期版本,则不适用。 1.2. 异常发生的原因: 开发者可能会遇到多种原因导致的异常,常见的错误包括…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要,硬件维护工程师在后端发现问题后,总结成可维护性和可靠性需求,在产品立项的时候与新特性一起进行需求分析,然后经过设计、开发和测试环节,在产品中落地。这些需…

Java 岗面试八股文及答案整理(2024最新版)

春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库: https://github.com/sgl-project/sglang 项目说明书: https://sgl-project.github.io/start/install.html 资讯: https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…

Java项目实战II基于微信小程序的科创微应用平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着科技的…

C++ Primer习题集----题目+答案版

具体源码请见:Cprimer习题上半部分资源-CSDN文库 目录 第一章 开始 练习1.1 编写程序,在标准输出上打印Hello.world 练习1.2 我们的程序使用加法运算符来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。 练习1.4 编译一个包…

Zookeeper的简单使用Centos环境下

目录 前言 一、ZOokeeper是什么? 二、安装Zookeeper 1.进入官网下载 2.解压到服务器 3.配置文件 三.使用Zookeeper 3.1启动相关指令 3.2其他指令 3.3ACL权限 总结 前言 记录下安装zookeeper的一次经历 一、ZOokeeper是什么? ZooKeeper是一…

【Linux】————多线程(概念及控制)

作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年11月19日 再谈地址空间: OS对内存进行管理不是根据字节为单位,以字节为单位效率过低,是以内存块为单位的,一个内存块的大小一般为4…

蓝桥杯每日真题 - 第17天

题目:(最大数字) 题目描述(13届 C&C B组D题) 题目分析: 操作规则: 1号操作:将数字加1(如果该数字为9,变为0)。 2号操作:将数字…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…