# Pigsty v2.0.0

> 架构大升级，兼容性、安全性、可维护性显著增强

---

LLMS 索引： [llms.txt](/zh/llms.txt)

---

**v2\.0\.0 · 2023-02-28**
- [查看发布](https://github.com/pgsty/pigsty/releases/tag/v2.0.0)
- [源码 · tar\.gz](https://github.com/pgsty/pigsty/archive/refs/tags/v2.0.0.tar.gz)
- [源码 · zip](https://github.com/pgsty/pigsty/archive/refs/tags/v2.0.0.zip)
- [pgsty\/pigsty](https://github.com/pgsty/pigsty)

相关文章：

- [更好的开源RDS替代：Pigsty](https://mp.weixin.qq.com/s/-E_-HZ7LvOze5lmzy3QbQA)
- [炮打 RDS，Pigsty v2.0 发布](https://mp.weixin.qq.com/s/WsR-c64OJfkMql7zX7XmDA)
- [Pigsty v2 正式发布：更好的RDS PG开源替代](https://mp.weixin.qq.com/s/9lceZdyUZU9AzsqlAcpjTA)
- [Pigsty 2.0 展望](https://mp.weixin.qq.com/s/g-ZPWqBwjzaxZKxyjVmFig)

Pigsty [v2.0.0](https://github.com/pgsty/pigsty/releases/tag/v2.0.0) 正式发布！

从 v2.0.0 开始，PIGSTY 现在是 "PostgreSQL In Great STYle"的首字母缩写，即"全盛状态的 PostgreSQL"。

```bash
curl -fsSL https://get.pigsty.cc/latest | bash
```

> [!DETAILS]- Download directly from GitHub Release
> ```bash
> bash -c "$(curl -fsSL https://raw.githubusercontent.com/pgsty/pigsty/master/bin/get)"
>
> # or download tarball directly with curl (EL9)
> curl -L https://github.com/pgsty/pigsty/releases/download/v2.0.0/pigsty-v2.0.0.tgz -o ~/pigsty.tgz
> curl -L https://github.com/pgsty/pigsty/releases/download/v2.0.0/pigsty-pkg-v2.0.0.el9.x86_64.tgz  -o /tmp/pkg.tgz
> # EL7: https://github.com/pgsty/pigsty/releases/download/v2.0.0/pigsty-pkg-v2.0.0.el7.x86_64.tgz
> # EL8: https://github.com/pgsty/pigsty/releases/download/v2.0.0/pigsty-pkg-v2.0.0.el8.x86_64.tgz
> ```

## 亮点

* 完美整合 PostgreSQL 15, PostGIS 3.3, Citus 11.2, TimescaleDB 2.10，分布式地理时序超融合数据库。
* OS 兼容性大幅增强：支持 EL7，8，9，以及 RHEL, CentOS, Rocky, OracleLinux, AlmaLinux 等兼容发行版。
* 安全性改进：自签名 CA，全局网络流量 SSL 加密，密码 scram-sha-256 认证，备份采用 AES 加密，重制的 HBA 规则系统。
* Patroni 升级至3.0，提供原生的高可用 Citus 分布式集群支持，默认启用 FailSafe 模式，无惧 DCS 故障致全局主库瘫痪。
* 提供基于 pgBackRest 的开箱即用的时间点恢复 PITR 支持，默认支持本地文件系统与专用 MinIO/S3 集群备份。
* 新模块 `ETCD`，可独立部署，简易扩缩容，自带监控高可用，彻底取代 Consul 作为高可用 PG 的 DCS。
* 新模块 `MINIO`，可独立部署，支持多盘多节点部署，用作 S3 本地替代，亦用于集中式 PostgreSQL 备份仓库。
* 大幅精简配置文件参数，无需默认值即可使用；模板自动根据机器规格调整主机与 PG 参数，HBA/服务的定义更简洁泛用。
* 受 Grafana 与 MinIO 影响，软件协议由 Apache License 2.0 变更为 AGPL 3.0

## 兼容性

* 支持 EL7, EL8, EL9 三个大版本，并提供三个版本对应的离线软件包，默认开发测试环境由 EL7 升级至 EL9。
* 支持更多 EL 兼容 Linux 发行版：RHEL, CentOS, RockyLinux, AlmaLinux, OracleLinux 等…
* 源码包与离线软件包的命名规则发生改变，现在版本号，操作系统版本号，架构都会体现在包名中。
* `PGSQL`：PostgreSQL 15.2, PostGIS 3.3, Citus 11.2, TimescaleDB 2.10 现可同时使用，协同工作。
* `PGSQL`：Patroni 升级至 3.0 版本，作为 PGSQL 的高可用组件。
    * 默认使用 ETCD 作为 DCS，取代 Consul，减少一个 Consul Agent 失效点。
    * 因为 vip-manager 升级至 2.1 并使用 ETCDv3 API，彻底弃用 ETCDv2 API，Patroni 同理
    * 提供原生的高可用 Citus 分布式集群支持。使用完全开源所有功能的 Citus 11.2。
    * 默认启用 FailSafe 模式，无惧 DCS 故障致全局主库瘫痪。
* `PGSQL`：引入 pgBackrest v2.44 提供开箱即用的 PostgreSQL 时间点恢复 PITR 功能
    * 默认使用主库上的备份目录创建备份仓库，滚动保留两天的恢复窗口。
    * 默认备选备份仓库为专用 MinIO/S3 集群，滚动保留两周的恢复窗口，本地使用需要启用 MinIO 模块。
* `ETCD` 现在作为一个独立部署的模块，带有完整的扩容/缩容方案与监控。
* `MINIO` 现在成为一个独立部署的模块，支持多盘多节点部署，用作 S3 本地替代，亦可用作集中式备份仓库。
* `NODE` 模块现在包含 `haproxy`, `docker`, `node_exporter`, `promtail` 功能组件
    * `chronyd` 现在取代 `ntpd` 成为所有节点默认的 NTP 服务。
    * HAPROXY 现从属于 `NODE` 的一部分，而不再是 `PGSQL` 专属，可以 NodePort 的方式对外暴露服务。
    * 现在 `PGSQL` 模块可以使用专用的集中式 HAPROXY 集群统一对外提供服务。
* `INFRA` 模块现在包含 `dnsmasq`, `nginx`, `prometheus`, `grafana`, `loki` 等组件
    * Infra 模块中的 DNSMASQ 服务器默认启用，并添加为所有节点的默认 DNS 服务器之一。
    * 添加了 `blackbox_exporter` 用于主机 PING 探测，`pushgateway` 用于批处理任务指标。
    * `loki` 与 `promtail` 现在使用 Grafana 默认的软件包，使用官方的 Grafana Echarts 面板插件
    * 提供针对 PostgreSQL 15 的新增可观测性位点的监控支持，添加 Patroni 监控
* 软件版本升级
    * PostgreSQL 15.2 / PostGIS 3.3 / TimescaleDB 2.10 / Citus 11.2
    * Patroni 3.0 / Pgbouncer 1.18 / pgBackRest 2.44 / vip-manager 2.1
    * HAProxy 2.7 / Etcd 3.5 / MinIO 20230131022419 / mcli 20230128202938
    * Prometheus 2.42 / Grafana 9.3 / Loki & Promtail 2.7 / Node Exporter 1.5

## 安全性

* 启用了一个完整的本地自签名 CA：`pigsty-ca`，用于签发内网组件所使用的证书。
* 创建用户/修改密码的操作将不再会在日志文件中留下痕迹。
* Nginx 默认启用 SSL 支持（如需 HTTPS，您需要在系统中信任 `pigsty-ca`，或使用 Chrome `thisisunsafe`）
* ETCD 全面启用 SSL 加密客户端与服务端对等通信
* PostgreSQL 添加并默认启用了 SSL 支持，管理链接默认都使用 SSL 访问。
* Pgbouncer 添加了 SSL 支持，出于性能考虑默认不启用。
* Patroni 添加了 SSL 支持，并默认限制了管理 API 只能从本机与管理节点使用密码认证方可访问。
* PostgreSQL 的默认密码认证方式由 `md5` 改为 `scram-sha-256`。
* Pgbouncer 添加了认证查询支持，可以动态管理连接池用户。
* pgBackRest 使用远端集中备份存储仓库时，默认使用 `AES-256-CBC` 加密备份数据。
* 提供高安全等级配置模板：强制使用全局 SSL，并要求使用管理员证书登陆。
* 所有默认 HBA 规则现在全部在配置文件中显式定义。

## 可维护性

* 现有的配置模板可根据机器规格（CPU/内存/存储）自动调整优化。
* 现在可以动态配置 Postgres/Pgbouncer/Patroni/pgBackRest 的日志目录：默认为：`/pg/log/<type>/`
* 原有的 IP 地址占位符 `10.10.10.10` 被替换为一个专用变量：`${admin_ip}`，可在多处引用，便于切换备用管理节点。
* 您可以指定 `region` 来使用不同地区的上游镜像源，以加快软件包的下载速度。
* 现在允许用户定义更细粒度的上游源地址，您可以根据不同的 EL 版本、架构，以及地区，使用不同的上游源。
* 提供了阿里云与 AWS 中国地区的 Terraform 模板，可用于一键拉起所需的 EC2 虚拟机。
* 提供了多种不同规格的 Vagrant 沙箱模板：`meta`, `full`, `el7/8/9`, `minio`, `build`, `citus`
* 添加了新的专用剧本：`pgsql-monitor.yml` 用于监控现有的 Postgres 实例或 RDS。
* 添加了新的专用剧本：`pgsql-migration.yml`，使用逻辑复制无缝迁移现有实例至 Pigsty 管理的集群。
* 添加了一系列专用 Shell 实用命令，封装常见运维操作，方便用户使用。
* 优化了所有 Ansible Role 的实现，使其更加简洁、易读、易维护，无需默认参数即可使用。
* 允许在业务数据库/用户的层次上定义额外的 Pgbouncer 参数。

## API 变更

Pigsty v2.0 进行了大量变更，新增64个参数，移除13个参数，重命名17个参数。

## 新增的参数

- `INFRA`.`META`.`admin_ip`：主元节点 IP 地址
- `INFRA`.`META`.`region`：上游镜像区域：default|china|europe
- `INFRA`.`META`.`os_version`：企业版 Linux 发行版本：7,8,9
- `INFRA`.`CA`.`ca_cn`：CA 通用名称，默认为 pigsty-ca
- `INFRA`.`CA`.`cert_validity`：证书有效期，默认为 20 年
- `INFRA`.`REPO`.`repo_enabled`：在 infra 节点上构建本地 yum 仓库吗？
- `INFRA`.`REPO`.`repo_upstream`：上游 yum 仓库定义列表
- `INFRA`.`REPO`.`repo_home`：本地 yum 仓库的主目录，通常与 nginx_home '/www' 相同
- `INFRA`.`NGINX`.`nginx_ssl_port`：https 监听端口
- `INFRA`.`NGINX`.`nginx_ssl_enabled`：启用 nginx https 吗？
- `INFRA`.`PROMTETHEUS`.`alertmanager_endpoint`：altermanager 端点（ip|domain）：端口格式
- `NODE`.`NODE_TUNE`.`node_hugepage_ratio`：内存 hugepage 比率，默认禁用，值为 0
- `NODE`.`HAPROXY`.`haproxy_service`：要公开的 haproxy 服务列表
- `PGSQL`.`PG_ID`.`pg_mode`：pgsql 集群模式：pgsql,citus,gpsql
- `PGSQL`.`PG_BUSINESS`.`pg_dbsu_password`：dbsu 密码，默认为空字符串表示没有 dbsu 密码
- `PGSQL`.`PG_INSTALL`.`pg_log_dir`：postgres 日志目录，默认为 `/pg/data/log`
- `PGSQL`.`PG_BOOTSTRAP`.`pg_storage_type`：SSD|HDD，默认为 SSD
- `PGSQL`.`PG_BOOTSTRAP`.`patroni_log_dir`：patroni 日志目录，默认为 `/pg/log`
- `PGSQL`.`PG_BOOTSTRAP`.`patroni_ssl_enabled`：使用 SSL 保护 patroni RestAPI 通信？
- `PGSQL`.`PG_BOOTSTRAP`.`patroni_username`：patroni rest api 用户名
- `PGSQL`.`PG_BOOTSTRAP`.`patroni_password`：patroni rest api 密码（重要：请更改此密码）
- `PGSQL`.`PG_BOOTSTRAP`.`patroni_citus_db`：由 patroni 管理的 citus 数据库，默认为 postgres
- `PGSQL`.`PG_BOOTSTRAP`.`pg_max_conn`：postgres 最大连接数，`auto` 将使用推荐值
- `PGSQL`.`PG_BOOTSTRAP`.`pg_shmem_ratio`：postgres 共享内存比率，默认为 0.25，范围 0.1~0.4
- `PGSQL`.`PG_BOOTSTRAP`.`pg_rto`：恢复时间目标，故障转移的 ttl，默认为 30s
- `PGSQL`.`PG_BOOTSTRAP`.`pg_rpo`：恢复点目标，默认最多丢失 1MB 数据
- `PGSQL`.`PG_BOOTSTRAP`.`pg_pwd_enc`：密码加密算法：md5|scram-sha-256
- `PGSQL`.`PG_BOOTSTRAP`.`pgbouncer_log_dir`：pgbouncer 日志目录，默认为 `/var/log/pgbouncer`
- `PGSQL`.`PG_BOOTSTRAP`.`pgbouncer_auth_query`：如果启用，查询 pg_authid 表以检索 biz 用户，而不是填充用户列表
- `PGSQL`.`PG_BOOTSTRAP`.`pgbouncer_sslmode`：pgbouncer 客户端的 SSL：disable|allow|prefer|require|verify-ca|verify-full
- `PGSQL`.`PG_BOOTSTRAP`.`pg_service_provider`：专用的 haproxy 节点组名称，或者默认为本地节点的空字符串
- `PGSQL`.`PG_BOOTSTRAP`.`pg_default_service_dest`：如果 svc.dest='default'，则为默认服务目标
- `PGSQL`.`PG_BACKUP`.`pgbackrest_enabled`：启用 pgbackrest 吗？
- `PGSQL`.`PG_BACKUP`.`pgbackrest_clean`：初始化期间删除 pgbackrest 数据吗？
- `PGSQL`.`PG_BACKUP`.`pgbackrest_log_dir`：pgbackrest 日志目录，默认为 `/pg/log`
- `PGSQL`.`PG_BACKUP`.`pgbackrest_method`：pgbackrest 备份仓库方法，local 或 minio
- `PGSQL`.`PG_BACKUP`.`pgbackrest_repo`：pgbackrest 备份仓库配置
- `PGSQL`.`PG_DNS`.`pg_dns_suffix`：pgsql dns 后缀，默认为空字符串
- `PGSQL`.`PG_DNS`.`pg_dns_target`：auto, primary, vip, none 或 ad hoc ip
- `ETCD`.`etcd_seq`：etcd 实例标识符，必需
- `ETCD`.`etcd_cluster`：etcd 集群和组名称，默认为 etcd
- `ETCD`.`etcd_safeguard`：防止清除正在运行的 etcd 实例吗？
- `ETCD`.`etcd_clean`：在初始化期间清除现有的 etcd 吗？
- `ETCD`.`etcd_data`：etcd 数据目录，默认为 /data/etcd
- `ETCD`.`etcd_port`：etcd 客户端端口，默认为 2379
- `ETCD`.`etcd_peer_port`：etcd 对等端口，默认为 2380
- `ETCD`.`etcd_init`：etcd 初始集群状态，新建或已存在
- `ETCD`.`etcd_election_timeout`：etcd 选举超时，默认为 1000ms
- `ETCD`.`etcd_heartbeat_interval`：etcd 心跳间隔，默认为 100ms
- `MINIO`.`minio_seq`：minio 实例标识符，必须参数
- `MINIO`.`minio_cluster`：minio 集群名称，默认为 minio
- `MINIO`.`minio_clean`：初始化时清理 minio 吗？默认为 false
- `MINIO`.`minio_user`：minio 操作系统用户，默认为 `minio`
- `MINIO`.`minio_node`：minio 节点名模式
- `MINIO`.`minio_data`：minio 数据目录，使用 {x...y} 来指定多个驱动器
- `MINIO`.`minio_domain`：minio 外部域名，默认为 `sss.pigsty`
- `MINIO`.`minio_port`：minio 服务端口，默认为 9000
- `MINIO`.`minio_admin_port`：minio 控制台端口，默认为 9001
- `MINIO`.`minio_access_key`：根访问密钥，默认为 `minioadmin`
- `MINIO`.`minio_secret_key`：根秘密密钥，默认为 `minioadmin`
- `MINIO`.`minio_extra_vars`：minio 服务器的额外环境变量
- `MINIO`.`minio_alias`：本地 minio 部署的别名
- `MINIO`.`minio_buckets`：待创建的 minio 存储桶列表
- `MINIO`.`minio_users`：待创建的 minio 用户列表

## 移除的参数

- `INFRA`.`CA`.`ca_homedir`：CA 主目录，现在固定为 `/etc/pki/`
- `INFRA`.`CA`.`ca_cert`：CA 证书文件名，现在固定为 `ca.key`
- `INFRA`.`CA`.`ca_key`：CA 密钥文件名，现在固定为 `ca.key`
- `INFRA`.`REPO`.`repo_upstreams`：已被 `repo_upstream` 替代
- `PGSQL`.`PG_INSTALL`.`pgdg_repo`：现在由节点 playbooks 负责
- `PGSQL`.`PG_INSTALL`.`pg_add_repo`：现在由节点 playbooks 负责
- `PGSQL`.`PG_IDENTITY`.`pg_backup`：未使用且与部分名称冲突
- `PGSQL`.`PG_IDENTITY`.`pg_preflight_skip`：不再使用，由 `pg_id` 替代
- `DCS`.`dcs_name`：由于使用 etcd 而被移除
- `DCS`.`dcs_servers`：被 ad hoc 组 `etcd` 替代
- `DCS`.`dcs_registry`：由于使用 etcd 而被移除
- `DCS`.`dcs_safeguard`：被 `etcd_safeguard` 替代
- `DCS`.`dcs_clean`：被 `etcd_clean` 替代

## 重命名的参数

- `nginx_upstream`            -> `infra_portal`
- `repo_address`              -> `repo_endpoint`
- `pg_hostname`               -> `node_id_from_pg`
- `pg_sindex`                 -> `pg_group`
- `pg_services`               -> `pg_default_services`
- `pg_services_extra`         -> `pg_services`
- `pg_hba_rules_extra`        -> `pg_hba_rules`
- `pg_hba_rules`              -> `pg_default_hba_rules`
- `pgbouncer_hba_rules_extra` -> `pgb_hba_rules`
- `pgbouncer_hba_rules`       -> `pgb_default_hba_rules`
- `vip_mode`                  -> `pg_vip_enabled`
- `vip_address`               -> `pg_vip_address`
- `vip_interface`             -> `pg_vip_interface`
- `node_packages_default`     -> `node_default_packages`
- `node_packages_meta`        -> `infra_packages`
- `node_packages_meta_pip`    -> `infra_packages_pip`
- `node_data_dir`             -> `node_data`

## Checksums

```text
MD5 (pigsty-pkg-v2.0.0-rc1.el7.x86_64.tgz) = af4b5db9dc38c860de609956a8f1f0d3
MD5 (pigsty-pkg-v2.0.0-rc1.el8.x86_64.tgz) = 5b7152e142df3e3cbc06de30bd70e433
MD5 (pigsty-pkg-v2.0.0-rc1.el9.x86_64.tgz) = 1362e2a5680fc1a3a014cc4f304100bd
```

特别感谢意大利用户 @alemacci 在 SSL 加密，备份，多操作系统发行版适配与自适应参数模版上的贡献！

## 信息来源

- [GitHub Release](https://github.com/pgsty/pigsty/releases/tag/v2.0.0)
- [Pigsty v2.0 发布文章](https://pigsty.cc/blog/pigsty/v2.0/)
- [历史 About / 发布注记](https://pigsty.cc/docs/about/release/#v200)
- [源码对比：`v1.5.1...v2.0.0`](https://github.com/pgsty/pigsty/compare/v1.5.1...v2.0.0)
