Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >wwwhj8828com13O99636600InfluxDB TSM存储引擎之数据写入

wwwhj8828com13O99636600InfluxDB TSM存储引擎之数据写入

原创
作者头像
用户3579060
修改于 2018-10-15 03:31:45
修改于 2018-10-15 03:31:45
6890
举报
文章被收录于专栏:InfluxDBInfluxDB

之前两篇文章笔者分别从TSM File文件存储格式、倒排索引文件存储格式这两个方面对InfluxDB最基础、最底层也最核心的存储模块进行了介绍,接下来笔者会再用两篇文章在存储文件的基础上分别介绍InfluxDB是如何处理用户的写入(删除)请求和读取请求的。在阅读这两篇文章之前,强烈建议看官先行阅读之前的多篇文章,不然可能会有一定的阅读障碍。

InfluxDB写入总体框架

InfluxDB提供了多种接口协议供外部应用写入,比如可以使用collected采集数据上传,可以使用opentsdb作为输入,也可以使用http协议以及udp协议批量写入数据。批量数据进入到InfluxDB之后总体会经过三个步骤的处理:

1. 批量时序数据shard路由:InfluxDB首先会将这些数据根据shard的不同分成不同的分组,每个分组的时序数据会发送到对应的shard。每个shard相当于HBase中region的概念,是InfluxDB中处理用户读写请求的单机引擎。

2. 倒排索引引擎构建倒排索引:InfluxDB中shard由两个LSM引擎构成 – 倒排索引引擎和TSM引擎。时序数据首先会经过倒排索引引擎构建倒排索引,倒排索引用来实现InfluxDB的多维查询。

3. SM引擎持久化时序数据:倒排索引构建成功之后时序数据会进入TSM Engine处理。TMS Engine处理流程和通用LSM Engine基本一样,先将写入请求追加写入WAL日志,再写入cache,一旦满足特定条件会将cache中的时序数据执行flush操作落盘形成TSM File。

批量时序数据Shard路由

通常来说时序数据都会以批量的形式写入数据库,很少会像关系型数据库那样一条一条写入,这对于追求高吞吐的时序系统来说至关重要。批量数据写入InfluxDB之后做的第一件事情是分组,将时序数据点按照所属shard划分为多组(称为Shard Map),每组时序数据点将会发送给对应的shard引擎并发处理。

这里我们简单回顾下InfluxDB的Sharding策略(详见文章《时序数据库技术体系 – 初识InfluxDB》中Sharding策略一节)。InfluxDB虽说是单机数据库,但是每个表依然会被分为多个shard。简单来说,InfluxDB中sharding属于两层sharding:首先按照时间进行Range Sharding,即按时间分片,比如7天一个分片的话,最近7天的数据会分到一个shard,一周前到两周前的数据会被分到上一个shard,以此类推;在时间分片的基础上还可以再执行Hash Sharding,按照SeriesKey执行Hash(保证同一个SeriesKey对应的所有数据都落到同一个shard),再将数据分散到指定的多个shard中。

当然,经过笔者深进一步了解,发现单机InfluxDB只有第一层sharding,即只有根据时间进行Range Sharding,并没有执行Hash Sharding。Hash Sharding只会在分布式InfluxDB中才会用到。

倒排索引引擎构建倒排索引

InfluxDB中倒排索引引擎使用LSM引擎构建,上篇文章《时序数据库技术体系 – InfluxDB 多维查询之倒排索引》其实已经对引擎的工作原理进行了深入的介绍。这里重点将整个流程做一个串联梳理,其中细节部分不会展开来讲,有兴趣的话可以参考上一篇文章。

这里首先思考一个问题:为什么InfluxDB倒排索引需要构建成LSM引擎?其实很简单,LSM引擎天生对写友好,写多读少的系统第一选择就是LSM引擎,所以大数据时代的各种数据存储系统就是LSM引擎的天下,HBase、Kudu、Druid、TiKV这些系统无一不是这样。InfluxDB作为一个时序数据库更是写多读少的典型,无论倒排索引引擎还是时序数据处理引擎选用LSM引擎更是无可厚非。

