单表亿级数据怎么扛、大表扩字段不堵生产、lf 预发环境怎么配套验证

一、先讲现状:哪些表是超级大表,数据量级有多恐怖

懂x帝属于内容 + UGC 双高写入媒体,分三类数据表,体量完全不在一个层级:

  1. 评论、车友圈、用户动态(亿级行) 每条资讯、短视频下面海量评论、回复、点赞、收藏,单逻辑表轻松破亿行,是最恐怖的大表;
  2. 文章 / 短视频内容库(千万级) 官方评测、车型文章、车主投稿,总量千万级,增长平缓;
  3. 车型、配置、参数(百万级静态字典) 基础车型数据几乎不增长,属于小表;
  4. 日志、行为埋点(超大规模时序数据) 用户浏览、点击、设备上报,完全不存 MySQL,直接丢 ClickHouse / 数据仓库。

行业红线:MySQL 单表超过1000 万行B + 树索引层高,随机 IO 爆炸、查询、DDL 全卡死;懂x帝不会让任何一张逻辑单表摸到这条线。

二、四层架构拆分,从根源消灭 “超大单表”(核心玩法)

1. 第一层:垂直分库(按业务拆独立 MySQL 集群)

完全隔离业务读写,互不干扰:

  • 内容库:文章、视频、车型资讯(编辑后台、lf 预发共用一套拆分逻辑)
  • UGC 库:评论、车友圈、点赞、收藏(写入最高频)
  • 用户库:账号、手机号、登录记录
  • 交易 / 线索库:4S 店报价、购车线索 好处:评论库写崩,不会影响编辑发布资讯,故障隔离; lf 预发环境同步复刻整套分库结构,预发库也是多套独立实例,和生产拆分逻辑 1:1 对齐

2. 第二层:水平分表(解决亿级评论大表,最关键)

评论这类爆炸增长表,用分片中间件(Sharding-JDBC / 自研分片) 水平拆分:

  1. 分片键:target_id(文章 / 视频 ID)哈希取模
  2. 一套逻辑评论表,物理拆分成64/128 张子表,均匀分散到多台 MySQL 服务器
  3. 单张子表严格控制在 800 万行以内,永远不触发索引性能拐点 查询逻辑:打开某条视频评论,路由只查对应分片子表,不会扫全量数据;

3. 第三层:冷热数据分离(大幅降低活跃表体量)

  1. 热数据:3 个月内新评论、新车友动态,存在高性能 SSD MySQL,实时读写;
  2. 冷数据:超过 3 个月历史评论,归档到 ClickHouse / 离线数仓,线上前端不展示、不参与实时查询; 线上活跃分片只保留近期热数据,单表压力直接砍 70%;

4. 第四层:大字段垂直分表(减少单行体积,提升缓存命中率)

评论、文章的长文本、图片链接单独拆成content_ext 表

  • comment_base:id、user_id、target_id、点赞数、状态(高频查询,行很小,大量缓存到内存)
  • comment_text:id、完整文本、图片地址(低频读取,大字段单独存储) 避免一行数据过大,缓冲池存不下索引,磁盘 IO 飙升。

三、读写分离:扛住海量查询压力

每套业务库标准一主多从:

  1. 主库:只负责写入(发布文章、发评论、点赞);
  2. 从库集群:所有页面查询、列表分页、后台报表全部走从库;
  3. 预发 lf 环境同样配置主从,每日同步生产全量脱敏数据,从库用来压测、验证慢 SQL; 优势:前端百万次页面查询完全不占用主库 IO,DDL 变更只影响写入,不阻塞用户浏览。

四、重点回答你最关心的:亿级大表扩字段、改结构,怎么做到不影响线上(配合 lf 预发流程)

前提:所有 DDL 变更,必须先在 www-lf 预发完整验证

lf 预发库是1:1 复刻生产分片结构、数据量、硬件磁盘介质,低配硬件靠 cgroup 限流 IO 模拟生产压力,同时回放生产 binlog 复刻并发读写,提前测出锁表、IO 打满风险。

线上分三套方案分级使用:

方案 1:MySQL8.0 INSTANT 轻量新增可空字段(首选,毫秒无锁)

ALTER TABLE comment_0 ADD COLUMN audit_tag TINYINT NULL INSTANT;

仅修改元数据,不拷贝数据,千万 / 亿级分片表瞬间完成,业务零感知;

限制:不能加 NOT NULL、不能带默认值。

方案 2:必须加默认值 / 非空、改字段、新增索引(gh-ost 无锁工具)

懂x帝高并发 UGC 表统一用 gh-ost,原理:

  1. 伪装成 MySQL 从库拉取 binlog 同步增量,不创建触发器,几乎不损耗主库写入性能;
  2. 新建影子分片表,分批拷贝存量数据,自动限速、主从延迟过高自动暂停;
  3. 数据完全同步后,原子 RENAME 切换表,毫秒切换,无长时间锁表; pt-osc 触发器会增加主库写入压力,高并发评论库基本不用。

方案 3:极端复杂变更(删字段、改主键、大字段重构)—— 双写迁移,零风险

  1. 在 lf 预发全分片验证迁移脚本、数据一致性;
  2. 线上新建一套完整分片(comment_new_0~127);
  3. 应用层双写:新增评论同时写入旧分片、新分片;
  4. 分批迁移历史存量,全量校验 CRC 数据一致;
  5. 切前端读流量到新分片,稳定运行一周后下线旧表; 全程不执行任何 ALTER 修改原线上大表,彻底杜绝锁表雪崩。

标准化变更流程(懂x帝内部规范)

  1. 开发在 lf 预发执行 DDL + binlog 流量回放压测,确认无 IO / 锁冲突;
  2. 低峰凌晨执行 gh-ost/INSTANT 变更,全程监控主库 CPU、IO、主从延迟;
  3. 变更完成后,lf 预发同步执行相同 DDL,保持预发与生产结构永久对齐。

五、缓存分层:90% 查询不走 MySQL,从源头降低表压力

海量数据不靠数据库硬扛,多级缓存兜底:

  1. 本地缓存:车型、配置字典、热门文章基础信息,应用内存缓存;
  2. Redis 集群分片缓存:视频首页评论、文章点赞数、分页列表,热点数据全部缓存;
  3. 只有缓存未命中,才穿透到 MySQL 从库; 哪怕评论表亿级,日常 90% 用户访问命中缓存,数据库压力极低。

六、时序 / 日志海量数据:直接脱离 MySQL,不用硬扛

用户浏览埋点、设备访问日志、统计指标,完全不进 MySQL

  1. 实时写入 Kafka;
  2. 准实时落地 ClickHouse 做报表、用户行为分析;
  3. 离线同步 Bytelake 数据仓库做数仓统计(懂x帝二手车数仓方案); MySQL 只存可修改、带事务的业务数据,纯流水时序数据不占用数据库分片资源。

七、落地到你企业内部系统(人事 / OEE,可直接复用这套思路)

你的 OEE 设备上报、考勤流水、培训记录未来也会变成超大表,照搬这套轻量化简化版:

  1. 垂直分库:人事库、生产采集库分开;
  2. 时序流水表(设备上报)按月水平分表;
  3. 冷热分离:超过 1 年采集数据归档时序库,线上只查近 3 个月;
  4. 所有扩字段 DDL 先在内网 hr-lf 预发全量数据压测验证;
  5. 大表变更统一用 gh-ost 在线无锁工具,白天业务完全不受影响;
  6. 高频查询数据 Redis 缓存,减少数据库并发压力。

一句话总结懂x帝海量数据库核心逻辑

  1. 分库分表 + 冷热归档从根源消灭亿级超大单表,把每张物理表控制在千万行内;
  2. 读写分离 + 多级缓存,绝大多数查询不碰主库;
  3. 大表结构变更分层工具(INSTANT/gh-ost/ 双写迁移),全程不阻塞线上业务;
  4. www-lf 预发环境 1:1 复刻分片、数据、压力,所有高危 DDL 提前踩坑;
  5. 纯时序流水数据剥离 MySQL,用专业时序数仓承载,不拖累业务库。
阅读剩余
THE END