TDengine 的设计是基于单个硬件、软件系统不可靠,基于任何单台计算机都无法提供足够计算能力和存储能力处理海量数据的假设而进行设计的。因此 TDengine 从研发的第一天起,就是按照水平扩展、高可用架构进行设计的分布式时序数据库。通过对数据进行分区、分片,而且采用虚拟节点(vnode)技术,保证系统的处理能力是水平扩展的。如果要增加系统的处理能力,只需要增加新的节点即可。
更好的是,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 出现故障,系统将自动选主,这样来保证系统的高可用,不会由于某台机器宕机,而无法对外提供服务。
关于集群更多的详细设计介绍,请看《TDengine 整体架构设计》。
关于集群的具体使用,请看《TDengine 集群安装、管理》。
关于更多开源的介绍,请看《开源的时序数据库》。