既然是LSM引擎,工作机制必然是这样的:首先将数据追加写入WAL再写入Cache就可以返回给用户写入成功,WAL可以保证即使发生异常宕机也可以恢复出来Cache中丢失的数据。一旦满足特定条件系统会将Cache中的时序数据执行flush操作落盘形成文件。文件数量超过一定阈值系统会将这些文件合并形成一个大文件。那具体到倒排索引引擎整个流程是什么样的,简单来看一下:

1. WAL追加写入:Inverted Index WAL格式很简单,由一个一个LogEntry构成:

每个LogEntry由Flag、Measurement、一系列Key\Value以及Checksum组成。其中Flag表示更新类型,包括写入、删除等,Measurement表示数据表,Key\Value表示写入的Tag Set以及Checksum,其中Checksum用于根据WAL回放数据时验证LogEntry的完整性。注意,LogEntry中并没有时序数据列,只有维度列(Tag Set)。

2. Inverted Index在内存中构建

(1)拼SeriesKey: 时序数据写入到系统之后先将measurement和所有的维度值拼成一个seriesKey;

(2)确认SeriesKey是否已经构建过索引:在文件中确认该seriesKey是否已经存在,如果已经存在就忽略,不需要再将其加入到内存倒排索引。那问题转化为如何在文件中查找某个seriesKey是否已经存在?这就是Series Block中Bloom Filter的核心作用,首先使用Bloom Filter进行判断,如果不存在,肯定不存在。如果存在,不一定存在,需要进一步判断。再进一步使用B+树以及HashIndex进一步查找判断;

(3)如果seriesKey在文件中不存在,需要将其写入内存。倒排索引内存结构主要包含两个Map:<measurement, List<tagKey>> 和 <tagKey, <tagValue, List<SeriesKey>>>,前者表示时序表与对应维度集合的映射,即这个表中有多少维度列。后者表示每个维度列都有哪些可枚举的值,以及这些值都对应哪些SeriesKey。InfluxDB中SeriesKey就是一把钥匙,只有拿到这把钥匙才能找到这个SeriesKey对应的数据。而倒排索引就是根据一些线索去找这把钥匙。

3. Inverted Index Cache Flush流程

(1)触发时机:当Inverted Index WAL日志的大小超过阈值(默认5M),就会执行flush操作将缓存中的两个Map写成文件;

(2)基本流程:

  • 缓存Map排序:<measurement, List<tagKey>>以及<tagKey, <tagValue, List<SeriesKey>>都需要经过排序处理,排序的意义在于有序数据可以结合Hash Index实现范围查询,另外Series Block中B+树的构建也需要SeriesKey排序;
  • 构建并持久化Series Block:在排序的基础上首先持久化<tagKey, tagValue, List<SeriesKey>>结构中所有的SeriesKey,也就是先构建Series Block。依次持久化SeriesKey到SeriesKeyChunk,当Chunk满了之后,根据Chunk中最小的SeriesKey构建B+树中的Index Entry节点。当然,Hash Index以及Bloom Filter是需要实时构建的。需要注意的是,Series Block在构建的同时需要记录下SeriesKey与该Key在文件中偏移量的对应关系,即<SeriesKey, SeriesKeyOffset>,这一点至关重要;
  • 内存中将SeriesKey映射为SeriesId:将<tagKey, <tagValue, List<SeriesKey>>结构中所有的SeriesKey由上一步中得到的<SeriesKey, SeriesKeyOffset >中的SeriesKeyOffset代替。形成新的结构:<tagKey, <tagValue, List<SeriesKeyOffset>>,即<tagKey, <tagValue, List<SeriesKeyId>>>,其中SeriesKeyId就是SeriesKeyOffset;
  • 构建并持久化Tag Block:在新结构<tagKey, <tagValue, List<SeriesKeyId>>>的基础上首先持久化tagValue,将同一个tagKey下的所有tagValue持久化在一起并生成对应Hash Index写入文件,接着持久化下一个tagKey的所有tagValue。所有tagValue都持久话完成之后再依次持久化所有的tagKey,形成Tag Block;
  • 构建并持久化Measurement Block:最后持久化measurement形成Measurement Block。

