117万台设备、千亿条数据:Zendure把存储成本砍掉80%的时序库改造实录

Feng 33 阅读 AI技术

117万台设备同时在线,单表近千亿行,高峰期每秒数十万数据点——这是一家阳台光伏储能公司的真实数据规模。Zendure(征拓)用一年多时间,把底层时序数据库从开源版换到企业版集群,存储开销从每年20万美元压到3.5万美元,单设备查询回到10毫秒以内。这篇文章拆解他们的选型逻辑、数据建模和踩过的坑。

业务长什么样:阳台上的逆变器,屋顶上的加装储能

Zendure是广州疆海科技深圳分公司旗下的全球能源管控品牌,主打即插即用家庭能源管理系统。核心产品是Solar Flow系列智能储能逆变器,从轻量级阳台光伏Solar Flow 800,到专业级屋顶储能Solar Flow 2400 Pro、4000 Mix AC+。配套还有可扩展电池模块AB系列、智慧电表Smart Meter CT、智能插座Smart Plug Pro和电力枢纽Power Hub。

用户覆盖欧洲、北美、亚太60多个国家和地区,接入设备超过117万台。仅2024年,用户通过太阳能累计发电13,172 MWh。

业务场景分两类。

阳台光伏储能:欧洲大量公寓住户没法装屋顶光伏,方案是在阳台栏杆挂2到4块光伏板,接上Solar Flow逆变器和电池,插家中插座即插即用。白天发电存电池,晚上放电使用,App里实时看能源流向和节省的电费。

屋顶光伏加装储能:已有屋顶光伏的独栋住宅业主,用Mix AC+系列在不改动原有系统的前提下加装储能,提升光伏自用率。

这两类场景里,每台设备持续上报功率、电流、输入输出电能等时序数据。App还基于AI做智慧充放电调度:按天气预报预测发电量,按动态电价(比如法国EDF Tempo)在低价时段充电,按用户用电习惯智能调度。

四个痛点,逼着换数据库

一开始只有3张超级表、数千台设备。一年多后场景规模涨了百倍,压力全来了。

写入压力。多条产品线同时上量,设备从数千台涨到117万台。以太阳能流控功率表为例,单表累计行数接近千亿级,高峰期每秒写入量达到数十万数据点。原来的单机架构扛不住。

存储成本。系统跑在亚马逊AWS上,EBS按月计费。117万台设备高频采集、保留约10年,数据总量数千亿条。按老办法存,总容量要7到8 TB,年存储开销超过20万美元。对一家全球化创业公司来说,这笔钱不能忽视。

查询性能。用户在App里看功率曲线,加载时间从几百毫秒变成好几秒,大跨度查询直接超时。”App变卡了”的反馈越来越多。数据量还在涨,毫秒级响应必须保住。

高可用。用户遍布多个时区,系统必须7×24小时运行。曾经一次单机异常导致欧洲用户2小时无法查看App数据,投诉量很大。从那以后高可用成了硬指标。

选型对比:为什么最后是TDengine

开源版遇到瓶颈后,团队从写入吞吐、查询效率、压缩能力、集群高可用几个角度评估了多种方案。

对比维度 MySQL InfluxDB TDengine
写入性能 分表后勉强支撑,运维复杂 开源版不支持集群 原生分布式集群,线性扩展
压缩率 无原生压缩 约3:1~5:1 约6:1~60:1
查询表现 大表查询分钟级 聚合查询秒级 单设备毫秒级,跨设备秒级
集群高可用 需搭主从+读写分离 集群版闭源收费 原生3副本集群
SQL兼容性 完整SQL 类SQL(非标准) 标准SQL
运维成本 高(分表+索引维护) 中 低(自动化运维)

InfluxDB在IoT场景下是不错的选择,但开源版不支持集群部署,集群版是商业闭源产品,压缩率也不及TDengine。MySQL在数据量攀升后,分表和索引维护成本急剧上升。

TDengine在写入、压缩率、集群能力和SQL兼容性上综合最优,加上团队已有开源版使用经验,最终选定企业版。

这里补充一个工程常识:从开源版迁到企业版,不是简单换个二进制。开源版和企业版的集群能力、副本机制、运维接口差异较大,迁移前必须确认业务依赖的SQL语法、写入协议、数据保留策略在目标版本全部支持,否则会出现”迁到一半发现某条查询跑不通”的情况。

