# 架构

> INFRA 模块中的架构与实体
---

标准 Pigsty 部署包含 [**`INFRA`**](/zh/docs/infra/) 模块，默认提供以下服务：

![](/img/pigsty/infra.png)

这些组件为生产级 PostgreSQL 服务提供必要的基础设施。

| 组件 | 端口 | 域名 | 说明 |
|:---:|:---:|:---:|---|
| `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` | - | ICMP、TCP、HTTP 探测 |
| `dnsmasq` | `53` | - | 可选 DNS 服务器 |
| `chronyd` | `123` | - | 可选 NTP 时间服务器 |

**不使用 INFRA 也能部署高可用 PostgreSQL**

如果不需要这些组件，可使用[最小化安装](/zh/docs/install/minimal)，在不安装
INFRA 模块的情况下部署高可用 PostgreSQL。

- [Nginx](#nginx)：本地仓库 Web 服务器及其他 Web UI 的反向代理
- [Grafana](#grafana)：指标、仪表板和数据分析的可视化平台
- [Loki](#loki)：通过 Grafana 查询的集中日志系统
- [Prometheus](#prometheus)：采集、保存指标并计算告警的时序数据库
- [AlertManager](#alertmanager)：聚合、静默并投递告警
- [PushGateway](#prometheus)：接收一次性任务与批处理任务指标
- [BlackboxExporter](#blackbox-exporter)：探测节点 IP 与 VIP 的可达性
- [DNSMASQ](#dnsmasq)：解析 Pigsty 内部域名
- [Chronyd](#chronyd)：保持节点时间同步

INFRA 并非高可用 PostgreSQL 的硬依赖，例如[最小化安装](/zh/docs/install/minimal)
就会省略它。但它提供生产集群通常需要的支撑服务，因此大多数部署都建议保留。

如果已有 Nginx、本地仓库、监控、DNS 或 NTP 基础设施，可以禁用对应组件，
并通过 [INFRA 配置](/zh/docs/infra/config/) 接入既有系统。

------

## Nginx {#nginx}

Nginx 是 Pigsty 所有 Web UI 的入口，默认监听 HTTP `80` 与 HTTPS `443`。
它代理 Grafana、Prometheus、AlertManager、HAProxy 控制台等 Web UI，同时提供
本地 YUM/APT 仓库等静态资源。

Nginx 根据 [`infra_portal`](/zh/docs/infra/param#infra_portal) 生成配置：

```yaml
infra_portal:
  home         : { domain: h.pigsty }
  grafana      : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" ,websocket: true }
  prometheus   : { domain: p.pigsty ,endpoint: "${admin_ip}:9058" }
  alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9059" }
  blackbox     : { endpoint: "${admin_ip}:9115" }
  loki         : { endpoint: "${admin_ip}:3100" }
  #minio        : { domain: sss.pigsty ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
```

其他服务会引用这些 `endpoint`：日志发送至 Loki，Grafana 数据源注册到 Grafana，
告警则投递给 AlertManager。Nginx 也可作为本地文件服务器或通用反向代理，并可
使用自签名证书或真实 HTTPS 证书。

- [DNS 配置教程](/zh/docs/admin/domain)
- [Nginx 服务暴露教程](/zh/docs/admin/portal)
- [Certbot HTTPS 证书教程](/zh/docs/admin/cert)

------

### 本地软件仓库 {#local-repo}

安装时，Pigsty 可在 INFRA 节点创建本地软件仓库，以加速后续安装。仓库位于
`/www/pigsty`，由 Nginx 通过 `http://h.pigsty/pigsty` 提供服务。

[离线软件包](/zh/docs/install/offline)就是预先构建好的仓库目录压缩包。如果
`/www/pigsty` 存在并带有 `/www/pigsty/repo_complete` 标记，Pigsty 会跳过上游
下载，适用于离线环境。

仓库定义文件为 `/www/pigsty.repo`，可通过以下命令获取：

```bash
curl -L http://h.pigsty/pigsty.repo -o /etc/yum.repos.d/pigsty.repo
```

也可以不经过 Nginx，直接使用文件仓库：

```ini
[pigsty-local]
name=Pigsty local $releasever - $basearch
baseurl=file:///www/pigsty/
enabled=1
gpgcheck=0
```

仓库参数参阅：[INFRA - REPO](/zh/docs/infra/param#repo)。

------

### Prometheus {#prometheus}

Prometheus 是 Pigsty v3.7 的监控时序数据库，监听 `9058`，可通过 `IP:9058` 或
`http://p.pigsty` 访问。它负责：

- 通过带身份标签的本地静态文件发现服务；
- 拉取、预处理并保存指标；
- 计算告警规则并将告警发送给 AlertManager。

------

## AlertManager {#alertmanager}

AlertManager 监听 `9059`（`IP:9059` 或 `http://a.pigsty`），负责接收、聚合、
静默和路由 Prometheus 告警。发送邮件等通知需要额外配置。

Prometheus、AlertManager、PushGateway 与 BlackboxExporter 参数参阅：
[INFRA - PROMETHEUS](/zh/docs/infra/param#prometheus)。

------

### Grafana {#grafana}

Grafana 监听 `3000`（`IP:3000` 或 `http://g.pigsty`）。Pigsty 的监控以仪表板和
URL 导航为核心，可在全局、集群、实例、数据库和对象之间快速下钻或上卷。

Pigsty 还预装 ECharts 等可视化插件，因此 Grafana 也可用于低代码数据应用。
Loki 在 `3100` 端口保存日志，节点上的 Promtail 将日志发送到 Loki。

参数参阅：[INFRA - GRAFANA](/zh/docs/infra/param#grafana) 与
[INFRA - Loki](/zh/docs/infra/param#loki)。

------

### Ansible {#ansible}

Ansible 会在[引导](/zh/docs/install/start#download)时安装到
[管理节点](/zh/docs/node/arch#admin-node)。INFRA 节点上的 Ansible 通常不会被
使用，但当管理节点不可用时可作为备用控制入口。

------

### DNSMASQ {#dnsmasq}

DNSMASQ 为 Pigsty 内部域名提供解析，其他模块会将域名记录注册到 INFRA 的
DNSMASQ。记录保存在所有 INFRA 节点的 `/etc/hosts.d/`。

参数参阅：[INFRA - DNS](/zh/docs/infra/param#dns)。Pigsty 内部仍主要使用
`/etc/hosts` 静态记录，因此 DNSMASQ 只是便利功能。

------

### Chronyd {#chronyd}

Chronyd 用于保持所有节点时间同步。参数参阅：
[NODE - NTP](/zh/docs/node/param#node_time)。如果已有 NTP 服务，可以不启用它。