时序数据写入流程

时序数据的维度信息经过倒排索引引擎构建完成之后,接着就需要将数据写入系统。和倒排索引引擎一样,数据写入引擎也是一个LSM引擎,基本流程也是先写WAL,再写Cache,最后满足一定阈值条件之后将Cache中的数据flush到文件。

1. WAL追加写入:时间线数据数据会经过两重处理,首先格式化为WriteWALEntry对象,该对象字段元素如下图所示。然后经过snappy压缩后写入WAL并持久话到文件。

2. 时序数据写入内存结构

(1)时序数据点格式化:将所有时间序列数据点按时间线组织形成一个Map:<SeriesKey+FieldKey, List<Value>>,即将相同Key(SeriesKey+FieldKey)的时序数据集中放在一个List中;

(2)时序数据点写入Cache:InfluxDB中Cache是一个crude hash ring,这个ring由256个partition构成,每个partition负责存储一部分时序数据Key对应的值。就相当于数据写入Cache的时候又根据Key Hash了一次,根据Hash结果映射到不同的partition。为什么要这么处理?个人认为有点像Java中ConcurrentHashMap的思路,将一个大HashMap切分成多个小HashMap,每个HashMap内部在写的时候需要加锁。这样处理可以减小锁粒度,提高写性能。

3. Data Cache Flush流程(参考engine.compactCache)

(1)触发时机:Cache执行flush操作有两个基本触发条件,其一是当cache大小超过一定阈值,可以通过参数’cache-snapshot-memory-size’配置,默认是25M大小;其二是超过一定时间阈值没有时序数据写入WAL也会触发flush,默认时间阈值为10分钟,可以通过参数’cache-snapshot-write-cold-duration’配置;

(2)基本流程:在了解了TSM文件的基本结构之后,我们再简单看看时序数据是如何从内存中的Map持久化成TSM文件的,整个过程可以表述为:

  • 内存中构建Series Data Block:顺序遍历内存Map中的时序数据,分别对时序数据的时间列和数值列进行相应的编码,按照Series Data Block的格式进行组织,当Block大小超过一定阈值就构建成功。并记录这个Block内时间列的最小时间MinTime以及最大时间MaxTime。
  • 将构建好的Series Data Block写入文件:使用输出流将内存中数据输出到文件,并返回该Block在文件中的偏移量Offset以及总大小Size。
  • 构建文件级别B+索引:在内存中为该Series Data Block构建一个索引节点Index Entry,使用数据Block在文件中的偏移量Offset、总大小Size以及MinTime、MaxTime构建一个Index Entry对象,写入到内存Series Index Block对象。

这样,每构建一个Series Data Block并写入文件之后都会在内存中顺序构建一个Index Entry,写入内存Series Index Block对象。一旦一个Key对应的所有时序数据都持久化完成,一个Series Index Block就构建完成,构建完成之后填充Index Block Meta信息。接着新建一个新的Series Index Block开始构建下一个Key对应的数据索引信息。

InfluxDB数据删除操作(DropMeasurement,DropTagKey)

一般LSM引擎处理删除通常都采用Tag标记的方式,即删除操作和写入操作流程基本一致,只是数据上会多一个Tag标记 – deleted,表示该值已经被deleted。这种处理方案可以最小化删除代价,但万物有得必有失,减小了写入代价必然会增加读取代价,Tag标签方案在读取的时候需要对标记有deleted的数值进行特殊处理,这个代价还是很大的。HBase中删除操作就是采用Tag标记方案。

InfluxDB比较奇葩,对于删除操作处理的比较异类,通常InfluxDB不会删除一条记录,而是会删除某段时间内或者某个维度下的所有记录,甚至一张表的所有记录,这和通常的数据库有所不同。比如:

DROP SERIES FROM h2o_feet WHERE location = ‘santa_monica' DELETE FROM "cpu" DELETE FROM "cpu" WHERE time < '2000-01-01T00:00:00Z' DELETE WHERE time < '2000-01-01T00:00:00Z'

