TDengine Enterprise 多副本存储实战:多级存储、负载均衡与共享存储(S3)完整配置指南
2026/9/20 9:59:01 网站建设 项目流程

TDengine Enterprise 多副本存储实战:多级存储、负载均衡与共享存储(S3)完整配置指南

【免费下载链接】tdengineTDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.项目地址: https://gitcode.com/taosdata/tdengine

本文聚焦 TDengine Enterprise 的两大进阶存储能力——多级存储(Multi-Tier Storage)与共享存储(Shared Storage),基于官方文档docs/en/12-operations-and-tooling/02-operations/07-multi.md展开。读完本文,你将掌握dataDir三级存储挂载点的完整配置方法、minDiskFreeSize等空间均衡参数的原理,以及ssEnabledssAccessString等共享存储配置项与ss_keeplocalssmigrate等数据库级参数的用法,并能估算对象存储的读写请求成本,完成冷数据下线的生产级部署方案。

多级存储与共享存储解决什么问题

TDengine Enterprise 的多级存储功能将“近期、高频访问”的数据放在高速介质上,将“老旧、低频访问”的数据放到低成本介质上,目标有四个:

  • 降低存储成本——分层后,海量极冷数据放在廉价介质上,经济收益显著;
  • 提升写入性能——每一层都支持多挂载点,且 WAL 预写日志在 Level 0 层支持多挂载点并行写入。官方实测支持每秒持续写入 3 亿+ 数据点,并在机械硬盘上实现最高约 2 GB/s 的磁盘 IO 吞吐;
  • 运维简单——各层挂载点配置好后,数据迁移等任务无需人工干预,扩容更灵活;
  • 对 SQL 透明——查询无论是否跨层,单条 SQL 即可返回全部数据。

多级存储涉及的介质全部是本地存储设备。除了本地设备,TDengine 还支持对象存储作为存储设备;但由于大多数对象存储系统自身已有多副本,再叠加 TDengine 的多副本会造成空间浪费。为此,TDengine 进一步将对象存储升级为共享存储(Shared Storage):存储设备在逻辑上只保留一份数据,供整个集群的所有节点共享,既大幅降低存储空间和成本,查询时依旧透明。

版本注意:共享存储自 3.3.7.0 版本首次发布,是对 3.3.0.0 版本对象存储(S3)能力的增强。3.3.7.0 与之前的版本不兼容——如果此前已启用对象存储(S3)功能,升级到 3.3.7.0 及以上版本需要手动处理存量数据。

多级存储:dataDir 三级挂载配置

多级存储支持3 个层级(Level 0/1/2),每层最多128 个挂载点。配置入口是/etc/taos/taos.cfg中的dataDir指令:

dataDir [path] <level> <primary>

参数说明:

参数说明
path挂载点目录路径
level存储介质层级,取值 0/1/2。Level 0 存最新数据,Level 1 存次新数据,Level 2 存最旧数据;省略默认为 0。数据在层级间流向为 Level 0 → Level 1 → Level 2。同一层可挂多块盘,该层数据文件在这些盘之间分布。跨层的数据搬迁由系统自动完成,无需用户干预
primary是否为主挂载点,0(否)或 1(是),省略默认为 1。配置中只允许存在一个主挂载点(level=0, primary=1)

官方推荐的典型配置方案:Level 0 配置多个挂载点,每个挂载点对应一块 SAS 盘;Level 1 配置多个挂载点,每个挂载点对应一块或多块 SATA 盘。一个完整的三层配置示例:

dataDir /mnt/data1 0 1 dataDir /mnt/data2 0 0 dataDir /mnt/data3 1 0 dataDir /mnt/data4 1 0 dataDir /mnt/data5 2 0 dataDir /mnt/data6 2 0

配置约束(官方明确说明)

  1. 多级存储不允许跨层配置。合法方案只有三种:仅 Level 0;Level 0 + Level 1;Level 0 + Level 1 + Level 2。不允许只配置 level=0 和 level=2 而跳过 level=1;
  2. 禁止手动移除正在使用的挂载盘;当前挂载盘不支持非本地网络盘。

