Author name: Clyde Jin

DBA

PostgreSQL 复制与高可用系列(一):从单点到集群,构建生产级数据基石

PostgreSQL 复制与高可用系列(一):从单点到集群,构建生产级数据基石 PostgreSQL 已成为无数企业核心系统的首选数据库,但单机部署始终是一个绕不开的问题:单点就是风险。当硬件故障、网络波动或人为误操作不期而至时,缺乏高可用架构的应用将面临不可预测的停机时间,甚至数据丢失。 本系列旨在系统梳理 PostgreSQL 复制与高可用技术,从原理到实践,从基础到进阶。作为开篇,本文将聚焦于核心概念、技术演进与关键原理,帮助读者建立完整的知识框架,为后续的动手实践打下坚实基础。 一、为什么要谈复制与高可用? 1.1 核心驱动力 在生产环境中建设高可用体系,根本目的是满足两个关键指标: RPO(Recovery Point Objective):能容忍的最大数据丢失量,即灾难发生后,最多能接受丢失多长时间的数据。 RTO(Recovery Time Objective):能容忍的最大恢复时间,即从故障发生到服务恢复,允许经过多长时间。 这两个指标直接决定了架构设计的走向。追求 RPO=0(零数据丢失)往往意味着采用同步复制,而这可能牺牲写入性能;追求极低 RTO […]

DBA

PostgreSQL 存储与索引系列(四):高级调优与内核机制——并发、日志、内存与分区

PostgreSQL 存储与索引系列(四):高级调优与内核机制——并发、日志、内存与分区 这是系列第四期,也是收官之篇。我们将深入 PostgreSQL 的高级特性与性能调优核心:并发控制与锁、事务隔离级别、预写日志(WAL)与检查点、关键内存参数调优,以及分区表的维护策略。结合前三期的存储和索引知识,你已具备构建高可用、高性能 PostgreSQL 系统的完整视图。 1. 并发控制与锁机制:避免踩踏的艺术 PostgreSQL 采用 MVCC(多版本并发控制) 实现读写不互斥,读不阻塞写,写不阻塞读。但某些操作(如 DDL、外键维护、显式锁)仍需传统锁机制。理解锁层级是避免死锁和性能瓶颈的前提。 表级锁模式(从弱到强) ACCESS SHARE:SELECT 获取,与 ROW EXCLUSIVE

DBA

PostgreSQL 存储与索引系列(三):查询优化实战——执行计划、统计信息与反模式诊断

PostgreSQL 存储与索引系列(三):查询优化实战——执行计划、统计信息与反模式诊断 这是系列第三期,聚焦查询优化。我们将深入解读执行计划,学习如何利用统计信息和 ANALYZE 做出正确决策,识别并避免常见的慢查询反模式,并借助 pg_stat_statements 等工具定位真实瓶颈。前两期关于存储页、可见性映射和各类索引的知识,将在这里融会贯通。 1. 执行计划:读懂 PostgreSQL 的每一步 EXPLAIN 是分析查询性能的首要工具。加上 ANALYZE 会真实执行并返回实际行数、耗时、内存等;加上 BUFFERS 可查看缓存命中情况;加上 VERBOSE 输出额外细节。 核心节点类型

DBA

PostgreSQL 存储与索引系列(二):索引的艺术——从 B-tree 到 BRIN 的全景指南