数据建模:超级表按业务切,子表按设备拆

架构采用分层设计。数据模型上,用TDengine的”超级表+子表”模式,核心思路三条:超级表按业务品类切分,子表按设备拆分,标签按查询维度设置。

一共建了16张超级表,其中11张有数据,5张为新场景预留。按产品线归类:

场景线 超级表 设备数 说明
太阳能流控 power / electric / inout 各约19万台 核心场景,数据量最大
智慧互感器 power / inout 各约9万台 精确电流计量
智能插座 power / inout 各约6万台 家庭用电管控
预估功率 predic_power 4万台 AI功率预测
回报拆解 hems_profit 7.6万台 投资回报展示
用户能耗 consumer_energy 10.2万台 用户能耗画像
Tesla整合 tesla_inout 1268台 第三方储能对接

以太阳能流控功率表为例,超级表建表语句如下:

-- 太阳能流控功率超级表CREATE STABLE st_device_solar_flow_power (
 ts TIMESTAMP, -- 采集时间戳
 power INT, -- 实时功率值(W)
 type INT, -- 功率类型(充电/放电/光伏等)
 hems_id BIGINT -- 所属家庭能源管理系统ID) TAGS (
 device_id BIGINT -- 设备唯一标识);

同一台Solar Flow逆变器,在功率表、电流表、输入输出电能表下各有一张子表。TAG字段P0标识设备,应用层通过P0关联到家庭维度。

典型查询场景的写法:

-- 1. 单台设备最新功率(App实时展示)SELECT last_row(*) FROM st_device_solar_flow_power 
WHERE device_id = 100048;-- 响应时间:< 10ms-- 2. 某设备过去24小时功率趋势(App功率曲线)SELECT _irowts, AVG(power), MAX(power), MIN(power) 
FROM st_device_solar_flow_powerWHERE ts >= NOW() - 1d AND device_id = 100048INTERVAL(5m);-- 响应时间:< 100ms-- 3. 统计所有设备本月每日总发电量(运营分析)SELECT _irowts, SUM(energy) 
FROM st_device_solar_flow_inoutWHERE ts >= '2026-07-01'INTERVAL(1d);-- 响应时间:~2秒(覆盖18万+设备)-- 4. 按家庭维度聚合平均功率(HEMS分析)SELECT hems_id, AVG(power) 
FROM st_device_solar_flow_powerWHERE ts >= NOW() - 1dPARTITION BY hems_id;-- 响应时间:~3秒

效果:数字说话

指标类型 调优前(开源版/MySQL) 优化后(TDengine企业版) 提升幅度
写入性能 单机瓶颈,高峰期写入延迟 3节点集群,平稳高吞吐写入 质的飞跃
查询性能 大跨度查询分钟级 单设备<10ms,跨设备约2秒 百倍以上
存储压缩 MySQL无压缩/开源版5-9% 压缩率15%~31% 约1:6~1:60
存储开销 约$200,000+/年(估算) 约$35,000/年 降低约80%
高可用 单机无冗余 3机器+3副本,零异常运行9个月+ 从0到1
数据保留 无法长期保留 约10年(KEEP 3650d) 满足合规要求

数据增长结构上,太阳能流控是绝对大户,仅功率数据就有近千亿条记录,占总数据量的60%以上。

迁移与后续:零停机怎么做到的

从开源版升到企业版,用的是taos X数据迁移工具,实现了零停机平滑迁移。

超级表+子表模型带来的另一个好处:新增产品线时只需定义新表,不影响已有业务。开发和运维开销都压下来了。

后续规划有两块:冷热数据分层存储,进一步优化成本;深化智慧拆解能力。

最后给同样在选型的人一句实在话:时序库选型别只看benchmark数字。先盘清楚自己的写入峰值、保留周期、查询模式和高可用要求,再对照产品能力。Zendure的路径——开源版验证、遇到瓶颈后升级企业版集群——对多数从零起步的IoT团队是可复制的稳妥打法。

广州疆海科技有限公司深圳分公司(Zendure 征拓) 运维部门 马伟雄

Feng
这位作者很神秘,还没有填写简介。