InfluxDB原理与实战
上QQ阅读APP看书,第一时间看更新

1.2 InfluxDB的优势

存储和分析时序数据的时序型系统并不鲜见,自计算机问世以来,我们一直在数据库中存储时序数据。最初,使用通用存储系统存储时序数据,如MySQL。第一代时序平台,如KDB +、RRDtool、Graphite等,在20年前就推出了,主要用于存储和分析数据中心的时序数据,以及高频金融数据、股票波动率等。

根据DB-Engines等数据库趋势跟踪和行业分析网站发布的信息,时序型数据库是数据库市场中份额增长最快的部分。原因很明显,计算机虚拟世界,如数据库、网络、容器、系统、应用程序等,和物理世界,如家用设备、城市基础设施、工厂机器、电力设施等,正在创建海量的时序数据。现在更多的企业会通过时序存储和数据分析来获得预测能力和实时决策能力,从而为客户提供更好的使用体验。这意味着底层数据平台需要发展以应对新的工作负载的挑战,以及更多的数据点、数据源、监控维度、控制策略和精度更高的实时响应,对下一代时序中台提出了更高的要求,具体如下所示。

❑专为时序存储和高性能读写而设计:计算机虚拟世界的各种系统和应用,以及物理世界的IoT设备等都在创建海量的时序数据,每秒千万级的数据吞吐量是很常见的,而且这些数据还需要可以以非阻塞方式接收并且可压缩以节省有限的存储资源。

❑专为实时操作而设计:预测能力和实时决策能力,需要收到数据后,就能实时输出最新的数据分析结果,执行预定义的操作。

❑专为高可用性而设计:现代软件系统需要全天候可用,除了基本的集群能力,还需要根据需求自动扩容和缩容,支持柔性可用等。

InfluxData选择从头开始构建InfluxDB以支持下一代时序中台的需求,InfluxDB通过实现高度可扩展的数据接收和存储引擎,可以高效地实时收集、存储、查询、可视化显示和执行预定义操作。它通过连续查询提升查询效率和缩短延迟,通过数据保留策略,及时高效地删除过期冷数据,提升存储效率。

为什么通用数据库在时序场景上不是最优的选择呢?许多通用数据库正在为时序数据添加一些支持,虽然可能很容易使用,但它们基本上都不是针对海量时序数据的吞吐量和实时操作而设计的。与InfluxDB相比,通用数据库,如Cassandra、MongoDB、HBase等,需要开发人员投入大量的时间进行代码编写,以开发与InfluxDB类似的功能。具体来说,开发人员需要做如下工作:

❑编写代码实现跨集群数据分片功能、聚合运算和采样功能、数据生命周期管理功能等。

❑实现丰富的API接口。

❑编写用于数据采集的工具。

❑实现实时处理模块并编写用于监控和警报的代码。

❑编写可视化引擎以向用户显示时序数据。

为了让读者对InfluxDB的优势有个直观的认识,接下来,会把InfluxDB和其他被用作时序存储的系统(如ElasticSearch、MongoDB、OpenTSDB)做简要的对比:

(1)InfluxDB vs ElasticSearch

ElasticSearch是专为搜索而设计的系统,是实现搜索功能的绝佳选择。然而,对于时序数据,却并非如此。在处理时序数据时,InfluxDB的性能远远超过ElasticSearch系统,对于写入吞吐量,InfluxDB通常优于ElasticSearch 5~10倍,具体差值取决于架构。对于特定时序的查询速度,使用ElasticSearch比使用InfluxDB要慢5~100倍,具体差值取决于查询的时间范围。最后,如果需要存储原始数据以便稍后查询,则ElasticSearch上的硬盘占用比InfluxDB大10~15倍。如果先汇总数据再存储,ElasticSearch的硬盘占用比InfluxDB大3~4倍。综合来看,ElasticSearch非常适合进行搜索,但不适用于时序存储和实时分析。

(2)InfluxDB vs MongoDB

MongoDB是一个开源的、面向文档的数据库,俗称NoSQL数据库,用C和C ++语言编写。虽然它通常不被认为是真正的时序型数据库(TSDB),但它经常被用作时序存储系统。它以时间戳和分组的形式提供建模原语,使用户能够存储和查询时序数据。MongoDB旨在存储“无模式”数据,其中每个对象可能具有不同的结构。实际上,MongoDB通常用于存储内容大小可变的JSON或BSON对象。由于其采用通用性和无模式数据存储区设计,MongoDB无法利用时序数据的高度结构化特性。需要特别指出的是,时序数据由标签(键/值串对)和时间戳组成,这时必须对MongoDB做专门配置以支持时序数据,但这样做效率很低。相比MongoDB, InfluxDB的性能和成本优势明显,InfluxDB的写性能大约是MongoDB的2.4倍,存储效率大约是MongoDB的20倍,查询效率大约是MongoDB的5.7倍。综合来看,MongoDB非常适合文档和自定义对象,但不适用于大规模的时序数据和实时分析。

(3)InfluxDB vs OpenTSDB

OpenTSDB是一个可扩展的分布式时序型数据库,用Java语言编写,构建在HBase之上。它最初是由Benoît Sigoure于2010年开始编写的,并在LGPL下开源。OpenTSDB不是一个独立的时序型数据库,相反,它依赖HBase作为其数据存储层,因此OpenTSDB时序守护进程(OpenTSDB中的TSD用语)在实例之间没有共享状态可以高效地提供查询引擎的功能。OpenTSDB允许通过其API进行简单的聚合和数学运算,但没有完整的查询语言。OpenTSDB支持毫秒的分辨率,但随着亚毫秒级操作的普及,OpenTSDB有时会出现精度不足的问题。相比OpenTSDB, InfluxDB的性能和成本优势明显,InfluxDB的写性能大约是OpenTSDB的5倍,存储效率大约是OpenTSDB的16.5倍,查询效率大约是OpenTSDB的3.65倍。另外,OpenTSDB的设计初衷主要是用于生成仪表板图,不是为了满足任意查询,也不是为了存储数据。这些限制会影响它的使用方式。