随着物联网、车联网的高速发展,IT 基础设施规模的增大,数据的采集量越来越大,单机是没有办法解决问题的,底层数据库必须具有水平扩展能力。大部分开源的时序数据库都不是分布式的,换句话说,就是集群版不开源,包括 InfluxDB 集群功能也只能在企业版中使用。很多企业使用的是开源时序数据库的单机版,后续为了应对海量数据的处理,只好自己投入人力物力,在单机版的基础上,开发自己的 Proxy,对数据进行分片处理。对于数据写入,这种方法简单而且有效。但是对于查询,往往牵涉多个节点,那么 Proxy 就要做各种查询的聚合,因此开发的工作量很大。
有些公司为了避免麻烦,就选用 OpenTSDB,因为它把分布式版本也开源了。从使用的角度来看,OpenTSDB 底层的存储引擎用的是 HBase,安装维护极为复杂,存储压缩性能不够,查询效率也很低,不是一个优秀的产品。但它仍然有相当多的用户,这唯一的原因就是由于它支持分布式,可以水平线性扩展。
TDengine 的设计是基于单个硬件、软件系统不可靠,基于任何单台计算机都无法提供足够计算能力和存储能力处理海量数据的假设而进行设计的。因此 TDengine 从研发的第一天起,就是按照水平扩展、高可用架构进行设计的。通过对数据进行分区、分片,而且采用虚拟节点(vnode)技术,保证系统的处理能力是水平扩展的。如果要增加系统的处理能力,只需要增加新的节点即可。
更好的是,和 InfluxDB集群功能闭源不同,2020年8月,TDengine 团队将集群版开源了。
TDengine 是通过数据采集点以及时间两个维度,对大数据进行切分,实现水平扩展的。
分片:在 TDengine Database 的设计与实现里,一个集群有多个节点,每个节点可以有一个或多个虚拟节点(vnode),每个虚拟节点里存储了一定数量的数据采集点的数据,而一个数据采集点的数据永远只存放在一个 vnode 里。这样如果有很多数据采集点,这些数据采集点的数据将会分布在多个 vnode 上,分布在多个节点里。数据写入时,TDengine Database 的客户端将要写入的数据直接写入对应的 vnode,从而实现写入的水平扩展。对于单个数据采集点数据的查询,毫无疑问,是水平扩展的,节点越多,吞吐率就越大。对于聚合查询,查询请求将先发送到对应的 vnode 里,vnode 先做完聚合操作,客户端然后将来自多个 vnode 的查询结果做第二次聚合,因为 vnode 数量有限,这样在客户端做的聚合查询计算量不大,从而实现聚合查询的水平扩展能力。
分区:除将数据分片之外,TDengine 还将一个 vnode 里存储的时序数据按照时间段进行切分。每个时间段的数据都一定保存在一起,不同时间段的数据不会有交集,时间段可以是一天,几天,一周,由用户自己定义。按照时间段切分时序数据有很多好处,查询数据时,根据时间段,可以直接定位要查找的文件,从而加快查询速度。另外一方面,可以高效地实现数据保留策略。超过最长保留时间的数据,直接删除一个时间段对应的文件即可。而且按照时间段切分数据,还可以方便实现多级存储,冷热数据放在不同存储介质上,进一步降低存储成本。
TDengine 还通过虚拟节点组技术来提供系统的高可用。不同物理节点上的 vnode 可以形成一个虚拟节点组,这个虚拟节点组里的数据是通过 Master-Slave 来进行同步的,来保证这个虚拟节点组内数据的一致性。数据写入只能在 master 进行,但查询可以在 master 和 slave 上同时进行。如果 Master 出现故障,系统将自动选主,这样来保证系统的高可用,不会由于某台机器宕机,而无法对外提供服务。
关于集群的具体使用,请看《集群管理》。