上文我们知道InfluxDB中一个shard有两个LSM引擎,一个是倒排索引引擎(存储维度列到SeriesKey的映射关系,方便多维查找),一个是TSM Engine,用来存储实际的时序数据。如果是删除一条记录,通常只需要TSM Engine执行删除就可以,倒排索引引擎是不需要执行删除的。而如果是Drop Measurement这样的操作,那么两个LSM引擎都需要执行相应的删除。问题是,这两个引擎的删除策略完全不同,TSM Engine采用了一种同步删除策略,Inverted Index Engine采用了标记删除策略。

1. TSM Engine同步删除策略,整个删除流程可以分为如下四步:

(1)删除所有TSM File中满足条件的series,系统会遍历当前shard中所有TSM File,检查该File中是否存在满足删除条件的File,如果有会执行如下两个操作:

  • TSM File Index相关处理:在内存中删除满足条件的Index Entry,通常删除会带有Time Range以及Key Range,而且TSM File Index会在引擎启动之后加载到内存。因此删除操作会将满足条件的Index Entry从内存中删除。
  • 生成tombstoner文件:tombstoner文件会记录当前TSM File中所有被删除的时序数据,时序数据用[key, min, max]三个字段表示,其中key即SeriesKey+FieldKey,[min, max]表示要删除的时间段。如下图所示:

(2)删除Cache中满足条件的series;

(3)在WAL中生成一条删除series的记录并持久化到硬盘。

2. Inverted Index Engine 标记Tag删除策略,标记Tag删除非常简单,和一次写入流程基本相同:

(1)在WAL中生成一条flag为deleted的LogEntry并持久化到硬盘;

(2)将要删除的维度信息写入Cache,需要标记deleted(设置type=deleted);

(3)当WAL大小超过阈值之后标记为deleted的维度信息会随Cache Flush到倒排索引文件;

(4)和HBase一样,Inverted Index Engine中索引信息真正被删除发生在compact阶段。

总结

