【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等引擎.

相关文章
|
SQL 存储 算法
TPCC测试究竟意味着什么
最近分布式数据库领域可谓非常之火(也可能是非常之卷),特别的,很多人会关注TPCC的测试结果,也有不少产品会投入很多精力在TPCC的优化上。 我们首先需要搞明白的是,我们从TPCC的测试结果,究竟能得出对这个分布式数据库什么样的评价。
4843 3
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
1835 0
|
存储 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 1 架构解读
PolarDB 是阿里云研发的云原生分布式数据库,基于 PostgreSQL 开源版本,旨在解决传统数据库在大规模数据和高并发场景下的性能和扩展性问题。其主要特点包括: 1. **存储计算分离架构**:通过将计算与存储分离,实现极致弹性、共享一份数据以降低成本、透明读写分离。 2. **HTAP 架构**:支持混合事务处理和分析处理(HTAP),能够在同一系统中高效执行 OLTP 和 OLAP 查询。 3. **优化的日志复制机制**:采用只复制元数据的方式减少网络传输量,优化页面回放和 DDL 锁回放过程。 4. **并行查询与索引创建**:引入 MPP 分布式执行引擎。
761 8
|
前端开发 JavaScript 编译器
如何利用 Babel 进行代码转换和优化?
如何利用 Babel 进行代码转换和优化?
829 158
|
关系型数据库 分布式数据库 PolarDB
PolarDB开源数据库进阶课9 读写分离
本文介绍了如何配置读写分离工具pgpool-II for PolarDB,使应用程序能够透明地实现读写分离。
582 1
|
存储 SQL 算法
PostgreSQL 14中TOAST的新压缩算法LZ4,它有多快?
PostgreSQL 14中TOAST的新压缩算法LZ4,它有多快?
1039 0
|
负载均衡 应用服务中间件 API
深入理解 Nginx 与 Kong 的配置与实践
在微服务架构中,Nginx 用于配置负载均衡,如示例所示,定义上游`pay-service`包含不同权重的服务节点。Kong API 网关则通过service和route进行服务管理和路由,与Nginx的upstream和location类似。通过Kong的命令行接口,可以创建upstream、target、service和route,实现对后端服务的负载均衡和请求管理。Nginx和Kong协同工作,提供高效、灵活的API管理和流量控制。
933 1
深入理解 Nginx 与 Kong 的配置与实践
|
存储 Cloud Native NoSQL
云原生必备概念 — CAP 定理、十二要素应用
云原生必备概念 — CAP 定理、十二要素应用
603 0
云原生必备概念 — CAP 定理、十二要素应用
|
安全 关系型数据库 MySQL
关于 linux 文件权限控制-SELinux
关于 linux 文件权限控制-SELinux
521 0
关于 linux 文件权限控制-SELinux