实体关系

集群、实例、服务、节点的定义与关系。

本节详细介绍 Pigsty 逻辑模型中各实体的定义、属性和相互关系。


集群(Cluster)

集群是 Pigsty 中最重要的逻辑实体,是自治的业务服务单元。

定义

  • 由一组通过复制关联的数据库实例组成
  • 有且仅有一个主库(Primary)
  • 可以有零个或多个从库(Replica)
  • 作为顶级命名空间,衍生出实例名和服务名

属性

属性 说明 示例
名称 集群的唯一标识符 pg-test
成员 组成集群的实例列表 pg-test-1, pg-test-2
服务 集群对外暴露的服务 pg-test-primary

集群类型

┌─────────────────────────────────────────────────────────────────┐
│                        标准集群                                  │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐                         │
│  │ Primary │─►│ Replica │─►│ Replica │                         │
│  └─────────┘  └─────────┘  └─────────┘                         │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                        级联复制                                  │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐                         │
│  │ Primary │─►│ Replica │─►│ Cascade │                         │
│  └─────────┘  └─────────┘  └─────────┘                         │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                        备库集群                                  │
│  ┌─────────┐      ┌─────────┐  ┌─────────┐                     │
│  │ Primary │─ ─ ─►│ Standby │─►│ Replica │                     │
│  │ (集群A) │      │ (集群B) │  │ (集群B) │                     │
│  └─────────┘      └─────────┘  └─────────┘                     │
└─────────────────────────────────────────────────────────────────┘

实例(Instance)

实例是运行在节点上的单个数据库服务器。

定义

  • 一个 PostgreSQL 进程及其数据文件
  • 由集群名和序号唯一标识
  • 具有明确的复制角色

属性

属性 说明 示例
名称 ${cluster}-${seq} pg-test-1
序号 集群内唯一的正整数 1
角色 复制拓扑中的角色 primary
节点 运行实例的节点 IP 10.10.10.11

实例角色

角色 说明 特点
primary 主库 唯一,可读写,产生 WAL
replica 从库 只读,承载在线流量
offline 离线库 只读,不承载在线流量
delayed 延迟库 延迟复制,用于数据恢复

服务(Service)

服务是集群能力的命名抽象,通过 HAProxy 对外暴露。

定义

  • 将流量路由到符合条件的实例
  • 通过端口号区分不同服务
  • 名称由集群名和角色后缀组成

默认服务

服务 端口 目标 用途
primary 5433 主库 读写业务
replica 5434 从库 只读业务
default 5436 主库 管理直连
offline 5438 离线库 ETL/分析

服务路由

┌─────────────────────────────────────────────────────────────┐
│                        HAProxy                               │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  :5433 primary                                         │  │
│  │  目标: role=primary                                    │  │
│  │  路由: → pg-test-1 (primary)                          │  │
│  └───────────────────────────────────────────────────────┘  │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  :5434 replica                                         │  │
│  │  目标: role=replica                                    │  │
│  │  路由: → pg-test-2, pg-test-3 (replicas)              │  │
│  └───────────────────────────────────────────────────────┘  │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  :5438 offline                                         │  │
│  │  目标: role=offline 或 pg_offline_query=true          │  │
│  │  路由: → pg-test-3 (offline)                          │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

节点(Node)

节点是硬件资源的抽象。

定义

  • 运行 Linux 操作系统的计算资源
  • 可以是物理机、虚拟机或容器
  • 由 IP 地址唯一标识

属性

属性 说明 示例
IP 首要内网地址 10.10.10.11
主机名 节点名称 pg-test-1
集群 所属节点集群 pg-test

节点与实例

在 PGSQL 模块中,节点与实例是 1:1 部署关系:

┌─────────────────────────────────────────────────────────────┐
│                    节点 10.10.10.11                          │
│  ┌───────────────────────────────────────────────────────┐  │
│  │                  实例 pg-test-1                        │  │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐  │  │
│  │  │Postgres │  │Pgbouncer│  │ HAProxy │  │ Patroni │  │  │
│  │  │ :5432   │  │ :6432   │  │ :543x   │  │ :8008   │  │  │
│  │  └─────────┘  └─────────┘  └─────────┘  └─────────┘  │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

实例可以借用节点的身份,使主机名与实例名保持一致。


关系总结

Cluster (1) ───────┬──────► Instance (N)
    │              │             │
    │              │             │ 1:1 部署
    │              │             ▼
    │              └──────► Node (N)
    │
    └──────► Service (M)
                 │
                 │ 路由到
                 ▼
            Instance (subset)
关系 说明
集群 → 实例 一个集群包含多个实例
实例 → 节点 实例与节点 1:1 部署
集群 → 服务 一个集群暴露多个服务
服务 → 实例 服务路由到符合条件的实例