实体关系
集群、实例、服务、节点的定义与关系。
本节详细介绍 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 部署 |
| 集群 → 服务 | 一个集群暴露多个服务 |
| 服务 → 实例 | 服务路由到符合条件的实例 |