TDengine修改亿级子表所属超级表表结构时如何应对系统压力
TDengine 超级表批量修改子表结构的压力应对机制
TDengine 在设计超级表(STable)的 schema 变更能力时,核心采用读时合并+惰性更新的机制规避全量遍历子表的性能开销,针对亿级子表场景的压力应对逻辑如下:
- 全局版本号隔离机制:超级表自身维护全局唯一的
schema版本链,你提到的存储最近变更版本号的临时数组是版本校验缓存,仅存储最近数个版本的元数据差异,内存占用可以忽略。所有子表仅在自身元数据中记录当前使用的schema版本号,超级表执行结构修改时不会立刻同步更新所有子表的元数据,操作耗时仅和超级表自身的元数据大小相关,和子表数量无关。 - 磁盘回收操作懒触发:你提到的修改过程触发的磁盘空间回收(即你表述的drop dick操作,应为书写误差)不会在变更执行时批量触发,只有当某个子表在
schema变更后首次被读写访问时,才会触发该子表的元数据更新、旧版本关联的磁盘空间回收操作,瞬间峰值压力会被平摊到后续的业务访问周期中,不会产生集中的IO毛刺。 - 后台操作限流保护:TDengine 内部对非核心的后台运维操作(包括旧 schema 空间回收、冷数据落盘等)默认做了IO带宽限流,最高仅允许占用单节点磁盘总带宽的30%,即使出现批量冷子表集中访问的场景,也不会抢占正常业务读写的系统资源。
- 分布式任务分片分摊压力:集群部署场景下,超级表的子表会按标签规则分散在不同的
vnode节点上,子表的schema更新和磁盘回收操作都会下推到所在vnode本地执行,亿级子表的处理压力会均匀分散到集群所有节点,不存在单点处理瓶颈。
内容的提问来源于stack exchange,提问作者naissance
相关产品推荐
相关产品推荐

