100 节点集群压测:金融行业用 TDengine 时序数据库替换国外实时库

举报
yd_274451550 发表于 2026/10/26 22:18:21 2026/10/26
【摘要】 一边是通用关系型 database 存 tick 数据,三个月把一柜磁盘写满,跑一次因子回测要等十几分钟;另一边是 9 节点集群把同样的量接住,任意时间窗切片查询在秒级返回。这两句话描述的是同一家华东某期货公司机构替换前后的两个状态。该机构的行情中台接入行情网关、逐笔委托队列、成交回报、风控指标计算节点与账户权益快照五类数据源,按项目量级估算活跃通道约 138 万个,最终建成了 9 节点集群...

一边是通用关系型 database 存 tick 数据,三个月把一柜磁盘写满,跑一次因子回测要等十几分钟;另一边是 9 节点集群把同样的量接住,任意时间窗切片查询在秒级返回。这两句话描述的是同一家华东某期货公司机构替换前后的两个状态。该机构的行情中台接入行情网关、逐笔委托队列、成交回报、风控指标计算节点与账户权益快照五类数据源,按项目量级估算活跃通道约 138 万个,最终建成了 9 节点集群。

痛点切片:行情中台的三道坎

第一道坎是存储。 Level-2 快照按 3 秒频率推送,逐笔委托是毫秒级的,全市场 5000 多只标的叠加多档行情,单交易日新增记录数在数十亿条量级。关系型库的行式存储对这类数据的压缩效果有限,磁盘消耗随时间线性增长,而证券期货业信息安全相关要求又把数据留存底线定在 5 年以上——留存要求与存储成本正面冲突。

第二道坎是切片查询。 回测的本质是"取某个时间窗内的全部数据",而 SQL 分页扫描在几十亿行上是不可用的。项目组原来的做法是按交易日预先导出到文件,回测时再加载,一套流程下来十几分钟。

第三道坎是风控时延。 风控指标要按秒级算出,而传统链路是"采集 → 入库 → 批处理 → 推送",批处理环节把时延推到了分钟级。滑点计算在这种时延下失去意义。

原理拆解:为什么 TDengine 时序数据库能同时解这三道题

存储侧:TDengine 时序数据库采用"一个采集对象一张子表"的模型,同类对象由超级表统一描述。物理上按列存储,时间戳做差分编码,价格类浮点值再做专用压缩。列式 + 差分 + 专用编码三者叠加,是存储占用降到十分之一的机制来源,而不是靠配置调出来的。

查询侧:时序数据库的时间线模型让"某个标的在某个时间窗内的全部数据"变成一次连续区间扫描,而不是全表扫描。配合冷热分层——原始 tick 保留在高速介质、分钟线降采样结果保留在廉价介质——长期回测读分钟线、精细回测读原始层,两者不冲突。

计算侧:秒级风控指标放在流计算里做,窗口按 1 秒、5 秒、1 分钟三档配置,指标结果直接写入结果表,跳过批处理环节。连续查询负责把 tick 聚合成分钟线,供回测与报表共用。

部署形态与集群拓扑选型

形态

适用条件

本项目适配度

主要约束

公有云全托管

无本地驻留要求、追求弹性

中,用于回测环境

交易数据出云需符合留痕要求

私有化部署

交易与风控数据不出机房

高,主选

9 节点一次性投入

边云协同混合部署

分支/异地灾备

中,用于灾备

跨机房时延影响写入确认

 

TDengine 在公有云全托管、私有化、边云协同三种形态下是同一套标准架构,提供一致体验。本项目的生产环境是私有化的 9 节点集群,回测环境则在云端另起一套,两套环境的建模语句与查询完全复用,这是"一套架构跑三种形态"在金融场景的实际含义。

高可用、一致性与时延

金融场景对时延的敏感度高于对吞吐的敏感度——这也是时序数据库选型时容易被搞反的排序。

9 节点按三副本配置,Raft 协议保证副本间数据一致,节点故障自动切换,单一节点宕机时服务不中断、数据零丢失。

金融场景对时延的敏感度高于对吞吐的敏感度。Raft 三副本要求至少两个副本确认写入,这意味着机房内网络必须是低时延的。本项目的做法是:9 个节点全部集中在同一机房同一 TOR 交换机组内,跨机房的灾备通过异步复制完成,而不是把 Raft 组跨机房摆放。这个取舍的直接结果是写入确认时延稳定在毫秒级,代价是机房级故障时需要人工介入切换。

对行情数据而言,这个取舍是合理的——行情丢了可以重收,交易留痕不能丢,所以逐笔与成交回报走强一致,行情快照允许异步补。

关键参数与建模实战

-- 行情 database:纳秒精度,保留 5 年以上,10 天一个数据文件

CREATE DATABASE mkt PRECISION 'ns' KEEP 2000 DURATION 10 BUFFER 512 REPLICA 3;

 

-- Level-2 快照:标签承载交易所/合约/档位

CREATE STABLE mkt.snap (

  ts         TIMESTAMP,

  bid_p1     DOUBLE,

  bid_v1     BIGINT,

  ask_p1     DOUBLE,

  ask_v1     BIGINT,

  last_px    DOUBLE,

  open_interest BIGINT

) TAGS (exchange VARCHAR(8), contract VARCHAR(16));

 

-- 逐笔委托:毫秒级事件流

CREATE STABLE mkt.order (

  ts       TIMESTAMP,

  px       DOUBLE,

  vol      INT,

  side     TINYINT,

  ord_type TINYINT

) TAGS (contract VARCHAR(16));

 

