得益于InfluxDB的设计理念,InfluxDB造就了如下特殊的核心特性。
InfluxDB原生操作模式分为两种:一种是用户可以通过命令行的方式访问Influx服务,对其操作较为方便;另一种就是InfluxDB内置的REST接口,用户可以启动Influx服务,并连接到InfluxDB服务器进而执行操作。
InfluxDB API的一大特性就是可编程性强,而且编程语言较为友好,开发者可以快速上手。InfluxDB提供了一系列HTTP API供开发者调用,使用HTTP响应代码、HTTP身份验证,并以JSON格式返回响应。
InfluxDB提供的各种语言的HTTP API接口的封装可具体参考:https://docs.influxdata.com/influxdb/v2.0/api/。
Tag标记是InfluxDB的一个独特概念,其作用一般是为了创建索引,提高查询性能,是InfluxDB数据结构中记录元数据的键值对,在InfluxDB数据结构中属于可选部分,但它们对于存储常用查询的元数据很有用。
Tag标记一般存放的是标识数据点来源的属性信息,以代码清单1-1为例,其中host、monitor_name就是标签键,host对应的值是127.0.0.1,monitor_name对应的值是test1。
InfluxDB的另一大优点是拥有类似SQL的查询语言——InfluxQL,这使得使用传统SQL开发的从业人员能够快速上手,InfluxQL语言经过仔细设计,目前已发展得较为成熟。
下面以SELECT语句举例,在特定条件下从指定表名中查询相关数据。InfluxQL语句遵循SQL SELECT语句的形式:
SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>
上述语句的参数解释如下:
● stuff:要查询的内容。
● measurement_name:表名,表示要从哪一张表中查询信息。
● some_conditions:条件约束,指定在该条件下查询内容。
InfluxQL还支持表达式的算术运算、正则表达式、SHOW语句、GROUP BY语句等,同时也支持SQL的大部分函数,如COUNT()、MIN()、MAX()等,有关InfluxDB函数的更多内容,读者可参考本书第5章。
时序数据库的一个重要特性就是高性能,这是支撑其处理大量数据的重要因素,决定了数据库在高写入高存储时的表现。InfluxDB在这方面表现得很优秀,在同类别的时序数据库中,InfluxDB的查询性能测试都领先于其他数据库数倍;在内置函数测试方面,其性能也是其他数据库的数倍。
要做到如此高性能,首先需要解决高写入吞吐量带来的问题,InfluxDB一开始选择了LevelDB作为存储引擎。然而,面对越来越多的时间序列数据的需求,InfluxDB遇到了一些无法克服的挑战。诸如LevelDB不支持热备份,对数据库进行安全备份需要关闭后才能复制;删除过期数据代价过高,等等。
后来InfluxDB采用自研的TSM(Time-Structured Merge Tree)作为存储引擎,其设计的核心思想就是牺牲部分功能来达到极致的性能。得益于自研的TSM存储引擎,InfluxDB有着极强的写入能力,它允许高吞吐量,压缩和实时查询同一数据。
数据库产品属于基础软件,与操作系统的发展有同样的路径,属于头部垄断,就像奥运会的获奖模式,只有金银铜牌才会被客户认同。
实力弱小、市场份额占有率有限的企业,以开源切入是一种主流的商业模式,在时序数据库排行前十名中只有Kdb+和Fauna闭源。以非关系型数据库MongoDB为例,它于2007年成立,以开源、深耕社区、产品易用性极致体验为切入点,2012年左右,就成为非关系型数据库的标杆产品。这些年的开源使其积累了大量的用户,于2013年推出自己的商业化版本,用更好的工具、服务进行商业变现,例如推出数据托管服务、付费技术支持。以开源为切入点的关键在于,客户相信原厂是最了解开源数据库的服务企业,虽然其他服务器也可以为开源软件服务,但是比起开源软件的维护者来说,还是落了下风。
InfluxDB开源也是其受众广泛的原因之一,截至目前,InfluxDB在GitHub上已经有了2万多的star,足以见得其拥有良好的生态。不过目前只有单机版的InfluxDB开源,InfluxDB开发商为了维持后续稳定的开发费用,对集群版做了闭源,实行收费使用,走商业路线。