从源码结构看,层级上限由 include/util/tdef.h 中的TFS_MAX_LEVELTFS_MAX_TIERS - 1)约束,source/libs/tfs/src/tfs.c 中按for (int32_t level = 0; level <= TFS_MAX_LEVEL; level++)逐层组织挂载点,与文档描述的三层模型一致。

负载均衡:主挂载点与 Level 0 多盘写放大

多级存储中只有一个主挂载点,它承担系统最重要的元数据存储,并且当前 dnode 上各 vnode 的主目录也落在该 dnode 的主挂载点上,这会把该 dnode 的写入性能限制在单盘 IO 吞吐水平。

自 TDengine 3.1.0.0 起,如果某 dnode 配置了多个 Level 0 挂载点,系统会将该 dnode 上所有 vnode 的主目录均匀分布到所有 Level 0 挂载点上,让多个挂载点分摊写入负载。

在网卡 IO 等处理资源不构成瓶颈时,通过优化集群配置,官方测试结果表明:整个系统的写入能力与 Level 0 挂载点数量呈线性关系——Level 0 挂载点越多,系统整体写入能力线性上升。这也是“每层多挂载点”设计的核心收益所在。

同层挂载点选择策略:minDiskFreeSize 与 disable_create_new_file

一般情况下,TDengine 为新建数据文件选择同层挂载点时采用轮询(round-robin)策略。但现实中各盘容量不同,或同容量下已写入数据量不同,各盘剩余空间容易失衡,轮询可能选中剩余空间极小的盘。为此引入两个控制参数:

1. minDiskFreeSize(3.1.1.0 起)

当某块盘可用空间小于等于该阈值时,该盘不再被选中新建数据文件。单位为字节。例如设为 2GB,则剩余空间不足 2GB 的挂载点会被跳过。

在 source/common/src/tglobal.c 中可以看到该参数注册为int64类型,默认值TFS_MIN_DISK_FREE_SIZE50MB50 * 1024 * 1024),最大值为TFS_MIN_DISK_FREE_SIZE_MAX2TB,见 include/util/tdef.h。配置生效范围是服务器(CFG_SCOPE_SERVER),且支持动态生效(CFG_DYN_ENT_SERVER),即修改后无需重启。

2. disable_create_new_file(3.3.2.0 起)

用于禁止在某个挂载点上新建文件,默认值false,即默认允许在每个挂载点生成新文件。典型用途是在下线某块盘前,先禁止该挂载点写入新文件,等待存量文件自然迁走。

共享存储:配置项全解

共享存储可将 MinIO、腾讯云 COS、Amazon S3 等任意 S3 兼容对象存储,或本地挂载的 NAS、SAN 作为共享存储设备。注意:与多级存储联用时,各层介质上的数据可能按规则迁移到共享存储,并删除本地数据文件。

相关配置项均位于/etc/taos/taos.cfg,完整参数表如下:

参数名说明
ssEnabled是否启用共享存储,取值0/1/20(默认)为禁用;1仅启用手动迁移;2同时启用自动迁移
ssAccessString访问共享存储的选项字符串,格式<device-type>:<option-name>=<option-value>;...,可用选项随设备类型不同而不同(见下文)
ssUploadDelaySec数据文件保持多久不变后才上传到共享存储,单位秒。最小 1,最大 2592000(30 天),默认 60 秒
ssPageCacheSize共享存储页缓存页数,单位页。最小 4,最大 1024×1024×1024,默认 4096
ssAutoMigrateIntervalSec本地数据文件自动上传到共享存储的触发周期,单位秒。最小 600,最大 100000,默认 3600

这些参数的注册与取值边界可在 source/common/src/tglobal.c 中得到印证:ssEnabled范围 0~2,ssAutoMigrateIntervalSec范围 600~100000,ssPageCacheSize范围 4~1024×1024×1024,ssUploadDelaySec范围 1~60×60×24×30,与文档表格一致。另外从 source/util/src/tconfig.c 的源码可以看到,ssAccessString因包含敏感凭据信息,在配置导出(dump)时会被显式跳过,运维导出配置时需注意凭据不会出现在 dump 结果中。

