# 配置

> 描述您想要的集群
---

在部署之前，您必须在[配置清单](/zh/docs/config/inventory)中定义 etcd 集群。

通常您可以选择一个 etcd 集群：

- [单节点](#one-node)，无高可用性，仅具有 etcd 功能，适用于开发、测试和演示目的。
- [三节点](#three-nodes)，基本高可用性，容忍一个节点故障，适用于中等生产环境。
- [五节点](#five-nodes)，更好的高可用性，容忍两个节点故障，适用于大型生产环境。

使用偶数个 etcd 节点是没有意义的，超过五个节点也不常见。



------

## 单节点 {#one-node}

在清单中定义组 `etcd`，它将创建一个单例 etcd 实例。

```yaml
# etcd cluster for ha postgres
etcd: { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
```

这一行几乎存在于所有单节点[配置模板](/zh/docs/config/template)中，其中占位符 IP 地址 `10.10.10.10` 将被替换为当前管理节点 IP。

唯一必要的参数是 [`etcd_seq`](/zh/docs/etcd/param#etcd_seq) 和 [`etcd_cluster`](/zh/docs/etcd/param#etcd_cluster)，它们唯一地标识集群和每个实例。



------

## 三节点 {#three-nodes}

三节点 etcd 集群非常常见，容忍一个节点故障，适用于大多数情况。

`trio` 和 `safe` 配置模板使用三节点 etcd 集群，如下所示：

```yaml
etcd: # dcs service for postgres/patroni ha consensus
  hosts:  # 1 node for testing, 3 or 5 for production
    10.10.10.10: { etcd_seq: 1 }  # etcd_seq required
    10.10.10.11: { etcd_seq: 2 }  # assign from 1 ~ n
    10.10.10.12: { etcd_seq: 3 }  # use odd numbers
  vars: # cluster level parameter override roles/etcd
    etcd_cluster: etcd  # mark etcd cluster name etcd
    etcd_safeguard: false # safeguard against purging
```



------

## 五节点 {#five-nodes}

五节点 etcd 集群可以容忍两个节点故障，适用于大型生产环境。

在 [`prod`](/zh/docs/config/template) 模板中有一个五节点 etcd 集群示例：

```yaml
etcd:
  hosts:
    10.10.10.21 : { etcd_seq: 1 }
    10.10.10.22 : { etcd_seq: 2 }
    10.10.10.23 : { etcd_seq: 3 }
    10.10.10.24 : { etcd_seq: 4 }
    10.10.10.25 : { etcd_seq: 5 }
  vars: { etcd_cluster: etcd    }
```

您可以使用更多节点，但建议使用 3 或 5 个节点。

**Note**

为集群大小使用奇数，如 1、3、5、7、...



------

## Etcd 使用 {#etcd-usage}

这些是当前使用 Etcd 的服务：

- patroni：使用 etcd 作为 PostgreSQL HA 的共识后端
- vip-manager：从 Etcd 读取领导者信息，在 PostgreSQL 集群上绑定可选的 L2 VIP

在对 etcd 集群成员进行任何永久更改后，您必须[**重新加载**](/zh/docs/etcd/admin/#reload-config) etcd 配置。

例如，更新 patroni 对 etcd 端点的引用：

```bash
./pgsql.yml -t pg_conf                                  # re-gen patroni config
./pgsql.yml -t patroni_reload -e patroni_reload=true    # reload patroni config
```

例如，更新 vip-manager 对 etcd 端点的引用（如果您使用 PGSQL L2 VIP）：

```bash
./pgsql.yml -t pg_vip # reload vip-manager config
```
