【DB吐槽大会】第1期——PG MVCC

简介: 大家好,这是DB吐槽大会,第1期 - PG MVCC

背景

1、产品的问题点

MVCC, 旧版本与新版本在同类文件中.
垃圾回收不及时将导致:
数据文件膨胀.
如果新行不在同一个page内, 则发生了行迁移, 那么即使index字段的值没有变化, INDEX指向也需要变化, 导致index IO, 以及index膨胀.

2、问题点背后涉及的技术原理

解决并发事务读到的tuple版本可能不同的需求.
有的产品会使用专门的undo来存储历史版本.

3、这个问题将影响哪些行业以及业务场景

高频更新, 高频插入+删除的场景.
例如传感器的最新值更新, 出租车的位置更新, 配送员的位置更新, 游戏账号的实时更新等场景.
当然不是说有更新就一定有膨胀问题, 而是垃圾回收不及时会产生膨胀问题. 那么什么时候可能垃圾回收不及时呢?

《如何使用5why分析法发现数据库膨胀现象背后的本质?》

  • 因为有未结束的2pc, 有未结束的事务, 有执行中的query, 这些query或事务可能是long long ago就开在那的. 这些已删除的老版本可能是在这些事务之后被删除的, 可能还要被访问到. 所以autovacuum不能清除它们.
  • 或者 autovacuum回收太慢(比如你花钱雇了个工人, 但是他在休息.)
  • 或者 autovacuum回收时index被扫描了若干遍. 《PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem》
  • 或者 磁盘性能太烂
  • 或者 autovacuum worker数量太少

4、会导致什么问题?

膨胀后存储空间增加、IO的范围增加、内存消耗增加. 性能下降.

5、业务上应该如何避免这个坑

  • snapshot too old参数配置.
  • 设置参数, 不让autovacuum休息或者少休息.
  • 设置参数或监控, 别产生长事务, 2pc, long long ago query.
  • 调大存放临时dead tuple head的内存, 别让一次垃圾回收过程收集的dead tuple head存储超过内存maintenance_work_mem or autovacuum_work_mem
  • 分区, 同样也是解决上面这个问题.
  • 使用IO延迟较小的ssd.

6、业务上避免这个坑牺牲了什么, 会不会引入新的问题

需要IO延迟更低的硬盘.
需要牺牲长事务.
需要增加监控项, 发生膨胀后需要vacuum full或在线repack, 增加了维护成本.

7、数据库未来产品迭代如何修复这个坑

基于undo的存储引擎. 例如zheap, zedstore等引擎.

相关文章
|
存储 OLAP OLTP
漫谈OceanBase 列式存储
列式存储主要的目的有两个: 大部分OLAP查询只需要读取部分列而不是全部列数据,列式存储可以避免读取无用数据; 将同一列的数据在物理上存放在一起,能够极大地提高数据压缩率。 OLAP和OLTP OLAP,也叫联机分析处理(Online Analytical Processing)系统,有的时候也叫DSS决策支持系统,就是我们说的数据仓库。
7004 0
|
机器学习/深度学习 自然语言处理 安全
ACL 2025 | GALLa:用图结构增强代码大模型,让代码理解更精准!
通过级联多模态架构将代码结构图对齐到大模型表征中
1101 69
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课15 集成DeepSeek等大模型
本文介绍了如何在PolarDB数据库中接入私有化大模型服务,以实现多种应用场景。实验环境依赖于Docker容器中的loop设备模拟共享存储,具体搭建方法可参考相关系列文章。文中详细描述了部署ollama服务、编译并安装http和openai插件的过程,并通过示例展示了如何使用这些插件调用大模型API进行文本分析和情感分类等任务。此外,还探讨了如何设计表结构及触发器函数自动处理客户反馈数据,以及生成满足需求的SQL查询语句。最后对比了不同模型的回答效果,展示了deepseek-r1模型的优势。
1204 3
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课13 单机版转换为集群版
本文介绍如何将“本地存储实例”转换为“共享存储实例”,依赖于先前搭建的实验环境。主要步骤包括:准备PFS二进制文件、格式化共享盘为pfs文件系统、启动pfsd服务、停库并拷贝数据到pfs内、修改配置文件,最后启动实例。通过这些操作,成功实现了从本地存储到共享存储的转换,并验证了新实例的功能。相关系列文章和视频链接提供了更多背景信息和技术细节。
522 0
|
关系型数据库 分布式数据库 PolarDB
PolarDB开源数据库进阶课9 读写分离
本文介绍了如何配置读写分离工具pgpool-II for PolarDB,使应用程序能够透明地实现读写分离。
656 1
|
存储 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 8 数据库生态
PolarDB是一款开源的云原生分布式数据库,源自阿里云商业产品。为降低使用门槛,PolarDB携手伙伴打造了完整的开源生态,涵盖操作系统、芯片、存储、集成管控、监控、审计、开发者工具、数据同步、超融合计算、ISV软件、开源插件、人才培养、社区合作及大型用户合作等领域。通过这些合作伙伴,PolarDB提供了丰富的功能和服务,支持多种硬件和软件环境,满足不同用户的需求。更多信息请访问[PolarDB开源官方网站](https://openpolardb.com/home)。
940 4
|
负载均衡 关系型数据库 PostgreSQL
【一文搞懂PGSQL】6. PostgreSQL + pgpool-II 实现读写分离
本文介绍了如何使用 PostgreSQL 和 pgpool-II 实现读写分离。pgpool-II 支持连接池、负载均衡等功能,适用于多种模式。文中详细描述了安装、配置及启动过程,并提供了示例命令,帮助读者快速搭建并验证读写分离环境。通过配置 `pgpool.conf` 文件指定监听地址、端口及节点信息等参数,确保系统的高效运行与故障转移。

热门文章

最新文章