ssAccessString:S3 兼容对象存储

使用 S3 兼容对象存储时,device-type必须为s3,可用选项如下:

选项说明
endpoint对象存储服务的主机名/IP,可带端口
bucket桶名
protocolhttpshttp,默认https
uriStylevirtualHostpath,默认virtualHost。注意部分对象存储厂商只支持其中一种
region对象存储服务的区域,可选
accessKeyId访问密钥 ID
secretAccessKey私有访问密钥
chunkSize分块大小(MB),超过该大小的文件走分片上传,默认 64
maxChunks分片上传允许的最大分片数,默认 10000
maxRetry遇到可重试错误时的最大重试次数,默认 3;负值表示无限重试
verifyPeer是否校验对端(服务端)证书,仅在protocol=https时有效,默认 false

完整配置示例:

ssAccessString s3:endpoint=s3.amazonaws.com;bucket=mybucket;uriStyle=path;protocol=https;accessKeyId=AKMYACCESSKEY;secretAccessKey=MYSECRETACCESSKEY;region=us-east-2;chunkSize=64;maxChunks=10000;maxRetry=3;verifyPeer=false

ssAccessString:本地挂载的存储设备

对 TDengine 而言,本地挂载的网络存储设备与本地磁盘等价。将其用作共享存储时,device-type必须为fs,只有一个选项:

选项说明
baseDir目录路径,TDengine 将其作为共享存储使用

示例:

ssAccessString fs:baseDir=/var/taos/ss

验证共享存储可用性:taosd --checkss

taos.cfg中配置好共享存储后,可用taosd命令的--checkss参数检查配置的服务是否可用:

taosd --checkss

如果配置的共享存储服务不可访问,该命令运行时会输出对应的错误信息。

从源码看,--checkss选项的解析位于 source/dnode/mgmt/exe/dmMain.c,仅在USE_SHARED_STORAGE编译宏下生效(这是企业版特性)。其执行流程由dmCheckSs()完成:先检查ssEnabled是否为 0(为 0 则提示"shared storage is disabled"并返回TSDB_CODE_OPS_NOT_SUPPORT),随后依次调用tssInit()初始化共享存储、tssCreateDefaultInstance()创建默认实例,任一步失败都会打印错误码。这解释了为什么ssEnabled必须先于--checkss检查被正确配置。

创建使用共享存储的数据库

配置完成后可启动 TDengine 集群,然后创建使用共享存储的数据库:

create database demo_db duration 1d ss_keeplocal 3d;

demo_db写入时序数据后,超过 3 天的数据会自动被切分并迁移到共享存储

ssEnabled2,mnode 每小时下发一次共享存储迁移检查命令,存在需要上传的时序数据时自动切分并迁移。该过程也可以用 SQL 手动触发:

ssmigrate database <db_name>;

如果ssEnabled1,mnode 永远不会自动触发迁移,必须手动触发。手动迁移入口ssmigrate在服务端对应 source/dnode/mnode/impl/src/mndSsMigrate.c 中的 mnode 处理逻辑,vnode 侧的执行位于 source/dnode/vnode/src/vnd/vnodeSvr.c。

数据库级共享存储参数(建库/改库时指定)如下:

#参数默认值最小值最大值说明
1ss_keeplocal3651365000数据在本地保留的天数,即数据文件在本地磁盘上保留多久后才可迁移到共享存储。默认单位天,支持 m(分钟)、h(小时)、d(天)
2ss_chunkpages1310721310721048576迁移对象的尺寸阈值,与tsdb_pagesize参数相同,不可修改,单位 TSDB 页
3ss_compact101TSDB 文件首次迁移前是否自动执行 compact 操作

