# 常见问题

> Pigsty ETCD DCS 模块常见问题答疑
---

----------------

## ETCD集群如果不可用了会有什么影响？

[ETCD](/zh/docs/etcd) 对于 PGSQL 集群的高可用至关重要，而 etcd 本身的可用性是通过使用多个节点来保证的。使用3节点的 etcd 集群允许最多一个节点宕机，而其他两个节点仍然可以正常工作；
使用五节点的 ETCD 集群则可以容忍两个节点失效。如果超过一半的 ETCD 节点宕机，ETCD 集群及其服务将不可用。在 Patroni 3.0 之前，这可能导致 [PGSQL](/zh/docs/pgsql) 全局故障；所有的主节点将被降级并拒绝写请求。

自从 pigsty 2.0 起，默认启用了 patroni 3.0 的 [DCS 容错模式](https://patroni.readthedocs.io/en/master/dcs_failsafe_mode.html)，
当 etcd 集群不可用时，如果 PostgreSQL 集群主库可以感知到所有成员，就会 **锁定** PGSQL 集群状态。

在这种情况下，PGSQL 集群仍然可以正常工作，但您必须尽快恢复 ETCD 集群。（毕竟如果etcd宕机，您就无法通过 patroni 配置PostgreSQL集群了）






----------------

## 如何使用一个外部的已经存在的 ETCD 集群？

配置清单中硬编码了所使用 etcd 的分组名为 `etcd`，这个分组里的成员将被用作 PGSQL 的 DCS 服务器。您可以使用 `etcd.yml` 对它们进行初始化，或直接假设它是一个已存在的外部 etcd 集群。

要使用现有的外部 etcd 集群，只要像往常一样定义它们即可，您可以跳过 `etcd.yml` 剧本的执行，因为集群已经存在，不需要部署。

但您必须确保一点：**现有 etcd 集群证书是由同一 CA 签名颁发的**。否则客户端是无法使用 Pigsty 自签名的 CA 颁发的证书来访问这套 ETCD 的。






----------------

## 如何向现有ETCD集群添加新的成员？

> 详细过程，请参考[向 etcd 集群添加成员](/zh/docs/etcd#添加成员)

```bash
etcdctl member add <etcd-?> --learner=true --peer-urls=https://<new_ins_ip>:2380 # 在管理节点上宣告新成员加入
./etcd.yml -l <new_ins_ip> -e etcd_init=existing                                 # 真正初始化新 etcd 成员
etcdctl member promote <new_ins_server_id>                                       # 在管理节点上提升新成员为正式成员
```





----------------

## 如何从现有ETCD集群中移除成员？

> 详细过程，请参考[从 etcd 集群中移除成员](/zh/docs/etcd#移除成员)

```bash
etcdctl member remove <etcd_server_id>   # 在管理节点上从集群中踢出成员
./etcd.yml -l <ins_ip> -t etcd_purge     # 真正清除下线 etcd 实例
```
