TDengine白皮书版权申明本文档北京涛思数据科技有限公司版权所有,任何形式或任何媒体的复制和拷贝都必须得到北京涛思数据科技有限公司的书面同意.
TDengine白皮书第2页北京涛思数据科技有限公司版权所有1数据时代的挑战随着移动互联网的普及,数据通讯成本的急剧下降,以及各种低成本的传感技术和智能设备的出现,除传统的手机、计算机在实时采集数据之外,从手环、共享自行车、出租车、智能电表、环境监测设备到电梯、大型设备、工业生产线等都在源源不断的产生海量的实时数据发往云端.
这些海量数据是企业宝贵的财富,能够帮助企业实时监控业务或设备的运行情况,生成各种维度的报表,而且通过大数据分析和机器学习,对业务进行预测和预警,帮助企业进行科学决策、节约成本并创造新的价值.
仔细研究发现,所有机器、设备、传感器、以及交易系统所产生的数据都是时序的,而且很多还带有位置信息.
这些数据具有明显的特征,1:数据是时序的,一定带有时间戳;2:数据是结构化的;3:数据极少有更新或删除操作;4:无需传统数据库的事务处理;5:相对互联网应用,写多读少;6:用户关注的是一段时间的趋势,而不是某一特点时间点的值;7:数据是有保留期限的;8:数据的查询分析一定是基于时间段和地理区域的;9:除存储查询外,还往往需要各种统计和实时计算操作;10:数据量巨大,一天采集的数据就可以超过100亿条.
看似简单的事情,但由于数据记录条数巨大,导致数据的实时写入成为瓶颈,查询分析极为缓慢,成为新的技术挑战.
传统的关系型数据库或NoSQL数据库以及流式计算引擎由于没有充分利用这些数据的特点,性能提升极为有限,只能依靠集群技术,投入更多的计算资源和存储资源来处理,企业运营维护成本急剧上升.
2TDengine特点TDengine正是涛思数据面对这一高速增长的物联网大数据市场和技术挑战推出的创新性的大数据处理产品,它不依赖任何第三方软件,也不是优化或包装了一个开源的数据库或流式计算产品,而是在吸取众多传统关系型数据库、NoSQL数据库、流式计算引擎、消息队列等软件的优点之后自主开发的产品,在时序空间大数据处理上,有着自己独到的优势.
TDengine白皮书第3页北京涛思数据科技有限公司版权所有10倍以上的性能提升:定义了创新的数据存储结构,单核每秒就能处理至少2万次请求,插入数百万个数据点,读出一千万以上数据点,比现有通用数据库快了十倍以上.
硬件或云服务成本降至1/5:由于超强性能,计算资源不到通用大数据方案的1/5;通过列式存储和先进的压缩算法,存储空间不到通用数据库的1/10全栈时序数据处理引擎:将数据库、消息队列、缓存、流式计算等功能融合一起,应用无需再集成Kafka/Redis/HBase/Spark/HDFS等软件,大幅降低应用开发和维护的复杂度成本.
强大的分析功能:无论是十年前还是一秒钟前的数据,指定时间范围即可查询.
数据可在时间轴上或多个设备上进行聚合.
临时查询可通过Shell,Python,R,Matlab随时进行.
与第三方工具无缝连接:不用一行代码,即可与Telegraf,Grafana,EMQ,Prometheus,Matlab,R等集成.
后续将支持OPC,Hadoop,Spark等,BI工具也将无缝连接.
零运维成本、零学习成本:安装、集群一秒搞定,无需分库分表,实时备份.
标准SQL,支持JDBC,RESTful,支持Python/Java/C/C++/Go,与MySQL相似,零学习成本.
采用TDengine,可将典型的物联网、车联网、工业互联网大数据平台的整体成本降至现有的1/5.
同样的硬件资源,TDengine能将系统处理能力和容量增加五倍以上.
但需要指出的是,因充分利用了物联网时序数据的特点,无法用来处理网络爬虫、微博、微信、电商、ERP、CRM等通用型数据.
3数据模型TDengine采用的仍然是传统的关系型数据库的模型.
用户需要根据应用场景,创建一到多个库,然后在每个库里创建多张表,但有两个显著不同.
一个数据采集点一张表:为充分利用时序数据的特点,TDengine要求对每个数据采集点单独建表,用来存储这个采集点所采集的时序数据.
这种设计有几大优点,1:能保证一个采集点的数据在存储介质上是一块一块连续的.
如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度;2:由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入TDengine白皮书第4页北京涛思数据科技有限公司版权所有者,这样就可采用无锁方式来写,写入速度就能大幅提升;3:对于一个数据采集点而言,其产生的数据是时序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度.
采用一个采集点一张表的方式,能最大程度的保证单个数据采集点的插入和查询的性能是最优的.
超级表:由于一个数据采集点一张表,导致表的数量巨大,难以管理,而且应用经常需要做采集点之间的聚合操作,聚合的操作也变得复杂起来.
为解决这个问题,TDengine引入超级表(SuperTable,简称为STable)的概念.
超级表是指某一特定类型的数据采集点的集合.
同一类型的数据采集点,其表的结构是完全一样的,但每个表(采集点)的静态属性(标签)是不一样的.
在TDengine的设计里,表用来代表一个具体的数据采集点,超级表用来代表一组相同类型的数据采集点.
当为某个具体数据采集点创建表时,用户使用超级表的定义做模板,同时指定该具体采集点(表)的标签值.
与传统的关系型数据库相比,表(一个数据采集点)是带有静态标签的.
4TDengine存储结构在内存里,为减小内存开销,有效的处理时间乱序问题,TDengine采用行式存储,使用SkipList建立索引,而且内存按照FirstInFirstOut的方式进行管理.
但在持久化存储上,为充分利用时序数据特点,TDengine采用列式存储,而且每个表的数据是一块一块连续存储的,以最大程度的提高压缩率和数据读取速度,并且每个数据块都有预计算,进一步提高数据分析速度.
TDengine白皮书第5页北京涛思数据科技有限公司版权所有数据具体写如流程如图所示:写入数据时,先将数据点写进WAL日志,然后转发给其他副本.
当内存的剩余空间达到一定临界值时,内存数据将写入硬盘.
内存的管理完全采取先进先出的队列方式进行管理,这样保证最新采集的数据在内存里.
数据写入硬盘是以添加日志的方式进行的,以大幅提高落盘的速度.
为避免合并操作,每个采集点(表)的数据也是按块存储,在一个块内,数据点是按列连续存放的,但块与块之间可以不是连续的.
TDengine对每张表会维护一索引,保存每个数据块在文件中的偏移量,起始时间、数据点数、压缩算法等信息.
数据分区:每个数据文件仅仅保存固定一段时间的数据(比如一周,可配置),因此一个表的数据会分布在多个数据文件中.
查询时,根据给定的时间段,TDengine将计算出查找的数据会在哪个数据文件,然后读取.
这样大幅减少了硬盘操作次数.
多个数据文件的设计还有利于同步、恢复、自动删除操作,更有利于数据按照新旧程度在不同物理介质上存储,比如最新的数据存放在SSD盘上,最老的数据存放在大容量但慢速的硬盘上.
通过这样的设计,TDengine将硬盘的随机读取几乎降为零,从而大幅提升写入和查询效率,让TDengine在很廉价的存储设备上也有超强的性能.
TDengine里,一个表的数据虽然会按时间段分区,但不会跨节点存储,以便于单张表的快速高效的插入、查询和计算.
一张表(一个采集点)的数据,即使每秒产生一百个字节的数据量,一年也才3G的数据量,压缩后,往往还不到300M,因此这样的处理不会带来问题.
TDengine白皮书第6页北京涛思数据科技有限公司版权所有5TDengine分布式结构TDengine是基于硬件、软件系统不可靠、一定会有故障的假设进行设计的,是基于任何单台计算机都无足够能力处理海量数据的假设进行设计的,因此TDengine从研发的第一天起,就是按照分布式高可靠架构进行设计的,是完全去中心化的.
TDengine整个系统结构如图所示,下面对一些基本概念进行介绍.
数据节点:dnode是TDengine服务器侧执行代码taosd在一台物理机、虚拟机或容器上的一个运行实例,一个工作的系统必须有至少一个数据节点.
dnode包含零到多个逻辑的虚拟节点(vnode),零或者至多一个逻辑的管理节点(mnode).
虚拟数据节点:存储具体的时序数据,所有针对时序数据的插入和查询操作,都在虚拟数据节点上进行(图例中用V标明).
位于不同物理机器上的虚拟数据节点可以组成一个虚拟数据节点组(如图例中dnode0中的V2,dnode3中的V2,dnode4中的V2组成了一个组),虚拟节点组里的虚拟节点的数据以异步复制的方式进行实时同步,并实现数据的最终一致性,以保证一份数据在多台物理机器上有拷贝,而且即使一台物理机器宕机,总有位于其他物理机器上的虚拟节点能处理数据请求,从而保证系统运行的高可靠性.
TDengine白皮书第7页北京涛思数据科技有限公司版权所有虚拟管理节点:负责所有节点运行状态的采集、节点的负载均衡,以及所有MetaData的管理,包括用户、数据库、表的管理(图例中用M标明).
当应用需要插入或查询一张表时,如果不知道这张表位于哪个数据节点,应用会连接管理节点来获取该信息.
MetaData的管理也需要有高可靠的保证,系统采用Master-Slave的机制,容许多到5个虚拟管理节点组成一个虚拟管理节点集群(如图例中的M0,M1,M2).
这个虚拟管理节点集群的创建是完全自动的,无需任何人工干预,应用也无需知道虚拟管理节点具体在哪台物理机器上运行.
TAOSC:taosc是TDengine给应用提供的驱动程序(driver),负责处理应用与集群的接口交互,内嵌于JDBC、或者C、Python、Go语言连接库里.
应用都是通过taosc,而不是直接连接集群中的数据节点与整个集群进行交互的.
这个模块负责获取并缓存元数据;将插入、查询等请求转发到正确的数据节点;在把结果返回给应用时,还需要负责最后一级的聚合、排序、过滤等操作.
6数据分片、水平扩展为处理每日高达数亿条的海量数据,数据必须在多个节点存放,TDengine采用了虚拟数据节点的设计对数据进行分片.
一个虚拟数据节点包含多个表,表的数量可以配置.
根据其计算和存储资源,一个数据节点将被划分为多个虚拟数据节点.
虚拟数据节点的设计带来几大优势,1)更好的支持硬件异构环境,资源多的服务器可以创建更多的虚拟节点;2)恢复一个宕机的节点,可以让众多的其他节点参与进来,大大加快速度;3)如果撤掉一个数据节点,该节点上的虚拟节点将被相当均匀的迁移到其他节点上去;4)新增一个数据节点,负载过热的节点的上的部分虚拟节点将被整体迁移过来.
这一切让负载更加均衡,让数据同步变得更加高效.
与传统的数据库相似,用户可以创建多个数据库,每个库里面,可以创建多个表.
一个库可以横跨多个虚拟数据节点,但一个虚拟数据节点仅仅属于一个数据库.
当用户添加一个表时,管理节点将根据当时的资源情况、每个节点的负载情况,决定是否在现有的虚拟数据节点里创建,还是需要新建一个虚拟数据节点.
管理节点负责整个系统的负载均衡,虚拟数据节点的增加、删除、迁移、合并与拆分.
管理节点并不保存每个采集点采集的数据,只是管理虚拟节点,而且即使宕机,也不会影响现有各虚拟节点的数据插入和查询操作.
各个采集点或应用从管理节点获TDengine白皮书第8页北京涛思数据科技有限公司版权所有取分配的虚拟数据节点信息后,然后直接与虚拟数据节点通讯,直接将数据插入数据库,对于查询操作也是如此.
因此,系统容量以及吞吐率与虚拟数据节点的个数成正比,整个系统是水平扩展的7高可靠系统为保证数据节点的高可靠性,TDengine引入了虚拟数据节点组的概念.
一个虚拟节点组由处于不同物理主机上的虚拟数据节点组成,虚拟数据节点个数就是数据冗余的个数(ReplicationFactor,一般大于2).
在一个虚拟节点组里,各个虚拟数据节点通过心跳包实时知道对方的状态.
如果一个虚拟数据节点收到数据写入的请求,该请求会被立即转发给其他虚拟数据节点,然后在本地存储处理.
当应用连接TDengine系统时,对于要操作的任何一张表,系统会给应用提供该表所属的虚拟数据节点组里各个虚拟节点的IP地址(如果replicationfactor为3,就会有3个IP地址),如果链接其中一个失败或者操作失败,应用会尝试第二个、第三个,只有所有节点失败才会返回失败.
这样保证虚拟数据节点组里任何一台机器宕机,都不会影响对外的服务.
这些复杂的重新连接流程都被TDengineDriver包装隐藏起来,应用开发者无需写程序来实现.
为保证效率,TDengine采取Master-Slave异步复制的方式实现多个副本之间的实时数据同步,采取的是最终一致性,而不是强一致.
当一台主机重启时,每个虚拟数据节点都会检查自己数据的版本是否与其他虚拟节点一致,如果版本不一致,需要同步后才能进入对外服务状态.
在运行过程中,由于各种原因,数据仍然可以失去同步,这种不同步会在收到转发的写入请求时被发现,一旦被发现,版本低的虚拟数据节点TDengine白皮书第9页北京涛思数据科技有限公司版权所有将马上停止对外服务,进入同步流程,同步完后,才会重新恢复对外服务.
同步过程中,高版本的节点还可以正常的对外提供服务.
管理节点负责存储Meta数据,同时根据每个数据节点状态来负责负载均衡,因此也要保证其高可靠性.
多个虚拟管理节点组成一个虚拟管理节点组,因为Meta数据需要强一致,TDengine采用的是Master-Slave同步复制的模式实现虚拟管理节点的数据同步.
写的操作,只有Slave节点写入成功后,Master节点才会返回成功,从而保证数据的强一致性.
如果Master节点宕机,系统有机制保证其中一个Slave会立即被选举为Master,从而保证系统写操作的高可靠性.
由于Meta数据量并不大,Meta数据虽然需持久化存储,但将其完全保存在内存,以保证查询操作的高效.
在应用侧,为避免每次数据操作都访问管理节点,TAOSC将必要的Meta数据都会缓存在本地,只有当需要的Meta数据不存在或失效的情况下,才会访问管理节点,这样大大提高系统性能.
管理节点在集群中存在,但对于应用和系统管理员而言,是完全透明的.
整个系统会自动在物理节点上创建虚拟管理节点以及虚拟管理节点组.
8高效的多表聚合TDengine对每个数据采集点单独建表,但应用经常需要对数据点之间进行聚合.
为高效的进行聚合操作,TDengine引入超级表(STable)的概念.
超级表用来代表一特定类型的数据采集点,它是表的集合,包含多张表,而且这集合里每张表的Schema是一样的.
同一类型的采集设备需要创建一个STable.
与表一样,包含Schema,但还包含静态标签信息.
Schema定义了表的每列数据的属性,如温度、压力等,而标签信息是静态的,属于MetaData,如采集点的型号、位置等.
TDengine扩展了标准SQL的table的定义,创建时,除指定Schema外,还可以带关键词tags来指定有哪些标签.
如:createtablem1(tstimestamp,pressureint,rpmint)tags(modelbinary(8),colorbinary(8))上述SQL创建了一个STablem1,带有标签model和标签color.
为某一个具体的采集点创建表时,可以指定其所属的STable以及标签的值,比如:TDengine白皮书第10页北京涛思数据科技有限公司版权所有createtablet1usingm1tags('apple','red')上述SQL以STablem1为模板,创建了一张表t1,这张表的Schema就是m1的Schema,但标签id设为apple,标签color设为red.
插入数据时,仍然按照正常的方式进行插入.
但查询时,除传统的表的查询外,还可以基于标签对STable进行各种聚合查询或统计.
如:selectavg(pressure)fromm1wheremodel='apple'interval(5m)groupbycolor上面这个SQL语句表示将标签model值为apple的所有采集点的记录的每5分钟的平均值计算出来,并按照标签color进行分组.
对于STable的查询操作,完全与普通的表一样.
但一个定义的STable可以包含多张表(多个数据采集点),应用可通过指定标签的过滤条件,对一个STable下的全部或部分表进行聚合或统计操作,这样大大简化应用的开发.
其具体流程如下图所示:1:应用将一个查询条件发往系统;2:taosc将超级表的名字发往MetaNode(管理节点);3:管理节点将超级表所拥有的vnode列表发回taosc;4:taosc将计算的请求连同标签过滤条件发往这些vnode对应的多个数据节点;5:每个vnode先在内存里查找出自己节点里符合标签过滤条件的表的集合,然后扫描存储的时序数据,完成相应的聚合计算,将结果返回给taosc;6:taosc将多个数据节点返回的结果做最后的聚合,将其返回给应用.
TDengine白皮书第11页北京涛思数据科技有限公司版权所有9实时流式计算在存储的原始数据上,TDengine可以做各种计算,目前支持的主要操作包括:Avg:以每个采样时间范围内的value的平均值作为结果Dev:以每个采样时间范围内的value的标准差作为结果Count:以每个采样时间范围内的点的数目作为结果First:以每个采样时间范围内的第一个value作为结果Last:以每个采样时间范围内的最后一个value作为结果LeastSquares:对每个采样时间范围内的value进行最小二乘法的拟合Max:以每个采样时间范围内的value的最大值作为结果Min:以每个采样时间范围内的value的最小值作为结果Percentile:每个采样时间范围内的value的第p百分位数作为结果.
Sum:以每个采样时间范围内的value的总和作为结果Diff:以每两个相邻的value的差值作为结果Div:以每个value除以一个除数作为结果Scale:以每个value乘以一个倍数作为结果基于多个采集点数据的四则运算表达式TDengine还可对一个或多个数据流进行实时聚合、统计等计算,并将计算出的衍生数据当做新的数据保存进TDengine,以便后续的操作.
实时计算与聚合查询很类似,只是后台定时进行,并自动滑动计算窗口的起始点.
工作方式与其他流式计算引擎的SlidingWindow相似.
实时计算可以通过一个简单的创建表的操作来实现.
如:createtabled1asselectavg(pressure)fromt1interval(60s)sliding(10s)上述SQL表示将表t1里字段pressure每10秒钟(每次滑动的时间间隔)将过去的60秒钟(聚合计算的时间间隔)的数据平均值计算出来并写入表d1.
计算出的衍生数据可以与其他原始数据或计算出的衍生数据进行再次计算.
TDengine白皮书第12页北京涛思数据科技有限公司版权所有10便捷的安装、部署、维护TDengine是在Linux上开发的,任何Linux系统都可以运行,而且不依赖任何第三方软件,也不是在某个开源项目上包装出来的产品.
获得安装包并解压后,只需执行install脚本就一切搞定,极其简单.
安装后,会在安装的机器上自动创建虚拟数据节点和管理节点,开发者就可以使用了,能满足一般性的需求.
但如果数据量大,就需要将软件安装到多台主机组成集群.
这时只需要在每台机器配置好参数,系统管理员打开TDengineShell,将新添加的主机添加进系统即可.
如果要撤销一个物理节点,登录TDengineShell,将其删除即可,极其简单.
传统数据库所需要的数据分区、数据迁移等等都一概不存在了.
咖啡主机怎么样?咖啡主机是一家国人主机销售商,成立于2016年8月,之前云服务器网已经多次分享过他家的云服务器产品了,商家主要销售香港、洛杉矶等地的VPS产品,Cera机房 三网直连去程 回程CUVIP优化 本产品并非原生地区本土IP,线路方面都有CN2直连国内,机器比较稳定。咖啡主机目前推出美国洛杉矶弹性轻量云主机仅13元/月起,高防云20G防御仅18元/月;香港弹性云服务器,香港HKBN CN...
Sharktech荷兰10G带宽的独立服务器月付319美元起,10Gbps共享带宽,不限制流量,自带5个IPv4,免费60Gbps的 DDoS防御,可加到100G防御。CPU内存HDD价格购买地址E3-1270v216G2T$319/月链接E3-1270v516G2T$329/月链接2*E5-2670v232G2T$389/月链接2*E5-2678v364G2T$409/月链接这里我们需要注意,默...
DMIT.io是成立于2018年的一家国外主机商,提供VPS主机和独立服务器租用,数据中心包括中国香港、美国洛杉矶和日本等,其中日本VPS是新上的节点,基于KVM架构,国际线路,1Gbps带宽,同时提供月付循环8折优惠码,或者年付一次性5折优惠码,优惠后最低每月8.72美元或者首年65.4美元起,支持使用PayPal或者支付宝等付款方式。下面列出部分日本VPS主机配置信息,价格以月付为例。CPU:...