这些参数在源码中有明确的边界校验:解析层在 source/libs/parser/src/parTranslater.c 对ss_chunkpagesss_compact做范围检查,并对ss_keeplocal的单位后缀做合法性校验(仅允许 m/h/d),还要求ss_keeplocal >= 3 * duration;mnode 落库前在 source/dnode/mnode/impl/src/mndDb.c 会再次校验ssChunkSize是否落在TSDB_MIN_SS_CHUNK_SIZE~TSDB_MAX_SS_CHUNK_SIZE之间、ssCompact是否在 0~1 之间(宏定义见 include/util/tdef.h)。这三个参数同时也是系统表列,见 source/common/src/systable.c。

对象存储读写请求量估算

对象存储的使用成本与存储数据量及请求次数相关,分上传与下载两个过程估算。

数据迁移(上传)

当 TSDB 时序数据超出ss_keeplocal指定的时间后,leader vnode 会把相关数据文件切分成多个文件块(file block),每块默认512MBss_chunkpages * tsdb_pagesize,最后一块除外),全部文件块上传到共享存储,除最后一块外的所有文件块从本地磁盘删除。建库时可通过ss_chunkpages调整块大小,从而控制每个数据文件的上传次数。

head、stt、sma 等其他类型文件同样上传到共享存储,但会在本地文件系统中保留,以加速预计算相关查询。迁移成功结束后,leader vnode 会在共享存储中创建/更新一个 manifests 文件保存迁移信息;follower vnode 随后从共享存储下载该数据文件的最后一块以及其他所有文件到本地,从而完成整体迁移——它们依赖 manifests 文件决定具体需要下载哪些文件。

因此数据迁移期间的读写请求次数约为:

Read/Write Count = Number of Data Blocks + (Number of Other Files + 2) x Number of vnodes

数据下载(查询)

查询过程中如需访问对象存储中的数据,TSDB不会下载整个数据文件,而是计算所需数据在文件中的位置,只把相关数据下载到 TSDB 页缓存,再返回给查询执行引擎。后续查询先检查页缓存中是否已有该数据,命中则直接使用,从而有效减少对对象存储的下载次数。

多个相邻数据页会作为单个数据块从对象存储下载,进一步减少下载次数。每个数据页大小由建库时的tsdb_pagesize参数指定,默认 4KB:

Download Count = Number of Data Blocks Needed for Query - Number of Cached Data Blocks

页缓存是内存缓存,节点重启后数据需要重新下载。缓存采用LRU(最近最少使用)策略,空间不足时淘汰最久未使用的数据。缓存大小可通过ssPageCacheSize调整——通常缓存越大,下载次数越少。

Azure Blob Storage 支持现状

文档明确说明:Azure Blob 对象存储的支持当前临时禁用。如果你此前(TDengine 3.3.7.0 发布前)正在使用 Azure Blob 服务,请等待后续新版本。原 Azure 章节内容(含 Flexify S3 网关、s3EndPoint/s3AccessKey/s3BucketName多服务配置等)已在文档中以注释形式保留。

适用前提与限制小结

  • 多级存储的挂载点必须是本地存储设备,不支持非本地网络盘;在用挂载盘禁止手动移除;
  • 合法的多级配置只有"仅 0 层"、"0+1 层"、"0+1+2 层"三种,不能跨层跳过 Level 1;
  • 全集群只允许一个主挂载点,且必须在 Level 0;
  • 共享存储是企业版能力,--checkss检查与ssAccessString等配置均依赖企业版编译开关(USE_SHARED_STORAGE);
  • 3.3.7.0 引入共享存储后与 3.3.0.0~3.3.6.x 的对象存储(S3)功能不兼容,升级前需按官方说明做手动迁移处理;
  • 对象存储成本模型取决于块数与请求数,建库时通过ss_chunkpagestsdb_pagesize权衡迁移请求量,通过ssPageCacheSize权衡查询下载量。

原文档可参考:docs/en/12-operations-and-tooling/02-operations/07-multi.md。

【免费下载链接】tdengineTDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.项目地址: https://gitcode.com/taosdata/tdengine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询