精华内容
下载资源
问答
  • 分布式时序数据库
    千次阅读
    2020-12-05 10:31:47

    数据是工业物联网的血液。但是国内绝大部分的MES系统,以及所谓的智慧工厂,对生产过程中产生的海量的工艺数据,保存不会超过三个月,更不用说进一步对积累的数据研究利用了。数据的实时采集、计算和反控则对工业物联网背后的数据平台的实时计算能力提出了很高的要求。传统的关系型数据库,大部分开源的NoSQL,以及新一代的NewSQL离工业物联网数据平台的这两个苛求要求还有较远的距离。

    以DolphinDB Database 为代表的时序数据库应运而生,DolphinDB是完全自主研发的新一代的高性能分布式时序数据库,以一站式大数据方案、快速开发、性能优异、综合使用成本低著称。DolphinDB目前广泛应用于量化金融和工业物联网两大场景。

    用DolphinDB作为工业物联网数据后台时具有以下7大天然优势。

    1. 一站式数据解决方案

    工业物联网不仅要采集机器产生的工艺数据,还要进行实时计算和预警,并把结果展示给操作员或直接反馈给机器。同时需要将这些原始的工艺数据保存到数据库,供在线或离线查询。积累大量历史数据后,又可以进行更为复杂的大数据挖掘。而这一切都可以在DolphinDB一个系统内完成。下图展示了 DolphinDB database 的数据处理流程。

    对于系统集成商或企业来说,在一套系统上进行开发和维护,比起在多套系统上集成、开发和维护,无论是开发成本,维护成本,还是硬件的采购成本都会低得多。

    2. 轻量级跨平台部署

    工业物联网平台通常非常复杂。既有廉价的工控机(低配的PC或嵌入式系统),也有服务器或服务器集群。既有边缘计算,也有本地平台部署和云端平台部署。涉及的操作系统既有Linux,也有Windows。市场上不少开源或商用的时序数据库,以及相关的大数据生态,部件众多复杂,体积庞大,对软硬件的要求较高。使用一套系统进行跨平台部署,难度很大。

    DolphinDB是一个非常轻量级的系统,用GNU C++开发,系统大小仅20余兆,无任何依赖,可以部署在上述任何平台上。这大大节约了系统集成商的开发和维护成本。

    3. 安全可控

    工业物联网平台的数据及系统的安全可控对一个企业,乃至对国家都至关重要。DolphinDB是一个从零开始,完全自主研发的分布式时序数据库。从底层的分布式文件系统和存储引擎,到数据库和核心类库,到分布式计算引擎,到脚本语言,到各种编程语言的开发接口,甚至外围的开发集成环境GUI、集群管理工具都是百分百自主研发的,无任何外部依赖,安全可控。

    DolphinDB除了支持x86和arm的指令体系外,也在适配MIPS指令体系,以支持龙芯等国产CPU。这样在工业物联网平台上,可以实现软硬件同时自主可控。

    4. 海量历史数据存储和处理

    工业物联网数据采集的维度高,频率高,设备数量多,数据量特别大,且都是高时间精度数据。目前制造业使用的MES系统大部分采用关系型数据库,往往只能保存极短时间内的工艺数据,无法保留全量高精度数据。数据库系统的限制,导致企业无法发挥历史数据的价值。

    DolphinDB database 采用列式存储,支持数据压缩(压缩率在20%左右),最高支持纳秒精度的时间序列数据处理,单表支持百万级别分区。可以通过增加节点的方式水平扩展DolphinDB集群的存储能力和计算能力。DolphinDB集群支持多副本分布式存储和分布式事务,当一个副本的数据错误或丢失时,启用另一个副本恢复,保证数据的高可用和强一致。企业可以利用长年积累的历史数据进行深度数据挖掘和数据分析,如设备的预测性维护,工艺流程的改进,产品质量的提升,制造计划的优化等等。

    简单的说,在同样的硬件设备上,关系型数据库(Oracle,SQL Server)可以支持亿级的时序数据,DolphinDB可以支持万亿级的时序数据。

    5. 实时流计算

    物联网实时采集的数据,可以交给DolphinDB的流计算引擎清洗、实时统计、即时入库,并通过可视化的方式实时展示。DolphinDB天然具备流表对偶性,发布一条消息相当于往流数据表中增加一条数据,可以直接使用SQL注入和查询分析流数据,极为方便。DolphinDB的流计算引擎是基于发布-订阅-消费的模式。通过流数据表发布数据,其他数据节点或第三方应用通过DolphinDB脚本或 API来订阅消费流数据,把计算结果实时反馈给机器或操作员。流计算教程可以参考DolphinDB流数据教程DolphinDB流数据聚合引擎教程

    6. 丰富的计算功能

    DolphinDB的计算功能可以说是市场上的时序数据库中最丰富的。DolphinDB内置了脚本语言,可直接在数据库中进行复杂的计算和交互分析,避免了数据迁移。大部分计算功能和函数都经过优化,性能远远超过其他数据库中的相同功能。下面列举了DolphinDB中常用的计算功能。

    6.1 范围查询

    DolphinDB使用数据对(pair)的形式表示范围。例如,查询某个表某个时间范围内的数据:

    select * from table where date between beginDate:endDate

    6.2 多维查询

    DolphinDB可以针对不同列进行聚合,实现高维或低维的范围查询功能。例如,对field1,field2 列进行过滤并分组聚合:

    select sum(prc) from table where field1 in (1..100) and field2 = ‘A’ group by field1, field2

    6.3 抽样查询

    DolphinDB提供了以分区为单位的抽样查询机制,可以按照指定的比例或者数量对分区进行抽样,只需要在where后调用sample函数。例如,按设备ID进行范围分区,抽取10%分区中的数据和10个分区中的数据

    //抽样10%分区
    select * from trades where sample(equipmentId, 0.1)
    //抽样10个分区
    select * from trades where sample(equipmentId, 10)

    6.4 精度查询

    DolphinDB的时间精度达到纳秒,支持海量高精度历史数据存储,也支持把高精度大数据集聚合转换成低精度小数据集存储。同时,DolphinDB支持多种时间精度分组抽样。例如,选择某两个日期之间的数据,按分钟进行分组计算。

    select avg(tint) from t1 where date(timestamp) between 2018.01.01:2018.10.11 group by minute(timestamp) 

    DolphinDB也支持自定义精度分组。例如,每5秒一个分组:

    select avg(tint) from t1 where date(timestamp) between 2018.01.01:2018.10.11 group by bar(timestamp,5000)

    6.5 插值查询

    在工业领域经常会发生采集的数据缺失。DolphinDB在查询计算时提供了4种插值方式补全数据,向前/向后取非空值填充(bfill/ffill),线性填充(lfill)和指定值填充(nullFill)。用户也可以通过脚本或C++插件扩充新的插值函数。

    6.6 聚合查询

    DolphinDB的函数库非常丰富,支持以下聚合函数:atImax, atImin, avg, beta, contextCount, contextSum, contextSum2, count, corr, covar, derivative, difference, first, imax, last, lastNot, max, maxPositiveStreak, mean, med, min, mode, percentile, rank, stat, std,sum, sum2,var, wavg, wsum, zscore。

    6.7 面板数据分组查询

    处理面板数据时,有时候希望为每个分组的每一行数据生成一个值。DolphinDB提供了context by和滑动统计函数。

    DolphinDB支持以下滑动统计函数:deltas, mavg, mbeta, mcorr, mcount, mcovar, mimax, mimin, mmax, mmed, mmin, mpercentile, mrank, mstd, msum, mvar, ratios。

    例如,计算每台设备过去10个采集点的移动平均温度:

    select equipmentId, mavg(temperature,10) as mavg_temperature context by equipmentId

    DolphinDB对部分滑动统计函数进行了优化,每次计算时,充分利用上一个窗口的计算结果,最大程度地降低了重复计算。

    6.8 对比查询

    DolphinDB的pivot by可用于数据透视,特别是同一时间不同列的指标对比。例如,想要对比同一时间段不同设备的平均温度,可以使用以下代码:

    equipmentId = `A`B`B`B`C`C`A`A`A$symbol; 				
    temperature= 49.6 29.46 29.52 30.02 174.97 175.23 50.76 50.32 51.29;							
    timestamp = [09:34:07,09:35:42,09:36:51,09:36:59,09:35:47,09:36:26,09:34:16,09:35:26,09:36:12];	
    t = table(timestamp, equipmentId, temperature)
    select avg(temperature) from t pivot by timestamp.minute() as minute, equipmentId

    返回的结果为:

    minute	A	B	C
    09:34m	50.18		
    09:35m	50.32	29.46	174.97
    09:36m	51.29	29.77	175.23

    6.9 关联查询

    DolphinDB支持的关联查询种类非常多,包括等值连接、完全连接、交叉连接、左连接、asof join和窗口连接。其中asof join和窗口连接(window join)是专门为时间序列数据设计的连接方式,能够满足更多场景的需求。

    当两个表中的时间字段不完全对应时,可以使用asof join,如果左表中的时间为t,它会自动选择右表中不超过t的最近时间。窗口连接是asof join的扩展,如果窗口为w1:w2,它会在右表中选择(t+w1)到(t+w2)之间的数据,并对这些数据使用聚合函数。例如:

    select equipmentId,t1.temperature,t2.humidity from aj(t1,t2,`timestamp)
    
    select * from wj(t1,t2,-5:0,<avg(temperature)>,`equipmentId`timestamp)

    6.10 机器学习和分布式计算

    DolphinDB提供了map-reduce,iterative map-reduce等分布式计算框架。用户只需要指定数据源、map函数、reduce函数和final函数,无需编译、部署,可以直接在线使用。为方便用户,DolphinDB内置了常用的拟合和分类算法,可在本地数据源和分布式数据源上使用,这些算法包括线性回归、广义线性模型(GLM)、随机森林(Random Forest)、逻辑回归等。后续将会推出更多机器学习算法。

     

    除了已有的功能外,DolphinDB提供了几种途径扩展系统功能。DolphinDB内置强大的类SQL和Python的脚本语言。用户可以用脚本语言自定义函数来扩展系统功能。DolphinDB支持使用C++开发插件来扩展系统功能。除此以外,DolphinDB提供了C++、C#、Java、Python、R、JS、Excel等语言和系统的API,方便与其它系统集成。

    7. 综合使用成本低

    工业企业的利润率不高,如果数据平台成本(软硬件的采购成本,系统集成费用,维护费用,应用开发成本等)过高,会严重限制工业物联网的发展。DolphinDB一站式的解决方案、跨平台部署能力、强大的实时数据和海量历史数据处理能力、丰富的计算功能及扩展能力极大的降低了系统的综合拥有成本。

     

    欢迎访问官网下载 DolphinDB database

    咨询邮箱:media@dolphindb.com

    更多相关内容
  • 实现上,是基于开源单机时序数据库influxdb1.7开发的分布式版本,除了具有influxdb本身的特性之外,还有容量扩展、副本容错等集群功能。主要特点如下:为时间序列数据专门编写的高性能数据存储,兼顾写入性能和磁盘...
  • #DDJ 商店 要求 gcc 4.7.3 或更高版本 CUDA 5.5 安装 克隆 repo 或使用 Eclipse 导入它 安装所需的库。 ./install.sh 设置 CUDA 所需的变量。 将以下行添加到/etc/profile export PATH=/usr/local/cuda-5.5/bin:$...
  • LinDB 是一个开源时间序列数据库,提供高性能,高可用性和水平可扩展性。 LinDB 存储饿了吗公司的所有监控数据,每天有 88TB 增量写入和 2.7PB 总原始数据。 高性能 LinDB 采用了很多 TSDB 的最佳实践,并根据...

    LinDB 是一个开源时间序列数据库,提供高性能,高可用性和水平可扩展性。

    LinDB 存储饿了吗公司的所有监控数据,每天有 88TB 增量写入和 2.7PB 总原始数据。

    高性能

    LinDB 采用了很多 TSDB 的最佳实践,并根据时间序列数据的特征实现了一些优化。与为 InfluxDB 编写大量 Continuous-Query 不同,LinDB 在创建数据库后会自动支持特定时间间隔的汇总。此外,LinDB 对于分布式时间序列数据的并行查询和计算来说非常快。

    多活动 IDC

    LinDB 旨在在多活动 IDC 云架构下运行。 LinDB 的计算层(称为代理)支持高效的 Multi-IDC 聚合查询。

    高可用性

    LinDB 使用 ETCD 集群来确保元数据高度可用且安全存储。如果发生故障,WAL 的多通道复制协议将避免数据不一致的问题:

    1)。每个复制通道中只有一个人负责数据的权限,因此不会发生冲突;

    2)。数据可靠性得到保证:只要未在旧的领导者中复制的数据没有丢失,它就会被复制到其他复制,而旧的领导者再次在线;

    水平可扩展性

    LinDB 中基于标签的分片策略解决了热点问题,只需添加新的代理和存储节点即可实现水平扩展。

    指标的治理能力

    为了确保系统的健壮性,LinDB 不假设用户已经理解使用度量的最佳实践,因此,LinDB 提供了基于度量标准粒度和标记粒度来限制不友好用户的能力。

    LinDB 架构

    界面截图:

     

     

    下载链接:https://github.com/lindb/lindb

    转载于:https://my.oschina.net/rightemperor/blog/3093117

    展开全文
  • 后面,会结合具体代码分别介绍分布式时序数据库相关模块的具体设计和实现,包括节点配置和管理模块、WAL管理模块、Index管理模块、数据存储模块、Buffer管理模块、元数据管理模块及相关数据通信协议的设计。

    顺便说一下,最近工作稍微忙碌,但是也在致力于不断的优化和降低silverDB的存储。

    所以,

    1、对之前的存储结构会进行一定的修改和优化

    2、也发现了一些bug,就比如前几天的和influxdb的测试中,那个数据不能作为实际参考。因为,有很多重复数据,我的读数据文件分片逻辑有点问题。而我也没有去重,而influxdb去重了,所以其性能看起来很不错。

    3、也新增了一些新的数据压缩算法和数据编码。主要针对timestamp、flaot、bool、int类型。

    最后,我期望可以有同学可以和我一起来开发和完善silverDB,可以私信联系我,我们一起沟通详细开发计划。

    https://github.com/TaoHervor/silver (给个小星星,可以吗?)

    之前分别介绍过关于分布式时序数据涵盖的内容、背景及需求、功能框架、技术架构1(分布式架构设计),具体可以参考这个专栏。

    https://zhuanlan.zhihu.com/c_1256552728916017152

    这篇文章主要介绍分布式时序数据库读写流程及相关模块。

    如果说分布式时序数据库SilverDB-技术架构1,搭建好了一个分布式集群的环境,有了一个基本的“骨架”。那么,这里的读写流程、存储模块则是SilverDB的“血与肉”。

    SilverDB写数据流程

    首先来看一下,在这个P2P的对称网络分布式架构下的写流程。

    aa5110bf5fbd09af7928fe5946484233.png

    对于基于P2P对称网络模型的分布式时序数据库SilverDB来说,这里提供了client封装读写操作。具体流程说明如下:

    1、客户端会负责封装用户写数据请求,包括database、table、tags set、metric、timestamp,这里如果不熟悉时序数据库存储模型的,可以参考我的另外一篇介绍时序数据库-存储初始的文章,也是在以上专栏中。在这里基于TCP使用了自定义的写请求协议格式,并且基于protobuf对写数据请求进行了序列化。

    2、客户端通过请求负载均衡机制,会讲写请求发送给SilverDB集群中的任意节点,此处如上图所示,客户端将写请求发送到节点Node1。

    3、Node1接受客户端写请求,交给Handler写请求处理器进行处理,在这个处理器内部会进行反序列化操作,根据解析出来的database、table、tag set 生成seriesKey,这里主要是为了基于Hash一致性算法,进行数据的Hash分片,避免造成数据写热点问题。

    4、Node1根据Hash一致性算法计算seriesKey,获取该数据分片的节点List。如果该数据分片地址与Node1节点地址相同,则将数据写入本地节点。如果,该数据分片地址与Node1节点地址不同,则会初始化一个代理客户端,将数据分片写到代理节点。

    5、如上图所示,Node2节点接受到代理写请求,同样进行写请求的处理及解析,然后直接写到本地数据节点,写成功的之后,这里会根据Node2本地元数据信息,将database、table等元数据信息注册到SilverDB的元数据服务。同时,会返回写成功或者失败的响应信息给代理客户端。

    6、代理客户端接受到写响应之后,再将响应信息透传给节点的处理写请求响应的协程进行处理。注意:因为SilverDB是基于Golang开发,所以这里是协程的概念。通过异步通信的模式,将写请求的响应交个该节点处理写请求响应的协程。最终,返回给客户端。

    至此,分布式时序数据库SilverDB的写流程完成,在这里主要介绍整体分布式写流程,并没有涉及到数据在每个节点的写操作流程。但是,这部分内容会随着不断的该分布式时序数据库SilverDB技术专题的不断深入,会一步步向大家介绍。

    SilverDB读数据流程

    接下来,就具体介绍一下SilverDB的读数据流程。整个读数据流程其实是要比写流程要稍微复杂一点,具体如下图所示:

    6b2745b85e25518340b8bfb588d88513.png

    1、与写请求类似,客户端会封装用户的读请求数据,包括database、table、tags组合、metirc组合、时间范围这些比如的参数信息。同时也会初始化一个空的metric value map,用来存放符合条件的、查询出来的时序数据。

    2、如上图所示,Node1接受到客户端的读数据请求,然后交给Handle read请求处理器,负责进行读请求的处理和解析,根据解析出来的database、table信息,去访问Node1的内存元数据信息。

    3、如果待查询的数据在本地节点,则根据解析出来的查询条件查询Node1本地数据索引,根据索引信息,我们可以得到满足查询条件的时序数据key,进而可以找到满足固定时间范围的时序数据。

    4、如果待查询的数据不在本地节点,则会初始化配置代理客户端,代理客户端根据查询的元数据信息,将读请求发送到对应数据节点上进行处理。如上图所示,这里是Node2数据节点。

    5、Node2节点接受代理客户端的读数据请求,交给Handle read请求处理器,查找本地索引,根据查询的索引数据找到满足查询条件的时序数据Key,然后根据查询条件(时间范围),在本地进行数据查询。

    6、读代理客户端将符合条件的数据返回给节点Node1,Node1负责将查询结构进行merge合并,最终返回给读客户端。

    7、这里的查询响应,也是通过一个异步的响应处理协程,进行处理。这样可以增大每个SilverDB处理读请求和响应的吞吐,提升SilverDB的整体性能。

    注意:此处客户端写请求和读请求是类似,都是通过负载均衡机制,将请求发送给任意节点,因为我们的silverDB是P2P对称网络的分布式架构嘛。

    总结一下,分布式时序数据库SilverDB读写流程的设计思路就是这么多,更多细节的东西还需要具体的模块设计层面来介绍,现在对于整个SilverDB的读写流程应该有个逻辑上的认知了。那么具体来看看,对于SilverDB的每个数据节点的每个模块,是如何进行本地数据读写的呢?同样,我们还是用图来说明一下。

    数据写操作

    703101d3fe988edb7ea259d81083ac76.png

    如上图所示,这里面涉及到的Wal模块、Buffer模块、Index模块、元数据模块、数据存储模块在后面的专题文章中,都会一一介绍,这里主要看一下在数据进行具体写操作的时候,都做了那些事?

    1、当本地节点Node1进行具体数据写的时候,首先为了保证数据的可恢复性和写容错,这里将数据写到了WAL文件,在Wal文件中会为每次写操作分配一个sequenceId,记录本次写入的数据块。其中,WAL文件大小可配,如果WAL文件大小超过预阈值,则会顺序编号生成新的WAL文件。

    2、同时,时序数据会写入到buffer和index中。当buffer中的数据缓存的数据点达到一定阈值时,默认是5000。会批量刷写到数据文件。同时,在index管理中,会根据tags set的维度组合,生成tags 与 metric的倒排索引,并将生成的索引数据持久化到索引数据文件。

    3、重点,可以关注一下,在存储管理部分的数据文件。当buffer中的数据刷写到具体的数据文件的时候,SilverDB会根据时序数据点的时间属性,对数据进行时间范围的分区排列,并根据所设置的数据条数或者固定的数据块大小,进行数据切片。

    4、整个数据切片是根据时间维度进行切片,这里SilverDB会根据时序数据点时间特征进行数据的排序和压缩,并设置数据块头的数据存储结构。

    5、最终将进行时间切片的数据写到对应的数据文件,并且将对应的数据块头信息和数据块数据持久化到数据文件。

    6、这里为什么要进行时间范围数据切片,可以想一下。在分布式数据写入的时候,我们根据Hash一致性算法对数据进行了Hash分片,这样可以均衡写负载,避免造成写热点问题。但是,与此带来的问题就是数据太散列了,反而在进行时间范围查询的时候,影响查询性能。

    所以,在最终进行数据持久化的时候,SilverDB又对数据进行了时间范围的分片,即解决了Hash一致性算法带来的时间范围查询的性能问题,又解决了写热点问题。

    至此,对于SilverDB存储引擎底层的写数据流程有了一个基本的介绍和说明。接下来,再看一下SilverDB存储引擎底层的读数据流程。

    7、最终,这里还会根据写入的新的数据信息,更新本地元数据和远程的元数据服务信息。

    数据读操作

    81324719fbca7590f94472d1354fdec5.png

    对于读操作就比较简单了,因为写操作会涉及很多的数据更新。

    1、本地数据读,会根据查询的tag set(注意,此处tag set可以为空)和 metric 组合,查询本地维护的数据索引,根据内存索引数据查找出可以唯一表征一个数据点的tag set和metric。

    2、获取的tag set 和 metric信息,查询条件指定的database、table、时间范围信息,可以直接去获得在指定时间范围内的数据文件。

    3、扫描数据文件内容,查询满足条件的时间序列数据,并解码时序数据、解压时序数据,并返回查询结果。

    4、最终,根据分布式数据读流程,进行时序数据的合并,返回给客户端。

    总结

    对分布式时序数据库SilverDB的分布式读写流程、本地数据读写机制的设计思路和基本原理做了一个介绍。现在应该对其整个分布式读写设计的思路有了一个基本的了解。需要注意的是,对于时序数据库不了解的读者,请务必提前阅读以上专栏的文章。否则,一是无所理解上述相关名词及基本概念;二是无法充分理解时序数据库分布式架构设计及存储设计的精华。后面,会结合具体代码分别介绍分布式时序数据库相关模块的具体设计和实现,包括节点配置和管理模块、WAL管理模块、Index管理模块、数据存储模块、Buffer管理模块、元数据管理模块及相关数据通信协议的设计。

    展开全文
  • 随着云计算规模越来越大,以及物联网应用逐渐普及,在物联网(AIoT)以及运维监控(AIOps)领域,存在海量的时序数据需要存储管理。以华为云监控服务(Cloud Eye Service,CES)为例,单个Region需要监控7000多万...

    前言

    随着云计算规模越来越大,以及物联网应用逐渐普及,在物联网(AIoT)以及运维监控(AIOps)领域,存在海量的时序数据需要存储管理。以华为云监控服务(Cloud Eye Service,CES)为例,单个Region需要监控7000多万监控指标,每秒需要处理90万个上报的监控指标项,假设每个指标50个字节,一年的数据将达到PB级。另以地震监测系统为例,数万监测站点24小时不间断采集数据,平均每天要处理的指标数据达到TB级,一年的数据同样达到PB级,并且数据需要永久存储。传统的关系型数据库很难支撑这么大的数据量和写入压力,Hadoop等大数据解决方案以及现有的开源时序数据库也面临非常大的挑战。对时序数据实时交互、存储和分析的需求,将推动时序数据库在架构、性能和数据压缩等方面不断进行创新和优化。

    GaussDB(for Influx)时序数据库依靠华为在数据存储领域多年的实践经验,整合华为云的计算、存储、服务保障和安全等方面的能力,大胆在架构、性能和数据压缩等方面进行了技术创新,达到了较好的效果,对内支撑了华为云基础设施服务,对外以服务的形式开放,帮助上云企业解决相关业务问题。

    云原生存储与计算分离架构

    在这里插入图片描述
    GaussDB(for Influx)接口完全兼容InfluxDB,写入接口兼容OpenTSDB、Prometheus和Graphite。从架构上看,一个时序数据库集群可以分为三大组件。它们分别是:

    Shard节点:节点采用无状态设计,主要负责数据的写入和查询。在节点内,除了分片和时间线管理之外,还支持数据预聚合、数据降采样和TAG分组查询等专为时序场景而优化的功能。

    Config集群:存储和管理集群元数据,采用三节点的复制集模式,保证元数据的高可靠性。

    分布式存储系统:集中存储持久化的数据和日志,数据采用三副本方式存放,对上层应用透明。存储系统为华为自研,经过多年产品实践检验,系统的高可用和高可靠性都得到了验证。
    在这里插入图片描述
    相比InfluxDB等开源时序数据库,采用存储与计算分离的云原生数据库设计具备以下优势:

    容忍N-1节点故障,更高可用。存储与计算分离,可以复用成熟的分布式存储系统,提供系统的极致可靠性。时序数据通常会持续高性能写入,同时还有大量的查询业务,任何系统故障导致业务中断甚至数据丢失都会造成严重的业务影响,而利用经过验证的成熟的分布式存储系统,能够显著的提升系统可靠性,降低数据丢失风险。

    分钟级计算节点扩容,秒级存储扩容。解除在传统Shared Nothing架构下,数据和节点物理绑定的约束,数据只是逻辑上归宿于某个节点,使的计算节点无状态化。这样在扩容计算节点时,可以避免在计算节点间迁移大量数据,只需要逻辑上将部分数据从一个节点移交给另一个节点即可,可以将集群扩容的耗时从以天为单位缩短为分钟级别。

    消除多副本冗余,降低存储成本。通过将多副本复制从计算节点卸载到分布式存储节点,可以避免用户以Cloud Hosting形态在云上自建数据库时,分布式数据库和分布式存储分别做3副本复制导致总共9副本的冗余问题,能够显著降低存储成本。
    在这里插入图片描述GaussDB(for Influx)采用云原生存储与计算分离架构,具有支持亿级时间线、极致写入性能、低存储成本、高性能多维聚合查询和极致弹性扩缩容等5大特性。

    支持亿级时间线

    在这里插入图片描述在时序数据库系统中,存在大量并发查询和写入操作,合理控制内存的使用量显得十分重要。开源时序数据库VictoriaMetrics和InfluxDB在写入数据的时间线增加到千万级别时,进程会因内存耗尽而OOM退出。为了避免写入海量时间线数据导致内存资源被耗尽,GaussDB(for Influx)做了如下优化:

    • 在内存分配上,大量使用内存池复用技术,减少临时对象内存申请,降低内存碎片。
    • 在内存回收上,实现算法根据内存负载,动态调整GC频率,加快内存空间回收。
    • 在单查询上,实行Quota控制,避免单查询耗尽内存。
    • 在缓存使用上,针对不同节点规格提供不同的最优配置。

    经过改进,在海量时间线下,系统写入性能保持稳定,大幅超出InfluxDB开源实现。对于涉及海量时间线的聚合查询,如高散列聚合查询,查询性能提升更为显著。

    极致写入性能:支持每天万亿条数据写入

    在这里插入图片描述
    相比单机模式,集群模式可以将写入负载分散到集群中各个计算节点上,从而支持更大规模的数据写入。GaussDB(for Influx)支持每天万亿条数据写入,在工程实现上进行了以下优化:

    首先,时序数据按照时间线做Hash Partition,利用所有节点并行写入,充分发挥集群优势。

    其次,Shard节点采用针对写场景优化的LSM-Tree布局,写WAL后确保日志持久化,再写入内存Buffer即可返回。

    最后,数据库多副本复制卸载到分布式存储,降低计算节点到存储节点的网络流量。

    在大规模写入场景下,GaussDB(for influx)的写入性能线性扩展度大于80%。

    低存储成本:只需1/20的存储成本

    在时序数据库面对的AIOps运维监控和AIoT物联网两个典型应用场景中,每天会产生数GB甚至数TB的时序数据。如果无法对这些时序数据进行很好的管理和压缩,那将会给企业带来非常高的成本压力。

    GaussDB(for Influx)对数据采用列式存储,相同类型的数据被集中存储,更有利于数据压缩。采用自研的时序数据自适应压缩算法,在压缩前对数据进行抽样分析,根据数据量、数据分布以及数据类型选择最合适的数据压缩算法。在压缩算法上,相比原生的InfluxDB,重点针对Float、String、Timestamp这三种数据类型进行了优化和改进。

    Float数据类型: 对Gorilla压缩算法进行了优化,将可以无损转换的数值转为整数,再根据数据特点,选择最合适的数据压缩算法。

    String数据类型:采用了压缩效率更好的ZSTD压缩算法,并根据待压缩数据的Length使用不同Level的编码方法。

    Timestamp数据类型:采用差量压缩方法,最后还针对数据文件内的Timestamp进行相似性压缩,进一步降低时序数据存储成本。

    下图是分别采用实际业务场景的事件日志数据(数据集1)和云服务器监控指标数据 (数据集2)与InfluxDB进行了数据压缩效率的性能对比。
    在这里插入图片描述节约存储成本并非只有数据压缩一种办法。针对时序数据越旧的数据被访问的概率越低的特点,GaussDB(for Influx)提供了时序数据的分级存储,支持用户自定义冷热数据,实现数据的冷热分离。热数据相对数据量小,访问频繁,被存储在性能更好、成本较高的存储介质上;冷数据相对数据量大,访问概率低,保存时间较久,被存储在成本较低的存储介质上,进而达到节约存储成本的目的。根据实际业务数据测算,相同数据量下存储成本仅有关系型数据库的1/20。

    高性能多维聚合查询

    多维聚合是时序数据库中较为常见,且会定期重复执行的一种查询,例如AIOps运维监控场景中查询CPU、内存在指定时间范围内的平均值。

    SELECT mean(usage_cpu), mean(usage_mem)
    FROM cpu_info 
    WHERE time >= '2020-11-01T06:05:27Z' and time < '2020-11-01T18:05:27Z' 
    GROUP BY time(1h), hostname
    

    在这里插入图片描述
    在提升聚合查询整体性能方面,GaussDB(for Influx) 做了如下优化:

    • 采用MPP架构:一条查询语句可以在多节点及多核并发执行。
    • 向量化查询引擎:在查询结果数据量很大时,传统的火山模型每次迭代返回一条数据,存在过多的开销导致性能瓶颈。GaussDB(for
      Influx)内部实现了向量化查询引擎,每次迭代批量返回数据,大大减少了额外开销。
    • 增量聚合引擎:基于滑动窗口的聚合查询,大部分从聚合结果缓存中直接命中,仅需要聚合增量数据部分即可。
    • 多维倒排索引:支持多维多条件组合查询,避免大量Scan数据。
    • 存储摘要索引,加快数据查询中过滤无关数据。
      在这里插入图片描述
      相同节点规格,GaussDB(for Influx)的聚合查询性能是InfluxDB Enterprise的10倍,是Timescale的2到5倍。

    分钟级弹性扩缩容

    在这里插入图片描述
    在时序数据库的运行过程中,随着业务量的增加,常常需要对数据库进行在线扩容,以满足业务的要求。传统数据库中的数据存储在本地,扩容后往往需要迁移数据。当数据量达到一定规模时,数据迁移所耗费的时间往往按天计算,给运维带来了很大的困难。

    如上图所示,每个Database逻辑上由多个Partition组成,每个Partition独立存储,且都可自描述。所有Partition数据都存储在分布式共享存储上,数据库Shard节点和数据没有物理绑定关系。扩容时首先offload源节点Partition,再在目标节点assign即可。

    总结

    时序数据应该存储在专门为时序数据进行优化的时序数据库系统中。华为云某业务从Cassandra切换到GaussDB(for Influx)后,计算节点从总共39个(热集群18个,冷集群9个,大数据分析集群 12个)降低到了9个节点,缩减4倍计算节点。存储空间消耗从每天1TB降低到100GB以内,缩减10倍存储空间消耗。

    GaussDB(for Influx)提供了独特的数据存储管理解决方案,云原生的存储与计算架构,可根据业务变化快速扩容缩容;高效的数据压缩能力和数据冷热分离设计,可大幅降低数据存储成本;高吞吐的集群,可满足大规模运维监控和物联网场景海量数据写入和查询性能要求。

    展开全文
  • 饿了么《分布式时序数据库 - LinDB》

    千次阅读 2018-04-25 00:00:00
    背景饿了么对时序数据库的需求主要来自各监控系统,主要用于存储监控指标。原来使用graphite,后来慢慢有对指标有多维的需求(主要体现在对一个指标加多个Tag, 来组成S...
  • InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。 它有三大特性: 1. Time Series (时间序列):你可以使用与时间有关的相关...
  • 本文分享自华为云社区《华为自研PB级分布式时序数据库揭秘第一期:初识GaussDB(for Influx)》,原文作者:栖迟於一丘。 前言 随着云计算规模越来越大,以及物联网应用逐渐普及,在物联网(AIoT)以及运维监控...
  • DolphinDB是由浙江智臾科技有限公司自主研发,于2018年初发布的高性能的磁盘与内存混合型和列式分布式数据库产品。DolphinDB集成了功能强大的编程语言和高容量高速度的流数据分析系统,为海量数据(特别是时间序列...
  • DolphinDB提供了两种导入MySQL数据的方法:ODBC插件和MySQL插件。我们推荐使用MySQL插件导入MySQL数据,因为它的速度比ODBC导入更快,导入6.5G数据,MySQL插件的速度是ODBC插件的4倍,并且使用MySQL插件无需任何配置...
  • 传统工业实时历史数据库与时序数据库的区别? 本文介绍了实时数据库和时序数据库,并就其特点、应用场景、相关厂商、联系与区别做介绍。 实时历史数据库 ![实时历史数据库架构.png]...
  • 背景介绍: 作为一名 Infra,管理平台的各种基础组建以及基本的服务质量是必修的功课,而如何对复杂和繁多的基础平台,甚至包括上面运行的 Ops 系统、业务系统,其...因此,一个性能足够的,分布式的,用户友好且...
  • 到了 4 月基于 PostgreSQL 打造的时序数据库 TimeScaleDB 也开源了,而早在 2016 年 7 月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品 TSDB,成为支持其发展制造,交通,能源,智慧城市...
  • 时序数据库简介 时间序列数据最简单的定义就是数据格式里包含timestamp字段的数据。比如股票市场的价格,环境中的温度,主机的CPU使用率等。几乎所有的数据都可以打上一个timestamp字段。时间序列数据更重要的...
  • 最近某位数据库业界大佬私聊,提出一个问题值得思考,所以才有了这篇文字这位大佬有这样一句原话,从这句话可以看出这位大佬对国产数据库产品以及产品定位的考量.我作为一个nobady, 也想...
  • 作为物联网领域数据存储的首选时序数据库也越来越多进入人们的视野,早在2016年7月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品TSDB。上一周我们发过时序数据库的存储篇:百度无人车和...
  • 作为物联网领域数据存储的首选,时序数据库也越来越多进入人们的视野,而早在2016年7月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品TSDB,成为支持其发展制造,交通,能源,智慧城市等...
  • 时序数据库评测,时序数据库选型,松果时序数据库

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,183
精华内容 7,673
关键字:

分布式时序数据库

友情链接: 交通灯.zip