# 概念：节点

> 从 Pigsty v1.5.1 标签恢复的历史文档。
---

> Pigsty使用**节点**（Node）进行安装与部署，节点可以是物理机，虚拟机，甚至Pod。



在Pigsty中有两种节点：[元节点 ](#元节点) 与（普通）[节点](#节点)。

元节点用于发起管理，普通节点是纳入Pigsty管理的节点。

* [元节点](#元节点)（Meta）：执行 [`infra.yml`](/zh/docs/p-infra/) 剧本安装Pigsty，安装 **INFRA**，**NODES**，**PGSQL** 三个模块。
* [节点](#节点)（Node）：通过 [`nodes.yml`](/zh/docs/p-nodes/#nodes) 剧本纳入管理的普通节点，默认安装 **NODES** 模块。



## 元节点

元节点即完整安装Pigsty，带有管理功能的节点，部署有完整的[基础设施](/zh/docs/c-infra/)组件。

当您在某节点上执行 `./configure` 时，当前节点会被默认作为元节点，填入[配置文件](/zh/docs/v-config/) `meta` 分组中。

在每套环境中，**Pigsty最少需要一个元节点，该节点将作为整个环境的控制中心**。元节点负责各种管理工作：保存状态，管理配置，发起任务，收集指标，等等。整个环境的基础设施组件，Nginx，Grafana，Prometheus，Alertmanager，NTP，DNS Nameserver，DCS都将部署在元节点上。

### 复用元节点


**元节点亦可复用为普通数据库节点**，在元节点上默认运行有名为 `pg-meta` 的PostgreSQL数据库集群。提供额外的扩展功能：CMDB，巡检报告，扩展应用，日志分析，数据分析与处理等

以Pigsty附带的四节点沙箱环境为例，组件在节点上的分布如下图所示：

![](/img/history/v1.5/SANDBOX.gif)

沙箱由一个[元节点](#元节点)与四个[普通节点](#节点)组成，这里元节点也被复用为一个普通节点。沙箱内部署有一套[基础设施](/zh/docs/c-infra/#概览)与两套[数据库集群](/zh/docs/c-pgsql/)。 `meta` 为元节点，部署有**基础设施**组件，同时被复用为普通数据库节点，部署有单主数据库集群`pg-meta`。 `node-1`，`node-2`，`node-3` 为普通数据库节点，部署有数据库集群`pg-test`。

### 元节点上的服务

元节点上默认运行的服务如下所示：

|             组件              | 端口 | 说明                          |   默认域名   |
| :---------------------------: | :--: | ----------------------------- | :----------: |
| Nginx        |  80  | 所有Web服务的入口，文件服务器 |   `pigsty`   |
| Yum      |  80  | 本地YUM软件源                 | `yum.pigsty` |
| Grafana      | 3000 | 监控系统/可视化平台           |  `g.pigsty`  |
| AlertManager | 9093 | 报警聚合管理组件              |  `a.pigsty`  |
| Prometheus   | 9090 | 监控时序数据库                |  `p.pigsty`  |
| Loki         | 3100 | 实时日志收集基础设施          |  `l.pigsty`  |
| Consul (Server) | 8500 | 分布式配置管理与服务发现      |  `c.pigsty`  |
| Docker       | 2375 | 运行无状态服务的容器平台      |      -       |
| PostgreSQL   | 5432 | Pigsty CMDB                   |      -       |
| Ansible      |  -   | 用于发起管理命令的组件        |      -       |
| Consul DNS | 8600 | Consul提供的DNS服务（可选）   |      -       |
| Dnsmasq      |  53  | DNS域名解析服务器（可选）     |      -       |
| NTP          | 123  | NTP时间服务器（可选）         |      -       |
|           Pgbouncer           | 6432 | Pgbouncer连接池服务 | - |
| Patroni | 8008 | Patroni高可用组件 | - |
| Haproxy Primary | 5433 | 集群读写服务（主库连接池）代理 | - |
| Haproxy Replica | 5434 | 集群只读服务（从库连接池）代理 | - |
| Haproxy Default | 5436 | 集群主库直连服务（用于管理，DDL/DML变更） | - |
| Haproxy Offline | 5438 | 集群离线读取服务（直连离线实例，用于ETL，交互式查询） | - |
| Haproxy Admin | 9101 | Haproxy监控指标与流量管理页面 | - |
| PG Exporter | 9630 | Postgres监控指标导出器 | - |
| PGBouncer Exporter | 9631 | Pgbouncer监控指标导出器 | - |
| Node Exporter | 9100 | 机器节点监控指标导出器 | - |
| Promtail | 9080 | 实时收集节点与数据库日志 | - |
| vip-manager | - | 将VIP绑定至集群主库上 |  |

![](/img/history/v1.5/ARCH.gif)



### 元节点与DCS

默认情况下，元节点上将部署元数据库 （Consul 或 Etcd），用户也可以使用已有的**外部DCS集群**。如果将DCS部署至元节点上，建议在**生产环境**使用3个元节点，以充分保证DCS服务的可用性。DCS外的基础设施组件都将以对等副本的方式部署在所有元节点上。元节点的数量要求最少1个，推荐3个，建议不超过5个。

> [!WARNING]
> DCS用于支持数据库高可用的故障检测与选主，**在默认模式停止DCS服务会导致所有数据库集群拒绝写入**，因此请务必确保DCS服务的可靠性（增加元节点数量，或使用外部独立维护的高可用DCS集群）。

### 使用多个元节点

复数个元节点是可能的，通常一个元节点足矣，两个元节点可以互为备份，三个元节点自身便足以部署生产级DCS Server集群。

本着开箱即用的原则，Pigsty默认在所有元节点上部署DCS Server。但如果单纯是为了追求DCS Server集群的高可用而使用超过3个管理节点并没有太大的意义。您可以使用一个外部维护管理的，3～5节点的DCS集群来保证DCS服务可用性。

元节点的特征是节点地址配置于配置文件的 `all.children.meta.host` 分组中，带有`meta_node: true` 标记。在 [`configure`](/zh/docs/v-config/#配置过程) 过程中，执行安装的当前节点会被配置为元节点，复数个元节点则需要手工配置，可参考三管理节点样例配置文件： [`pigsty-dcs3.yml`](https://github.com/pgsty/pigsty/blob/v1.5.1/files/conf/pigsty-dcs3.yml)。

如果您没有使用任何外部DCS集群服务作为仲裁者，那么有意义的高可用最少需要3个节点。如果您只有两个节点，建议主库故障时人工介入以避免脑裂出现。





## 节点

您可以使用Pigsty管理更多的节点，并使用这些节点部署数据库。

纳入Pigsty管理的节点会被 [`nodes.yml`](/zh/docs/p-nodes/#nodes) 调整至 [配置：NODES](/zh/docs/v-nodes/) 所描述的状态，加装节点监控与日志收集组件，您可以从监控系统中查阅节点状态与日志。被Pigsty管理的节点可以进一步用于部署各种**数据库**，或您自己的应用。

### 节点身份

每个节点都有[身份参数](/zh/docs/v-nodes/)，通过在`<cluster>.hosts`与`<cluster>.vars`中的相关参数进行配置。

在Pigsty中，节点有两个重要的身份参数： [`nodename`](/zh/docs/v-nodes/#nodename) 与 [`node_cluster`](/zh/docs/v-nodes/#node_cluster)，这两者将在监控系统中用作节点的 **实例标识**（`ins`） 与 **集群标识** （`cls`）。[`nodename`](/zh/docs/v-nodes/#nodename) 与 [`node_cluster`](/zh/docs/v-nodes/#node_cluster) 并不是必选参数，当留白或置空时，[`nodename`](/zh/docs/c-nodes/) 会使用节点当前的主机名，而 [`node_cluster`](/zh/docs/c-nodes/) 则会使用固定的默认值：`nodes`。

此外，Pigsty还会使用**IP地址**作为**数据库节点**的唯一标识， IP地址即配置清单中主机的`inventory_hostname` ，体现为`<cluster>.hosts`对象中的`key`。尽管一个节点可能有多块网卡和多个IP地址，但您必须指定一个首要IP地址作为节点唯一标识。**该地址应当为内网地址，即您访问该节点上的数据库时使用那个IP地址。**

该IP地址并不一定是管理节点SSH访问使用的IP地址，您可以通过 [`Ansible Connect`](/zh/docs/v-infra/#connect) 相关参数，通过SSH隧道或跳板机中转的方式间接操作管理目标节点。

|              名称               |   类型   | 层级  | 必要性   | 说明             |
| :-----------------------------: | :------: | :---: | -------- | ---------------- |
|      `inventory_hostname`       |   `ip`   | **-** | **必选** | **节点IP地址**   |
|     [`nodename`](/zh/docs/c-nodes/)     | `string` | **I** | 可选     | **节点名称**     |
| [`node_cluster`](/zh/docs/c-nodes/) | `string` | **C** | 可选     | **节点集群名称** |

以下集群配置声明了一个三节点集群：

```yaml
node-test:
  hosts:
    10.10.10.11: { nodename: node-test-1 }
    10.10.10.12: { pg_hostname: true } # 从PG借用身份 pg-test-2
    10.10.10.13: {  } # 不显式指定nodename，则使用原有hostname: node-3
  vars:
    node_cluster: node-test
```

|     host      | node_cluster |   nodename    |  instance   |
| :-----------: | :----------: | :-----------: | :---------: |
| `10.10.10.11` | `node-test`  | `node-test-1` | `pg-test-1` |
| `10.10.10.12` | `node-test`  |  `pg-test-2`  | `pg-test-2` |
| `10.10.10.13` | `node-test`  |   `node-3`    | `pg-test-3` |

在监控系统中，相关的时序监控数据标签为：

```json
node_load1{cls="pg-meta", ins="pg-meta-1", ip="10.10.10.10", job="nodes"}
node_load1{cls="pg-test", ins="pg-test-1", ip="10.10.10.11", job="nodes"}
node_load1{cls="pg-test", ins="pg-test-2", ip="10.10.10.12", job="nodes"}
node_load1{cls="pg-test", ins="pg-test-3", ip="10.10.10.13", job="nodes"}
```

### 节点默认服务

|     组件      | 端口 | 说明                                              |
| :-----------: | :--: | ------------------------------------------------- |
| Consul Agent  | 8500 | 分布式配置管理，服务发现组件Consul的本地Agent     |
| Node Exporter | 9100 | 机器节点监控指标导出器                            |
|   Promtail    | 9080 | 实时收集Postgres，Pgbouncer，Patroni日志 （选装） |
|  Consul DNS   | 8600 | Consul Agent提供的DNS服务                         |

### PGSQL节点服务

**PGSQL节点**是用于部署PostgreSQL集群的节点， 在标准节点上额外加装了 [PGSQL](/zh/docs/c-pgsql/) 模块。

在执行默认的PostgreSQL部署时，因为Pigsty默认采用节点独占1:1部署，因此可以通过 [`pg_hostname`](/zh/docs/v-pgsql/#pg_hostname) 参数，将数据库实例的身份参数（[`pg_cluster`](/zh/docs/v-pgsql/#pg_cluster) 与 `pg_instance`）借用至节点的 [`nodename`](/zh/docs/v-nodes/#nodename) 与 [`node_cluster`](/zh/docs/v-nodes/#node_cluster) 身份参数上。

除了 [节点默认服务](/zh/docs/c-nodes/#节点默认服务)) 外，PGSQL节点上运行有下列服务：

|        组件        | 端口 | 说明                                                  |
| :----------------: | :--: | ----------------------------------------------------- |
|      Postgres      | 5432 | Postgres数据库服务                                    |
|     Pgbouncer      | 6432 | Pgbouncer连接池服务                                   |
|      Patroni       | 8008 | Patroni高可用组件                                     |
|       Consul       | 8500 | 分布式配置管理，服务发现组件Consul的本地Agent         |
|  Haproxy Primary   | 5433 | 集群读写服务（主库连接池）代理                        |
|  Haproxy Replica   | 5434 | 集群只读服务（从库连接池）代理                        |
|  Haproxy Default   | 5436 | 集群主库直连服务（用于管理，DDL/DML变更）             |
|  Haproxy Offline   | 5438 | 集群离线读取服务（直连离线实例，用于ETL，交互式查询） |
| Haproxy `service`  | 543x | 集群提供的额外自定义服务将依次分配端口                |
|   Haproxy Admin    | 9101 | Haproxy监控指标与流量管理页面                         |
|    PG Exporter     | 9630 | Postgres监控指标导出器                                |
| PGBouncer Exporter | 9631 | Pgbouncer监控指标导出器                               |
|   Node Exporter    | 9100 | 机器节点监控指标导出器                                |
|      Promtail      | 9080 | 实时收集Postgres，Pgbouncer，Patroni日志 （选装）     |
|     Consul DNS     | 8600 | Consul提供的DNS服务                                   |
|    vip-manager     |  -   | 将VIP绑定至集群主库上                                 |



## 节点交互

以单个 [元节点](#元节点) 和 单个 [节点](/zh/docs/c-nodes/) 构成的环境为例，架构如下图所示：

![](/img/history/v1.5/ARCH.gif)

元节点与数据库节点之间的交互主要包括：

* 数据库集群/节点的域名依赖元节点的Nameserver进行**解析** （可选）。
* 数据库节点软件**安装**需要用到元节点上的Yum Repo。
* 数据库集群/节点的监控**指标**会被元节点的Prometheus收集。
* 数据库的日志会被Promtail收集并发往Loki。
* Pigsty会从元节点上发起对数据库节点的**管理**:

  * 执行集群创建，扩缩容，实例/集群回收
  * 创建业务用户、业务数据库、修改服务、HBA修改；
  * 执行日志采集、垃圾清理，备份，巡检等

* 数据库节点的Consul会向元节点的DCS同步本地注册的服务，并代理状态读写操作。
* 数据库节点会从元节点（或其他NTP服务器）同步时间l
