重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
PG环境下数据库集簇,集群服务及实例几者的关系
[打印本页]
作者:
郑全
时间:
2025-8-1 09:57
标题:
PG环境下数据库集簇,集群服务及实例几者的关系
本帖最后由 郑全 于 2025-8-1 10:00 编辑
在 PostgreSQL(简称 PG)环境中,“数据库实例”“数据库集簇”“集群服务” 是三个既相关又有明确区别的概念。它们分别对应 PG 运行的基础单元、数据组织形式以及多节点协同架构,理解这些概念对 PG 的部署、管理和优化至关重要。
一、PostgreSQL 数据库实例(Database Instance)
PG 实例是数据库软件运行时的具体 “工作实体”,是支撑所有数据库操作的核心。
概念
PG 实例由后台进程
和内存结构
组成,负责处理用户请求(如 SQL 执行、数据读写)、管理数据访问,并与磁盘上的数据库文件交互。简单来说,它是 PG 软件启动后在内存中形成的 “动态运行环境”。
核心构成
后台进程:PG 启动时会生成一系列核心进程,例如:
postmaster:主进程,负责监听客户端连接、启动其他子进程、处理故障恢复等;
postgres:为每个客户端连接创建的子进程,负责执行具体的 SQL 语句;
bgwriter:后台写进程,将内存中的脏数据定期刷入磁盘,减少事务提交时的 I/O 压力;
checkpointer:检查点进程,定期触发检查点,确保内存数据与磁盘数据的一致性。
内存结构:PG 实例占用的内存分为多个区域,例如:
shared_buffers:共享缓冲区,缓存磁盘上的数据块,是提升查询性能的核心内存区域;
work_mem:为排序、哈希等操作分配的内存,影响复杂查询的执行效率;
maintenance_work_mem:为索引创建、数据导入等维护操作分配的内存。
特点
一一对应的数据目录:一个 PG 实例必须关联一个[color=var(--md-box-samantha-deep-text-color) !important]数据目录(通过 PGDATA 环境变量指定),实例启动时从该目录加载配置、读取数据文件。
独立性:每个实例有独立的端口(默认 5432)、进程和内存,不同实例之间互不干扰(即使运行在同一台服务器上)。
启动与管理:通过 pg_ctl 命令管理实例(启动 pg_ctl start、停止 pg_ctl stop、重启 pg_ctl restart)。
示例
在一台服务器上,可启动多个 PG 实例:
实例 1:端口 5432,数据目录 /var/lib/postgresql/14/main,用于生产环境;
实例 2:端口 5433,数据目录 /var/lib/postgresql/14/test,用于测试环境。
二、PostgreSQL 数据库集簇(Database Cluster)
“数据库集簇” 是 PG 中一个特定术语
(注意:与 “集群服务” 不同),指的是由单个实例管理的所有数据库及相关文件的集合
。
概念
当通过 initdb 命令初始化 PG 时,会创建一个数据目录,该目录下的所有文件(数据文件、配置文件、日志文件等)共同构成 “数据库集簇”。一个集簇包含多个数据库(如默认的 postgres 数据库、template1 模板数据库),但这些数据库共享同一个实例的进程和内存结构。
核心组成
数据库:集簇中可创建多个独立数据库(如 db1、db2),每个数据库有自己的表、索引等对象,且数据库之间默认隔离(用户需通过 \c dbname 切换数据库)。
系统目录:存储集簇级元数据的特殊表(如 pg_database 记录所有数据库信息、pg_user 记录用户信息),属于 template1 模板数据库,会被新数据库继承。
配置文件:如 postgresql.conf(实例参数配置)、pg_hba.conf(访问控制策略)、pg_ident.conf(用户映射配置),位于数据目录的根目录。
日志与临时文件:如 pg_log 目录(日志文件)、pg_tblspc 目录(表空间链接)等。
特点
单实例管理:一个数据库集簇只能被一个 PG 实例管理(实例启动时加载该集簇的配置和数据)。
逻辑隔离:集簇内的多个数据库通过命名空间隔离,但底层共享实例的资源(内存、进程),因此并非完全独立的 “物理隔离”。
初始化:通过 initdb 命令创建集簇(如 initdb -D /var/lib/postgresql/14/main),这是部署 PG 的第一步。
示例
初始化一个集簇后,默认包含 3 个数据库:postgres(默认连接数据库)、template0(不可修改的模板)、template1(新数据库的模板)。用户可通过 CREATE DATABASE db1; 在该集簇中创建新数据库。
三、PostgreSQL 集群服务(Cluster Service)
PG 本身是单进程架构,不直接支持 “集群” 功能,但通过 外部工具、复制技术或扩展
,可将多个 PG 实例(分布在不同节点)组成 “集群服务”,以实现高可用、负载均衡或分布式处理。
概念
PG 集群服务是指 多个独立的 PG 实例(节点)通过网络协同工作
,对外提供统一的数据库服务。这些节点可能包含主节点(处理写操作)、从节点(处理读操作或备用),并通过复制机制保持数据同步。
常见架构与实现方式
主从复制集群
基于 PG 内置的 流复制(Stream Replication)技术,主节点将 WAL(Write-Ahead Log,预写日志)实时发送到从节点,从节点通过重放 WAL 保持数据与主节点一致。
特点:主节点负责写操作,从节点可分担读压力(读写分离);主节点故障时,从节点可提升为主节点(故障转移)。
工具支持:需配合 pg_rewind(修复脑裂)、Patroni(自动故障转移)、pgpool-II(负载均衡)等工具实现自动化管理。
分布式集群(分片集群)
通过扩展(如 Citus)将数据分片存储在多个节点,每个节点存储部分数据,协同处理查询。
特点:支持海量数据存储和高并发查询,适合 OLAP 或大规模 OLTP 场景;查询时由协调节点分发任务到分片节点,再汇总结果。
多主集群
多个节点均可处理写操作,通过同步机制(如 Bucardo)保持数据一致。但复杂度高,易出现冲突,较少用于生产环境。
核心功能
高可用性:通过冗余节点避免单点故障(如主节点故障后,从节点自动接管)。
负载均衡:将读请求分发到多个从节点,减轻主节点压力(如 pgpool-II 实现)。
可扩展性:通过添加节点提升存储容量或计算能力(如 Citus 集群横向扩展)。
示例
一个典型的电商 PG 集群:
主节点:处理订单创建、库存更新等写操作;
2 个从节点:分担商品查询、用户浏览记录等读操作;
用 Patroni 监控节点状态,主节点故障时自动将从节点切换为主节点,确保服务不中断。
总结:三者的关系
数据库实例是 PG 运行的动态单元(进程 + 内存),负责处理所有操作,关联一个数据目录;
数据库集簇是实例管理的静态数据集合(数据文件 + 配置 + 多个数据库),存在于数据目录中;
集群服务是多个实例(可能分布在不同服务器)通过协同机制组成的整体,用于提升可用性、扩展性。
简单来说:一个实例管理一个集簇,多个实例组成一个集群服务。
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2