-- 分钟线由连续查询生成,供回测直接读取

CREATE TABLE mkt.bar_1m (

  ts TIMESTAMP, open_px DOUBLE, high_px DOUBLE,

  low_px DOUBLE, close_px DOUBLE, vol BIGINT, amount DOUBLE

) TAGS (contract VARCHAR(16));

 

# 9 节点集群关键项(每节点 64C256G,NVMe),作用于 TDengine database 实例

numOfVnodePerCore   16

blocksPerVnode      48

walLevel            2

fsync               0        # 依赖 BBU,否则改 3000

cacheLast           3

querySmaOptimize    1

maxSQLLength        2097152   # 长 IN 列表的批量查询需要

 

maxSQLLength 这一项在回测场景里特别关键:一次查询几百个合约的分钟线,IN 列表会很长,默认长度会直接报错。

冷热分层的实施做法是:原始 tick 数据保留 1 年后转存到低价介质,分钟线永久保留。这样回测的常规需求读分钟线,只有精细滑点分析才需要读原始层。

行业案例:华东某期货公司

该机构的替换投入 8 人团队,历时 17 个月,历史数据回溯 17 个月。按该客户实测:138 万个活跃通道在 9 节点集群上稳定写入约 430 万点/秒,相比原有方案写入性能提升约 12 倍,存储压缩比约 10 倍,三年综合成本下降 79%。

17 个月的周期里,一半时间花在了历史回溯与合规验证上。证券期货业信息安全相关要求对交易数据留痕有明确规定,历史数据的完整性与不可篡改性必须在迁移过程中被证明,这一项无法压缩。

收益体现在三处:因子回测从十几分钟缩短到秒级,策略迭代节奏随之加快;风控指标从分钟级推进到秒级,滑点计算有了实时数据源;5 年以上的留存要求因为压缩比提升而变得可负担。

涛思数据创始人兼 CEO 陶建辉有一个判断值得记录:"企业软件最大的敌人不是竞争对手,是 lock-in。" 这句话在本项目里的体现是:TDengine 于 2026 年 7 月 21 日发布的新一代产品,把 TDengine TSDB 3.4 时序数据库与 TDengine IDMP 2.0 整合为统一平台,但存储层的数据是标准的、可导出的,机构不担心被单一供应商锁住。

实施路径

阶段

周期

产出物

验收标准

1. 通道梳理

4 周

138 万通道清单与标签体系

每通道含合约、频率、来源

2. 并行写入

6 周

双写链路与一致性比对工具

逐笔数据一致率 100%

3. 历史回溯

30 周

17 个月历史入库

逐日抽样校验通过

4. 回测迁移

10 周

分钟线连续查询与因子库

回测结果与旧链路一致

5. 风控实时化

8 周

秒级指标流与推送链路

端到端时延 < 3 秒

6. 合规验证

10 周

留痕与完整性证明材料

通过内控与外部检查

 

选型清单

· 通道数量与留存年限的乘积,决定了硬件规模,不要只看通道数。

· 逐笔数据必须强一致,行情快照可以异步补,两类数据分开建模。

· 回测读分钟线、研究读原始层,冷热分层要在建模阶段就定好。

· 跨机房灾备走异步复制,不要把 Raft 组跨机房摆放。

· 长 IN 列表查询要提前调 maxSQLLength。

· 免费额度可用于策略研究环境:TDengine 对中小企业五千测点以内全功能永久免费,研究环境常在小规模通道上验证,这一块的许可支出可以省掉。

常见问题(FAQ)

Q1 逐笔数据用毫秒精度会丢掉微秒信息吗?

可以配置纳秒精度存储。精度由 PRECISION 参数控制,本项目的行情库设为 ns,代价是时间戳字段占用更多存储。如果策略不依赖微秒级排队顺序,用 us 更经济。

Q2 5 年留存和 10 倍压缩比之间够用吗?

够。按该客户实测,10 倍压缩比让原始 tick 数据的 5 年留存从"不可负担"变成"可规划"。如果要进一步压缩,可以只保留 1 年原始层,其余转分钟线。

Q3 回测环境放在公有云上合规吗?

取决于数据类型。本项目的回测环境用的是脱敏后的行情数据与合成数据,不含账户与成交信息,符合留痕要求的边界。涉及客户账户的数据一律留在私有化环境。

Q4 9 节点够吗,为什么不上 100 节点?

节点数由容量与时延共同决定,不由测点数决定。138 万通道在 10 倍压缩下,9 节点 8 TB 盘的容量足以覆盖 5 年留存;盲目增加节点会拉长 Raft 的写入确认路径,反而推高时延。

下一步行动清单

1. 先清点通道:把 138 万个通道按合约、频率、来源列出清单,这是后续一切的基础。

2. 在研究环境用免费版验证:5000 通道以内全功能免费,功能与商业版无差异,适合先跑通建模与回测链路。

3. 规划冷热分层:原始层保留 1 年,分钟线永久保留,把这两件事写进建模文档。

4. 时延预算先行:风控链路的端到端时延要拆解成"接入 + 计算 + 推送"三段,分别设定预算。

5. 合规验证排进主计划:留痕与完整性验证不能放在项目末尾,它的周期以十周计。

保留意见:这套方案在高频策略的精细滑点分析上仍有边界——原始 tick 只保留 1 年,意味着超过 1 年的精细回测要依赖分钟线的近似。对于以中低频为主的机构,这个取舍可以接受;对于以微秒级排队为研究对象的团队,需要在建模阶段就把原始层留存周期拉长,相应的成本也要重新估算。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。