InfluxDB因为其特有的双LSM引擎而显得内部结构更加复杂,写入流程相比其他数据库来说更加繁琐。但只要理解了它的数据文件内部组织格式以及倒排索引文件内部组织格式,相信对于整体的把握也并不是很难。这篇文章将之前讲过的相关知识点通过写入流程系统地串联了起来,希望看官能够借此深入理解InfluxDB的工作原理。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
饿了么Influxdb实践之路
作者 | 刘平 文章来源GitChat,CSDN独家合作发布,查看交流实录:http://gitbook.cn/books/59428f6f7e850f039399fd02/index.html Influxdb是一个基于golang编写,没有额外依赖的开源时序数据库,用于记录metrics、events,进行数据分析。这篇文章谈论的influxdb版本在1.2.0以上。这篇文章只谈论influxdb在监控中的数据存储应用,不会谈论influxdb提供的整套监控方案。本文主要谈论五个方面:时序数据库选
CSDN技术头条
2018/02/08
5K0
饿了么Influxdb实践之路
influxdb原理那些事
在目前的APM和后续的IoT场景中,InfluxDB会发挥越来越重要的作用,那么InfluxDB是如何保存数据并且高性能对外提供存取服务的呢?下面就一起来看下InfluxDB原理的那些事 ~
luoxn28
2020/02/17
1.5K0
influxdb原理那些事
Influxdb中基于磁盘的倒排索引文件TSI结构解析
基础上是按照其在文件中的结构定义的,记录了measurement包括的tagset和series id信息;
扫帚的影子
2018/12/24
1.9K0
饿了么《分布式时序数据库 - LinDB》
背景 饿了么对时序数据库的需求主要来自各监控系统,主要用于存储监控指标。原来使用graphite,后来慢慢有对指标有多维的需求(主要体现在对一个指标加多个Tag, 来组成Series,然后对Tag进行Filter和Group进行计算),这时graphite基本很难满足需求。 业界现在用的比较多的主要有如下几类TSDB: InfluxDB:很多公司都在用,包括饿了么有部分监控系统也是用InfluxDB。优点,支持多维和多字段,存储也根据TSDB的特点做了优化。但开源的部分不支持,很多公司自己做集群化, 但大
用户1263954
2018/06/22
2.4K0
时序数据库 InfluxDB(一)
数据库种类有很多,比如传统的关系型数据库 RDBMS( 如 MySQL ),NoSQL 数据库( 如 MongoDB ),Key-Value 类型( 如 redis ),Wide column 类型( 如 HBase )等等等等,当然还有本系列文章将会介绍的时序数据库 TSDB( 如 InfluxDB )。
凌虚
2020/07/17
3.6K0
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
之前介绍了运维监控系统Prometheus,然后就有朋友问我关于时序数据库的情况,所以这里总结一下时序数据库,并以InfluxDB为例,介绍时序数据库的功能特性和使用方式,希望能对大家有所帮助。
章为忠学架构
2023/10/06
20.5K0
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
时序数据库 InfluxDB(四)
所有数据先写入到 WAL( Write Ahead Log )预写日志文件,并同步到 Cache 缓存中,当 Cache 缓存的数据达到了一定的大小,或者达到一定的时间间隔之后,数据会被写入到 TSM 文件中。
凌虚
2020/07/17
1.7K0
时序数据库技术体系(二)–初识InfluxDB
在上篇文章《时序数据库体系技术 – 时序数据存储模型设计》中笔者分别介绍了多种时序数据库在存储模型设计上的一些考虑,其中OpenTSDB基于HBase对维度值进行了全局字典编码优化,Druid采用列式存储并实现了Bitmap索引以及局部字典编码优化,InfluxDB和Beringei都将时间线挑了出来,大大降低了Tag的冗余。在这几种时序数据库中,InfluxDB无疑显的更加专业。接下来笔者将会针对InfluxDB的基本概念、内核实现等进行深入的分析。本篇文章先行介绍一些相关的基本概念。 InfluxDB
企鹅号小编
2018/02/01
1.8K0
时序数据库技术体系(二)–初识InfluxDB
TSI索引解析之TSL文件
series和seriesSet其实都是用来存储SeriesID, 当SeriesID数量小于等于25个时,存到series里,反之存到seriesSet这个roaring bitmap里;
扫帚的影子
2018/12/27
1.1K0
Prometheus 存储引擎分析
Prometheus 作为云原生时代的时序数据库, 是当下最流行的监控平台之一,尽管其整体架构一直没怎么变,但其底层的存储引擎却演进了几个版本。本文主要介绍 Prometheus V2(即现在使用的)版本的存储格式细节,以及查询是如何定位到符合条件的数据,旨在通过本文的分析,对 Prometheus 的存储引擎有更深入了解。
架构狂人
2023/11/23
4400
Prometheus 存储引擎分析
干货 | 每分钟写入6亿条数据,携程监控系统Dashboard存储升级实践
作者简介 大伟,携程软件技术专家,关注企业级监控、日志、可观测性领域。 一、 背景概述 框架Dashboard是一款携程内部历史悠久的自研监控产品,其定位是企业级Metrics监控场景,主要提供用户自定义Metrics接入,并基于此提供实时数据分析和视图展现的面板服务,提供可定制的基于时间序列的各类系统级性能数据和业务指标数据的看板。还可以提供灵活的数据收集接口、分布式的大容量存储和灵活的展现方式。 由于时间较早,那时候业界还没有像样的TSDB产品,类似Prometheus,InfluxDB都是后起之秀,
携程技术
2022/08/25
8840
干货 | 每分钟写入6亿条数据,携程监控系统Dashboard存储升级实践
influxdb 简介与实现(一)
InfluxDB是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及执行分析。
Timu
2018/07/17
1.5K0
influxdb 简介与实现(一)
influxdb 时间序列数据库
1、InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等) 可度量性:你可以实时对大量数据进行计算 基于事件:它支持任意的事件数据 1)无结构(无模式):可以是任意数量的列 2)可拓展的 3)支持min, max, sum, count, mean, median 等一系列函数,方便统计 4)原生的HTTP支持,内置HTTP API 5)强大的类SQL语法 6)自带管理界面,方便使用 2、安装: rpm -ivh https://dl.influxdata.com/influxdb/releases/influxdb-0.13.0.x86_64.rpm 3、启动: sudo service influxdb start 4、客户端: 在usr/bin里使用influx即可登入Influx服务器。也可以将路径加入环境变量中,这样既可在任意地方使用influx。 InfluxDB自带web管理界面,在浏览器中输入 http://服务器IP:8083 即可进入web管理页面。 5、基本概念: database 数据库 measurement 表 point 表中的一行数据 point由time(自动生成的时间戳),field数据,tags由索引的数据 series所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。 6、基本操作: 客户端命令行、HTTP API、各语言API库 show databases; create database test drop database test use test
用户5760343
2022/05/14
1.3K0
influxdb 时间序列数据库
浅谈时序数据库内核:如何用单机扛住亿级数据写入
1.1 Prometheus踩过的坑 在这里,我们先简单复习一下Prometheus中的数据结构。其为典型的k-v对,k(一般叫Series)由MetricName,Lables,TimeStamp组成,v则是值。 在早期的设计中,相同的Series会按照一定的规则组织起来,同时也会根据时间去组织文件。于是就变成了一个矩阵: 优点是写可以并行写,读也可以并行读(无论是根据条件还是时间段)。但缺点也很明显:首先是查询会变成一个矩阵,这样的设计容易触发随机读写,这无论在HDD还是SSD上都很难受(有兴趣的同学可以看后面的3.2小节)。 于是Prometheus又改进了一版存储。每一个Series一个文件,每个Series的数据在内存里存满1KB往下刷一次。 这样缓解了随机读写的问题,但也带来新的问题:
泊浮目
2024/01/09
2910
从头编写一个时序数据库
本文介绍如何去设计一个时序数据库,可以学习一下文章中提及的一些技术点。需要注意的是,本文编写的时间为2017年4月,因此文中需要改善的也是老版本的Prometheus存储存在的问题。
charlieroro
2021/09/26
5540
时序数据库influxdb简介
influxdb是一款开源的时序数据库,可以用作监控系统的数据存储或用来存储基于时序进行分析的业务系统的数据存储。
俊才
2020/05/04
2.8K0
SpringBoot整合InfluxDB:封装方法助力高效时序数据处理
在当今这个信息化飞速发展的时代,数据的增长速度和多样性呈现出爆炸性态势。面对如此庞杂的数据量,如何高效地存储、管理和分析这些数据成为了我们面临的关键问题。InfluxDB作为一种专为时序数据设计的开源数据库,以其卓越的性能和独特的特性,在众多数据库中脱颖而出,成为处理时间序列数据的理想选择。
Front_Yue
2024/10/15
7630
SpringBoot整合InfluxDB:封装方法助力高效时序数据处理
Prometheus TSDB分析
Prometheus是著名开源监控项目,其监控任务调度给具体的服务器,该服务器到目标上抓取监控数据,然后保存在本地的TSDB中。自定义强大的PromQL语言查询实时和历史时序数据,支持丰富的查询组合。 Prometheus 1.0版本的TSDB(V2存储引擎)基于LevelDB,并且使用了和Facebook Gorilla一样的压缩算法,能够将16个字节的数据点压缩到平均1.37个字节。 Prometheus 2.0版本引入了全新的V3存储引擎,提供了更高的写入和查询性能。本文主要分析该存储引擎设计思路。
星哥玩云
2022/07/13
1.1K0
InfluxDB 学习笔记,从概念优缺点,以及java落地
在Java项目中实现InfluxDB的落地应用,主要包括添加InfluxDB的Java客户端依赖、创建数据库连接、执行数据的增删改查操作等步骤。以下是一个详细的实战指南:
小马哥学JAVA
2024/09/24
5740
influxdb的命令们
influxdb的单机版是开源的,而集群版是商业版,influxdb被设计运行在SSD上,如果使用机器或者网络磁盘作为存储介质,会导致性能下降至少一个数量级。influxdb支持restful api,同时也支持https,为了保证安全性,非局域网建议使用https与Influxdb进行通信。
luoxn28
2020/02/17
1.8K0
influxdb的命令们
相关推荐
饿了么Influxdb实践之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档