Lyst Engineering Blog 中的数据库与性能优化案例
Lyst Engineering Blog 里与数据库和性能优化直接相关的案例主要有三类:Postgres 列变更的最小停机迁移、70GB Django 会话数据的存储迁移,以及用 New Relic 配合 Python profiler 做服务性能调优。这些文章的共同点是都从生产环境的真实约束出发——锁、依赖、数据量、线上流量——而不是只讲工具怎么用。如果你正面临类似的迁移或调优任务,可以按下面的分类找到对应参考。
用最小停机时间修改 Postgres 列
对应文章:Altering a Postgres Column with Minimal Downtime
这篇文章的切入点是:在线上库改一个列,真正的风险不在 ALTER 语句本身,而在它持有的锁和它牵连的依赖对象。
可借鉴的思路包括:
- 先理清依赖:视图、外键、索引、触发器、默认值等都可能依赖目标列,改列前需要确认哪些对象会受影响,否则迁移可能失败或产生意外行为。
- 理解锁的行为:不同
ALTER操作获取的锁级别不同,某些操作会阻塞读写。文章强调通过理解锁来安排迁移顺序,把停机窗口压到最小。 - 分步执行:把一次大变更拆成多个小步骤,逐步验证,避免单条语句长时间持锁。
适用条件:适合有线上流量、不能接受长时间锁表的 Postgres 库。如果你的库可以随意停机,直接改列更省事,不必套用这套流程。
迁移 70GB 会话数据:Django SessionStore 与 DB Router
对应文章:Django Session store and DB Router
这篇文章记录的是把 70GB 会话数据搬到新存储的过程,核心手段是两个:
- 自定义 SessionStore 类:接管会话的读写逻辑,让应用层可以在不改业务代码的前提下切换底层存储。
- DB Router:控制 Django 的数据库路由,把会话数据的读写导向新的存储,与原有业务库解耦。
这个方案的价值在于:会话数据量大、读写频繁,直接停机迁移不现实;通过自定义存储类加路由,可以做到平滑过渡。适用条件是使用 Django 且会话数据已经大到影响主库性能的场景。如果会话量很小,直接换存储后端即可,不需要引入自定义类和路由这层复杂度。
用 New Relic 和 Python profiler 做基础性能调优
对应文章:Basic service performance tuning New Relic and the python profiler
这是一篇偏入门的调优记录,组合使用两个工具:
- New Relic:从服务层面观察响应时间、吞吐和慢请求分布,定位是哪个服务或哪个环节慢。
- Python profiler:在代码层面下钻,找出具体是哪些函数或调用占用了时间。
两者配合的逻辑是:先用监控工具缩小范围,再用 profiler 精确定位,避免一上来就盲目 profile 整个服务。适用条件是需要先建立性能基线的服务;如果还没有任何监控,先接入监控比直接上 profiler 更有效。
这些案例的共性
| 案例 | 核心问题 | 关键手段 | 适用条件 |
|---|---|---|---|
| Postgres 列变更 | 锁与依赖导致停机 | 理清依赖、理解锁、分步执行 | 线上库、不能长时间锁表 |
| 会话数据迁移 | 70GB 数据无法停机搬 | 自定义 SessionStore + DB Router | Django、会话数据量大 |
| 服务性能调优 | 不知道慢在哪 | New Relic 定位 + profiler 下钻 | 已有或准备接入监控的服务 |
三个案例都体现了同一个取向:先搞清楚约束(锁、依赖、数据量、流量),再选工具和步骤。想深入某一篇,可以直接在 making.lyst.com 上按标题查找原文。