TDengine是一款轻量级、高效且单机开源的面向物联网的数据处理引擎。作为一款专门为物联网设计并实现的数据引擎,TDengine在数据的写入、查询以及存储方面拥有其他数据库无法比拟的优势。本文主要探讨了TDengine在架构设计和存储方面的创新,以方便用户理解TDengine强大性能背后的逻辑。
管理节点模块
管理节点模块主要负责元数据的存储和查询等工作,其中包括用户信息的管理、数据库和表信息的创建、删除以及查询等。应用连接TDengine时会首先连接到管理节点。在创建/删除数据库和表时,请求也会首先发送请求到管理节点模块。由管理节点模块首先创建/删除元数据信息,然后发送请求到数据节点模块进行分配/删除所需要的资源。在数据写入和查询时,应用同样会首先访问管理节点模块,获取元数据信息。然后根据元数据管理信息访问数据节点模块。
数据节点模块
写入数据的存储和查询工作是由数据节点模块负责。为了更高效地利用资源,以及方便将来进行水平扩展,TDengine内部对数据节点进行了虚拟化,引入了虚拟节点(vnode)的概念,作为存储、资源分配以及数据备份(商业版本中)的单元。如图2所示,在一个dnode上,通过虚拟化,可以将该dnode视为多个虚拟节点的集合。每个虚拟节点存储一定数量的表中的数据。不同的vnode之间资源互不共享。每个虚拟节点都有自己的缓存,在硬盘上也有自己的存储目录。而同一vnode内部无论是缓存还是硬盘的存储都是共享的。通过虚拟化,TDengine可以将dnode上有限的物理资源合理地分配给不同的vnode,大大提高资源的利用率和并发度。一台物理机器上的虚拟节点个数可以根据其硬件资源进行配置。
客户端模块
TDengine客户端模块主要负责将应用传来的请求(SQL语句)进行解析,转化为内部结构体再发送到服务端。TDengine的各种接口都是基于TDengine的客户端模块进行开发的。
时间驱动的落盘:TDengine服务会定时将vnode缓存中的数据写入到硬盘上,默认为一个小时落一次盘。落盘间隔可在配置文件中配置。
-
数据驱动的落盘 :当vnode中缓存的数据达到一定规模时,为了不阻塞后续数据的写入,TDengine也会拉起落盘线程将缓存中的数据清空。数据驱动的落盘会刷新定时落盘的时间。
TDengine在数据落盘时会打开新的预写日志文件,在落盘后则会删除老的预写日志文件,避免日志文件无限制的增长。
1/var/lib/taos/
2 +--mgmt/
3 +--db.db
4 +--meters.db
5 +--user.db
6 +--vgroups.db
1/var/lib/taos/
2 +--tsdb/
3 | +--vnode0
4 | +--meterObj.v0
5 | +--db/
6 | +--v0f1804.head->/var/lib/taos/data/vnode0/v0f1804.head1
7 | +--v0f1804.data->/var/lib/taos/data/vnode0/v0f1804.data
8 | +--v0f1804.last->/var/lib/taos/data/vnode0/v0f1804.last1
9 | +--v0f1805.head->/var/lib/taos/data/vnode0/v0f1805.head1
10 | +--v0f1805.data->/var/lib/taos/data/vnode0/v0f1805.data
11 | +--v0f1805.last->/var/lib/taos/data/vnode0/v0f1805.last1
12 | :
13 +--data/
14 +--vnode0/
15 +--v0f1804.head1
16 +--v0f1804.data
17 +--v0f1804.last1
18 +--v0f1805.head1
19 +--v0f1805.data
20 +--v0f1805.last1
21 :
meterObj 文件
1<文件开始>
2 [文件头]
3 [表记录1偏移量和长度]
4 [表记录2偏移量和长度]
5 …
6 [表记录N偏移量和长度]
7 [表记录1]
8 [表记录2]
9 …
10 [表记录N]
11 [表记录]
12 <文件结尾>
head 文件
1<文件开始>
2 [文件头]
3 [表1偏移量]
4 [表2偏移量]
5 …
6 [表N偏移量]
7 [表1数据索引]
8 [表2数据索引]
9 …
10 [表N数据索引]
11 <文件结尾>
1[索引块信息]
2 [数据块1索引]
3 [数据块2索引]
4 …
5 [数据块N索引]
data文件
1<文件开始>
2 [文件头]
3 [数据块1]
4 [数据块2]
5 …
6 [数据块N]
7 <文件结尾>
1[列1信息]
2 [列2信息]
3 …
4 [列N信息]
5 [列1数据]
6 [列2数据]
7 …
8 [列N数据]
last 文件
本文分享自微信公众号 - TDengine(taosdata_news)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。