PostgreSQL 存储与索引系列(二):索引的艺术——从 B-tree 到 BRIN 的全景指南 这是系列第二期,聚焦 PostgreSQL 的索引世界。我们会逐一拆解 B-tree、Hash、GiST、GIN、BRIN 等索引的内部机理与适用场景,并介绍部分索引、表达式索引等高级特性。结合上一期关于存储页、ctid、可见性映射的知识,你将对索引如何加速查询、何时失效、如何选型有系统的认知。 0. 索引基础:快速回顾 索引本质:一种有序的“目录”结构,通过少数列的值快速定位表中行的物理位置(ctid:页号+偏移)。 访问路径:索引扫描 → 获取 ctid → 回表(除非是仅索引扫描,需借助

DBA

PostgreSQL 存储与索引系列(一):数据在磁盘上如何安放——表、页、TOAST 与 VACUUM

PostgreSQL 存储与索引系列(一):数据在磁盘上如何安放——表、页、TOAST 与 VACUUM 这是系列文章的第一期,专注 PostgreSQL 的存储核心:表与行的组织、磁盘页结构、大字段的 TOAST 技术,以及不可或缺的 VACUUM 机制。后文还会介绍表分区,为下一期索引专题打下坚实基础。 1. 从逻辑表到物理文件 在 PostgreSQL 中,每个用户表都对应着磁盘上的一个或多个文件。默认情况下,一张表的数据存储在以表 OID 命名的文件中(位于 $PGDATA/base/)。当表或索引超过

DBA

PostgreSQL 事务与并发系列 · 第五期

PostgreSQL 事务与并发系列 · 第五期 实战调优:事务的常见陷阱与最佳实践 前四期我们深入了 MVCC、锁、隔离级别与序列化异常。本期将把这些知识落地到生产环境的日常运维与开发中,剖析长事务、空闲事务、表膨胀、死锁超时等真实痛点,并提供一套可立即上手的监控、报警与优化方案。 一、长事务:性能与运维的头号杀手 1.1 为什么长事务如此危险? 阻止 VACUUM 清理:长事务持有的快照会让所有在它之后产生的死亡元组都无法被清理,导致表与索引持续膨胀。 事务 ID 回卷风险:事务 ID 是 32 位环状空间,长事务可能导致

DBA

PostgreSQL 事务与并发系列 · 第四期

PostgreSQL 事务与并发系列 · 第四期 事务隔离级别深度测试与序列化异常 前三期我们构建了从 MVCC 到锁机制的完整知识体系。本期将聚焦三种隔离级别的实际行为边界,通过可复现的案例演示“不可重复读”“幻读”以及最隐蔽的“写偏斜(Write Skew)”,同时揭开 PostgreSQL 可串行化快照隔离(SSI)的神秘面纱。 一、隔离级别速览与默认行为回顾 PostgreSQL 支持三种隔离级别(READ UNCOMMITTED 实际等同于 READ COMMITTED): 隔离级别 脏读

DBA

PostgreSQL 事务与并发系列 · 第三期

PostgreSQL 事务与并发系列 · 第三期 锁机制与死锁处理实战 前两期我们深入了 MVCC 与快照隔离,知道了“读不阻塞写”。但有些场景必须靠锁来强制串行化。本期将带你掌握 PostgreSQL 中各类锁的用法、冲突关系、死锁成因与排查,并提供生产环境可用的监控脚本。 一、为什么有了 MVCC 还需要锁? MVCC 主要解决了 读写冲突(读不阻塞写,写不阻塞读),但它无法解决 写写冲突 以及某些需要“绝对最新数据”的场景。 例如: 两个事务同时对同一行执行

DBA

PostgreSQL 事务与并发系列 · 第二期

PostgreSQL 事务与并发系列 · 第二期 深入 MVCC:可见性判断与事务快照揭秘 第一期我们建立了 ACID 和 MVCC 的基本概念。本期将掀开 MVCC 的引擎盖,剖析元组头部的 xmin/xmax、事务快照的内存结构,并通过实战案例看清“读已提交”与“可重复读”的本质差异。 一、回顾:MVCC 的核心思想 PostgreSQL 中,每一行数据(称为元组 tuple)在被修改时不会原地更新,而是插入一个新的行版本,旧的版本仍然留在数据页中。这些版本通过元组头部的两个事务 ID

DBA

PostgreSQL 事务与并发系列 · 第一期

PostgreSQL 事务与并发系列 · 第一期 从 ACID 到 MVCC:PostgreSQL 并发控制的核心思想 本系列将带你系统掌握 PostgreSQL 事务与并发的每一步。第一期从 ACID 原则谈起,揭开 MVCC 如何实现”读不阻塞写、写不阻塞读”。 一、引言 在关系型数据库的世界里,事务(Transaction)是数据一致性与并发控制的基石。PostgreSQL 之所以被公认为”业界最先进的开源关系型数据库”,其强大的事务处理能力和高并发支持功不可没。 理解

[quads id="805"]
Scroll to Top