查询等待时间过长
按设备、产品版本、批次、晶圆和时间等维度统计时,查询经常超过 300 秒,影响生产查看和问题追溯。
技术建设方案
面向海量检测数据的写入、查询、备份、封存与运维体系
01 / 执行摘要
现有生产环境使用 Windows 与单机 MySQL,数据持续增长后,查询经常超过 300 秒,写入和查询都难以满足芯片检测业务对时效的要求。新平台把 Redis 作为写入缓冲层,MySQL 只保存业务数据和汇总结果,ClickHouse 保存检测明细;Longhorn 分布式存储为 Kubernetes 持久卷提供跨节点副本,降低单台机器或单块磁盘损坏造成的数据风险。
“3 秒内”指业务请求在 Redis 缓冲层完成持久化接收并获得“已接收”结果,需要在双方约定的并发量和数据包大小下进行压测验证。明细数据由后台消费者批量写入 ClickHouse,状态随后更新为“已入库”或“写入失败”。查询优化效果以当前超过 300 秒的查询作为基线,对典型查询逐一测量并形成前后对比报告。
02 / 现状与痛点
客户上传的数据规模估算显示,系统数据库为 mars_db_wafer_fd,核心明细表 t_test_value_fd 已有 103,173,331 条记录,占用约 23 GB。客户业务每月约 5000 万条检测记录;结合现有明细表结构和客户给出的数据增长预估,一年明细数据量可能达到约 30 亿条。
| 数据表 | 记录数 | 占用空间 | 主要用途 |
|---|---|---|---|
t_session |
8,179 | - | 记录检测环境信息 |
t_test |
792,838 | 472 MB | 记录芯片级测试信息,按 test_id 判断写入结果 |
t_test_bin_definition |
751 | - | 定义测试 Bin 分类 |
t_test_bin_result |
2,857,523 | 321 MB | 保存测试分类结果 |
t_test_condition |
801,590 | 211 MB | 记录芯片测试条件 |
t_test_value_fd |
103,173,331 | 约 23 GB | 保存详细测试数据明细 |
按设备、产品版本、批次、晶圆和时间等维度统计时,查询经常超过 300 秒,影响生产查看和问题追溯。
业务需要根据 test_id 判断数据是否写入成功。当前系统无法在高并发写入下持续提供稳定、明确的反馈。
现有 512 GB 内存、64 核服务器配置较高,但仍是单点。硬件、系统或磁盘损坏都可能导致业务中断甚至数据损失。
数据库、容器、监控和自动化运维生态在 Linux 上更成熟,也更适合持续运行和故障处理。
03 / 建设目标
接入服务完成格式和字段校验,把数据写入 Redis 缓冲层并返回明确结果,目标为单次业务请求 3 秒内完成。
把海量明细分析交给 ClickHouse,针对常用维度设计分区、排序键和预聚合,缩短查询等待时间。
建立每日增量、每周全量、月度归档和年度封存机制,并把备份放在独立设备上。
持续监控服务器、数据库、写入链路和备份任务,异常时及时告警。
服务进程异常时自动重启,节点异常时调度到健康节点,数据损坏时按副本或备份流程恢复。
记录数据增长和资源趋势,为下一阶段扩容、数据归档和硬件采购提供依据。
04 / 总体架构
Redis 作为写入缓冲层,先把设备上报的数据稳定接住,再由消费者按批次写入 ClickHouse,避免瞬时并发直接冲击数据库。MySQL 只保存业务数据和汇总结果,ClickHouse 保存检测明细,Longhorn 分布式存储为 Kubernetes 持久卷提供至少 3 副本,任一节点或单块磁盘损坏时,持久卷可以在健康节点继续提供服务或重建副本。
05 / 写入与查询
接入服务检查数据格式、字段完整性和 test_id 是否已经存在,不额外增加一套复杂的重复校验流程。
数据写入 Redis 并完成持久化后返回“已接收”。Redis 配置 AOF 持久化和副本,作为短期缓冲,不作为唯一长期数据源。
后台消费者按批次把明细写入 ClickHouse,把需要事务一致性的业务数据和汇总结果写入 MySQL。
写入成功后按 test_id 更新为“已入库”,失败则记录原因并进入告警。接口返回“已接收”的目标为 3 秒内完成。
Redis 负责接住瞬时写入,不承担长期归档;MySQL 和 ClickHouse 才是在线数据存储。系统沿用现有 test_id 查询写入状态,不在第一阶段增加额外的去重框架。若上游存在重复上报,应由现有业务规则处理,或后续单独评估。
ClickHouse 按时间分区,具体按日或按月根据数据量、查询范围和维护成本在压测后确定。
围绕设备、产品版本、批次、晶圆、时间及高频组合查询设计排序键,减少无关数据扫描。
对固定口径的高频统计使用物化视图或预聚合结果,避免每次查询都重新扫描全部明细。
记录典型查询耗时和分位数,持续发现需要补充索引、调整排序键或改写查询的场景。
MySQL 只保存业务数据和汇总结果,明细统一进入 ClickHouse,降低核心业务库的资源竞争。
近期数据在线提供高频查询,满一年数据转为封存数据,控制在线数据规模。
06 / 组件说明
下面不使用“技术名词堆叠”的方式说明架构。每个组件都先说明它在业务中的作用,再说明实现方式。
解决什么问题:替掉不适合长期生产运行的 Windows 环境,减少数据库、容器、监控和自动化部署之间的兼容问题。
实现方式:生产服务器统一使用稳定的 Linux 发行版,规范系统账户、磁盘挂载、时间同步、日志和安全策略。
解决什么问题:让数据接入、查询、监控等服务的部署和恢复保持一致,不依赖人工登录服务器逐个重启。
实现方式:使用健康检查、副本、滚动发布和调度策略管理无状态服务;对于需要持久磁盘的数据库,使用稳定的持久卷和部署策略,避免把数据库当成随时可丢弃的临时容器。
解决什么问题:Redis 作为写入缓冲层,接住设备高峰时段的瞬时写入,避免数据直接冲击 MySQL 和 ClickHouse。
实现方式:启用 AOF 持久化和副本机制,配合消费者按批次投递数据。Redis 只保存短期缓冲和必要的热点数据,不替代长期存储和备份。
解决什么问题:服务器或磁盘可能损坏,单个 Kubernetes 节点上的持久卷不能成为单点。
实现方式:Longhorn 为 Kubernetes 持久卷提供分布式块存储,生产环境至少配置 3 副本并分布在 3 个节点。单节点或单盘故障时,副本可在健康节点继续提供服务并自动重建。Longhorn 快照和副本保护不能替代独立备份。
解决什么问题:MySQL 只保存业务数据和汇总结果,包括设备、批次、任务、test_id、写入状态以及后续统计完成的结果数据。
实现方式:保留必要业务表和汇总表,规范主键、唯一约束和索引,不再把海量检测明细继续堆进 MySQL。
解决什么问题:ClickHouse 保存检测明细,承担按设备、产品版本、批次、晶圆和时间等维度的海量统计查询。
实现方式:采用批量写入、时间分区、排序键和预聚合设计;根据数据保留和查询范围管理分区,避免全表扫描。
解决什么问题:把服务器、容器、数据库和业务接口的运行状态持续记录下来,让故障从“用户发现”变成“系统先发现”。
实现方式:采集 CPU、内存、磁盘、网络、连接数、写入延迟、查询耗时、失败重试、备份结果和数据增长趋势。
解决什么问题:把分散的指标整理成一眼能看懂的看板,帮助业务和技术人员判断系统是否正常、容量是否接近上限。
实现方式:按总览、写入、查询、数据库、备份和服务器分组展示,并通过告警规则触发通知。
解决什么问题:生产服务器损坏时,备份不能和业务数据一起消失。
实现方式:备份写入独立存储设备或独立备份节点,分别保留每日增量、每周全量和月度归档;满一年数据按封存策略处理,并定期演练恢复。
07 / 可用性与硬件
现有服务器配置为 512 GB 内存、64 核 CPU。单台服务器无法在硬件损坏、系统故障或维护期间保证业务连续,也不能把“配置高”等同于“高可用”。建议至少配置三台 Linux 服务器,现有服务器在完成数据迁移后重装为 Linux,并加入 Kubernetes 集群,作为其中一个数据或计算节点。
最终硬件型号、CPU、内存、磁盘数量和容量,需要在确认单条数据实际大小、每日峰值写入、查询并发、在线保存周期和备份周期后形成正式配置清单。当前数据量估算不足以支持虚假的精确容量承诺。
Kubernetes 的自动重启只能恢复服务进程,Longhorn 只能降低存储卷的单节点单盘风险,两者都不能替代数据库副本和独立备份。MySQL、ClickHouse、Longhorn 和备份存储必须分别设计副本、切换或恢复路径。
08 / 数据迁移
确认表结构、数据量、主键、唯一约束、缺失值、重复数据和历史归档范围,建立迁移前的数据基线。
完成 Linux、数据库、接入服务、Kubernetes、监控和备份链路建设,并进行基础功能验证。
把现有核心表和明细数据迁移到新平台,保留原始数据,迁移过程记录数据量、异常记录和处理结果。
全量完成后持续同步新增和变更数据,验证增量是否完整,为业务切换准备。
核对核心表记录数、关键字段、抽样明细和业务统计结果,确认新旧系统的数据口径一致。
先让部分查询或部分数据源切到新平台,观察稳定性、性能和告警,再逐步扩大范围。
确认核验通过后把写入和查询切到新平台,同时保留旧系统和回退路径。旧系统只读冻结,确认新平台稳定后再进入服务器改造。
确认旧数据已经完整迁移和备份后,将原 Windows 服务器重装为 Linux,配置容器运行环境、磁盘和网络,再加入 Kubernetes 集群,并加入 Longhorn 存储节点。
等待 Longhorn 副本重建完成,执行节点故障、磁盘故障、恢复和性能测试,确认三节点集群达到最终高可用状态。
09 / 备份与封存
至少保留 3 份数据副本,使用生产存储、Longhorn 副本和独立备份三类位置;至少使用 2 种存储或介质;至少 1 份放在独立设备或异地位置。Longhorn 副本解决机器和磁盘故障,独立备份解决误删除、勒索、逻辑损坏和数据追溯,两者不是同一个能力。
| 数据范围 | 备份方式与频率 | 建议保留 | 建议 RPO | 建议 RTO |
|---|---|---|---|---|
| MySQL 业务数据与汇总结果 | 每日全量 + 持续事务日志;每日复制到独立备份设备 | 30 天每日、12 周每周、12 个月每月 | 不超过 5 分钟 | 不超过 2 小时 |
| ClickHouse 检测明细 | 每日增量、每周全量、每月归档;年度数据压缩封存 | 30 天每日、12 周每周、12 个月每月及年度封存 | 不超过 24 小时 | 根据数据量在恢复演练中确定 |
| Redis 写入缓冲 | AOF 持久化 + 副本;只保存短期待处理数据 | 不作为长期备份,保留待处理窗口 | 节点故障尽量接近 0 | 副本切换后继续消费 |
| Longhorn 持久卷 | 至少 3 副本;定时快照并备份到独立目标 | 快照 7 天,独立备份不少于 30 天 | 单节点单盘故障为 0 | 5 至 30 分钟 |
| Kubernetes 与监控配置 | 每日导出配置、密钥清单、部署文件和看板定义 | 不少于 30 天 | 不超过 24 小时 | 不超过 4 小时 |
生产数据先写入节点磁盘和 Longhorn 持久卷;Longhorn 通过至少 3 副本抵御单节点和单盘故障。独立备份再写入一台独立备份服务器、NAS 或对象存储,不能只放在 Kubernetes 集群内部。条件允许时,至少一份备份放在不同机房或异地位置,并对备份文件进行加密、校验和权限隔离。
机器或磁盘故障时先由 Longhorn 副本和数据库副本恢复;逻辑损坏时按全量备份加增量备份恢复;误删除或勒索场景从隔离备份恢复;严重故障时使用异地备份重建。每季度恢复演练至少覆盖一次全量恢复和一次增量恢复,记录实际 RPO、RTO、数据校验结果和问题整改项。未实际恢复过的备份,不能视为可靠备份。
上述 RPO、RTO 是建议目标,最终值需要结合数据量、网络带宽、备份窗口和恢复演练结果确认。如果业务要求所有明细数据零丢失,需要采用同步写入和更高规格的存储、网络及副本配置,不能沿用普通每日备份或异步写入方案。
10 / 监控与恢复
CPU、内存、磁盘容量、磁盘延迟、网络流量和文件系统状态。
Pod 状态、重启次数、服务健康检查、接口错误率和请求耗时。
内存占用、待处理消息量、消费速度、AOF 状态、主从延迟和异常堆积。
写入延迟、批量失败、test_id 状态、查询耗时、消费者积压和数据增长。
卷健康、副本数量、降级状态、磁盘使用率、重建进度和快照备份结果。
备份成功与失败、备份大小、备份保存位置、恢复演练状态和历史归档进度。
由 Kubernetes 健康检查和自动重启恢复无状态服务进程。
Longhorn 使用健康副本继续提供持久卷,Kubernetes 把服务调度到健康节点,数据库按副本或恢复流程处理。
根据影响范围执行副本切换、单表恢复或全量恢复,并以备份校验和数据核验确认恢复结果。
硬盘批量损坏、误删除、网络隔离和机房级故障不能依靠自动重启解决,需要告警、人工处置和恢复预案。自动恢复的能力取决于副本数量、数据分布和备份是否真实可用。
11 / 实施与交付
| 阶段 | 主要工作 | 交付结果 |
|---|---|---|
| 调研与设计 | 确认数据模型、查询场景、性能基线和硬件条件 | 详细设计、容量评估、迁移计划 |
| 环境建设 | Linux、Kubernetes、Longhorn、Redis、数据库、接入服务、监控和备份链路搭建 | 可用测试环境、部署记录、配置说明 |
| 数据接入 | 实现 Redis 缓冲写入、消费者批量入库和状态更新 | 接入服务、接口说明、状态流转记录 |
| 数据迁移 | 全量迁移、增量同步、数据核验和切换演练 | 迁移报告、核验报告、回退方案 |
| 性能优化 | 分区、排序键、物化视图和典型查询优化 | 压测报告、优化前后对比 |
| 监控与备份 | 看板、告警规则、Longhorn 存储监控、备份任务和恢复演练 | 监控看板、告警说明、备份策略、恢复记录 |
| 原服务器改造 | 旧系统冻结后重装为 Linux,加入 Kubernetes 和 Longhorn 集群 | 节点加入记录、磁盘配置、集群验收记录 |
| 验收与交接 | 按验收清单逐项测试,完成文档和运维交接 | 验收报告、运维手册、交付清单 |
12 / 验收标准
业务请求写入 Redis 缓冲层并完成持久化后,目标在 3 秒内返回“已接收”;后台消费者继续把明细写入 ClickHouse,并更新“已入库”或“写入失败”状态。在双方约定的并发量和数据包大小下压测并记录耗时分布。
以当前超过 300 秒的典型查询作为基线,建立查询清单,在真实数据量下对比优化前后耗时。不同查询分别约定目标时间,不对所有复杂查询使用同一个固定秒数。
模拟服务进程退出,验证健康检查和自动重启;模拟一台节点或一块磁盘故障,验证 Longhorn 副本继续服务、自动重建和数据库访问不受影响。
确认 Longhorn 持久卷至少 3 副本、副本分布在不同节点,节点恢复后能够自动补足副本数量,并记录副本重建耗时。
模拟磁盘容量不足、服务离线和备份失败等场景,验证告警能够送达并留下记录。
完成一次全量恢复和一次增量恢复演练,核对实际 RPO、RTO,输出恢复耗时、校验结果和操作记录;每季度恢复演练纳入运维计划。
迁移前后核对核心表记录数、关键字段、抽样明细和业务统计结果,异常数据必须可定位。
13 / 预期收益
把海量明细查询从单机 MySQL 转移到 ClickHouse,减少等待时间,改善设备、批次和晶圆数据的查看体验。
通过 Redis 缓冲接收、消费者批量入库和状态更新,让业务知道数据是否已经接收、入库或失败。
通过 Longhorn 多副本、数据库副本、全量增量备份、年度封存和季度恢复演练,分别应对磁盘、节点、误删除和归档恢复场景。
通过 Prometheus、Grafana 和告警规则持续观察系统状态,在磁盘、服务和备份异常时提前发现。
持续记录数据量和资源趋势,为下一年度数据保留、硬件扩容和归档策略提供依据。
Redis 负责缓冲,Longhorn 负责持久卷副本,MySQL 与 ClickHouse 各司其职,后续扩容不需要重新改变数据边界。