# 架构

> 节点类型、架构与核心概念
---

[“节点”](/zh/docs/prepare/hardware#node)是可通过 SSH [访问](#accessibility)、
并提供裸 Linux 环境的资源。它可以是物理机、虚拟机，也可以是带有 `systemd`、
`sudo` 和 `sshd` 的类操作系统容器。

Pigsty 中有三类节点；在[单节点部署](/zh/docs/install/start)中，它们是同一台机器。

| 节点类型 | 说明 |
|---|---|
| [管理节点](#admin-node) | 安装 Pigsty 并发出管理命令的节点 |
| [基础设施节点](#infra-node) | 安装 [`INFRA`](/zh/docs/infra/) 模块的节点 |
| [普通节点](#common-node) | 所有由 Pigsty 管理的节点，包括管理与基础设施节点 |

------

## 示例 {#example}

下面的四节点[沙箱](/zh/docs/prepare/sandbox)包含四个普通节点，其中
`10.10.10.10` 同时是基础设施节点和管理节点。

```yaml
all:
  children:
    infra:   { hosts: { 10.10.10.10: { infra_seq: 1 } } }  # <--- 标记为基础设施节点
    etcd:    { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
    pg-meta: { hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }, vars: { pg_cluster: pg-meta } }
    pg-test:
      hosts:
        10.10.10.11: { pg_seq: 1, pg_role: primary }
        10.10.10.12: { pg_seq: 2, pg_role: replica }
        10.10.10.13: { pg_seq: 3, pg_role: replica }
      vars: { pg_cluster: pg-test }
  vars:
    admin_ip: 10.10.10.10    # <--- 标记管理节点
```

------

## 普通节点 {#common-node}

普通节点默认启用以下组件：

| 组件 | 端口 | 说明 | 默认状态 |
|:---:|:---:|---|---|
| `node_exporter` | `9100` | 节点监控指标导出器 | 启用 |
| `haproxy` | `9101` | HAProxy 管理与指标端口 | 启用 |
| `promtail` | `9080` | 日志采集代理 | 启用 |

以下组件为可选项，可通过参数启用：

| 组件 | 端口 | 说明 | 默认状态 |
|:---:|:---:|---|---|
| `docker` | `9323` | 容器服务及指标端口 | 禁用 |
| `keepalived` | - | 管理节点集群二层 VIP | 禁用 |
| `keepalived_exporter` | `9650` | 监控 Keepalived 状态 | 禁用 |

------

## 管理节点 {#admin-node}

[管理节点](/zh/docs/prepare/admin)是最先安装 Pigsty、并发出全部控制命令的节点。
每套 Pigsty 部署只有一个管理节点，由 [`admin_ip`](/zh/docs/infra/param#admin_ip)
指定；[配置](/zh/docs/config/configure)时会将其设置为管理节点的主 IP。

**保护管理节点访问**

管理节点需要通过免密 [`ssh`](/zh/docs/prepare/admin#ssh) 和
[`sudo`](/zh/docs/prepare/admin#sudo-privileges) 管理其他节点。未经授权的访问风险
很高，请妥善保护管理节点。

**管理节点是最先安装 Pigsty 的节点**

管理节点用于向其他节点发出命令，通常与第一个 INFRA 节点重合。

**本地笔记本也可作为管理节点**

可以在本地笔记本或 Mac 上准备 Pigsty 与 Ansible，并从本机发出管理命令。

------

## 基础设施节点 {#infra-node}

一套部署可以有一个或多个 INFRA 节点；生产环境建议至少两个。配置清单中的
`infra` 分组指定这些节点，并在其上安装 [INFRA](/zh/docs/infra/) 模块。

| 组件 | 端口 | 域名 | 说明 |
|:---:|:---:|:---:|---|
| `nginx` | `80` | `h.pigsty` | Web 服务入口与 YUM/APT 仓库 |
| `alertmanager` | `9059` | `a.pigsty` | 告警聚合与投递 |
| `prometheus` | `9058` | `p.pigsty` | 监控时序数据库 |
| `grafana` | `3000` | `g.pigsty` | 可视化平台 |
| `loki` | `3100` | - | 日志收集服务器 |
| `pushgateway` | `9091` | - | 一次性任务指标入口 |
| `blackbox_exporter` | `9115` | - | 黑盒探测 |
| `dnsmasq` | `53` | - | DNS 服务 |
| `chronyd` | `123` | - | NTP 服务 |
| `ansible` | - | - | 执行 Playbook |

------

## PGSQL 节点 {#pgsql-node}

安装 [PGSQL](/zh/docs/pgsql/) 模块的节点称为 PGSQL 节点。节点与 PostgreSQL
实例按 1:1 部署；[`node_id_from_pg`](/zh/docs/node/param#node_id_from_pg) 可让
节点复用 PostgreSQL 实例身份。

| 组件 | 端口 | 说明 | 状态 |
|:---:|:---:|---|---|
| `postgres` | `5432` | 由 Patroni 管理的 PostgreSQL 服务 | 启用 |
| `pgbouncer` | `6432` | 连接池 | 启用 |
| `patroni` | `8008` | PostgreSQL 高可用组件 | 启用 |
| `primary` @ `haproxy` | `5433` | 主库连接池，读写服务 | 启用 |
| `replica` @ `haproxy` | `5434` | 从库连接池，只读服务 | 启用 |
| `default` @ `haproxy` | `5436` | 主库直连服务 | 启用 |
| `offline` @ `haproxy` | `5438` | 离线实例直连服务 | 启用 |
| `pg_exporter` | `9630` | PostgreSQL 指标导出器 | 启用 |
| `pgbouncer_exporter` | `9631` | PgBouncer 指标导出器 | 启用 |
| `pgbackrest_exporter` | `9854` | pgBackRest 指标导出器 | 启用 |
| `vip-manager` | - | 将 VIP 绑定到主库 | 禁用 |
