vitabaks.postgresql_cluster

PostgreSQL 高可用集群 :大象: :闪亮的心:

GitHub 许可 GitHub 星标

生产就绪的 PostgreSQL 高可用集群(基于 Patroni)。使用 Ansible 自动化管理。

postgresql_cluster 自动化部署和管理生产环境中的高可用 PostgreSQL 集群。此解决方案专为专用物理服务器、虚拟机以及本地和云基础设施而设计。

您可以在 postgresql-cluster.org 找到可搜索且更易于浏览的文档版本。

:trophy: 使用 赞助 计划获取个性化支持,或为该项目贡献力量。


支持的 Postgres 集群设置

postgresql_cluster postgresql_cluster

您可以选择三种部署方案:

1. 仅 PostgreSQL 高可用

这是一个没有负载均衡的简单方案。

高可用组件:
  • Patroni 是一个模板,可帮助您使用 Python 创建自己的高可用解决方案,并通过像 ZooKeeper、etcd、Consul 或 Kubernetes 这样的分布式配置存储来最大化可访问性。用于自动管理 PostgreSQL 实例和自动故障转移。

  • etcd 是一个用于分布式系统中最关键数据的分布式可靠键值存储。etcd 是用 Go 编写的,并使用 Raft 一致性算法来管理高可用的复制日志。它由 Patroni 用于存储集群状态和 PostgreSQL 配置参数的信息。什么是分布式共识?

  • vip-manager (可选,如果指定了 cluster_vip 变量) 是一个在所有集群节点上启动并连接到 DCS 的服务。如果本地节点拥有领导者键,vip-manager 将启动配置的 VIP。在故障转移情况下,vip-manager 会在旧领导者上移除 VIP,并在新领导者上启动相应的服务。用于提供数据库访问的单一入口(VIP)。

  • PgBouncer (可选,如果 pgbouncer_install 变量为 true) 是 PostgreSQL 的连接池器。

2. 具有负载均衡的 PostgreSQL 高可用

此方案实现了读取操作的负载分配,并允许使用只读副本扩展集群。

当部署到云提供商(如 AWS、GCP、Azure、DigitalOcean 和 Hetzner Cloud)时,会自动创建一个云负载均衡器,以提供一个数据库入口点(由 cloud_load_balancer 变量控制)。

对于非云环境,例如在“您自己的机器”上部署,可以使用 HAProxy 负载均衡器。要启用它,请在 vars/main.yml 文件中设置 with_haproxy_load_balancing: true

:heavy_exclamation_mark: 注意:您的应用程序必须支持将读取请求发送到自定义端口 5001,并将写入请求发送到端口 5000。

  • 端口 5000(读/写)主服务器
  • 端口 5001(仅读)所有副本
如果变量 "synchronous_mode" 为 'true'(vars/main.yml):
  • 端口 5002(仅读)同步副本
  • 端口 5003(仅读)异步副本
HAProxy 负载均衡的组件:
  • HAProxy 是一个免费的、高效且可靠的解决方案,提供高可用性、负载均衡和 TCP、HTTP 应用程序的代理服务。

  • confd 使用模板和来自 etcd 或 consul 的数据来管理本地应用程序配置文件。用于自动化 HAProxy 配置文件管理。

  • Keepalived (可选,如果指定了 cluster_vip 变量) 提供一个虚拟高可用 IP 地址(VIP)和数据库访问的单一入口点。实现 VRRP(虚拟路由冗余协议)用于 Linux。在我们的配置中,keepalived 检查 HAProxy 服务的状态,如果出现故障,则将 VIP 委派给集群中的另一台服务器。

3. 基于 Consul 服务发现的 PostgreSQL 高可用

要使用此方案,请在变量文件 vars/main.yml 中指定 dcs_type: consul

此方案适合仅主访问和通过副本的负载均衡(使用 DNS)读取。Consul 的 服务发现DNS 解析 被用作数据库的客户端访问点。

客户端访问点(示例):

  • master.postgres-cluster.service.consul
  • replica.postgres-cluster.service.consul

此外,它对不同数据中心中的分布式集群可能很有用。我们可以提前指定数据库服务器的位置,然后在同一数据中心运行的应用程序中使用它。

示例:replica.postgres-cluster.service.dc1.consulreplica.postgres-cluster.service.dc2.consul

它要求在每个应用程序服务器上以客户端模式安装 consul(用于服务 DNS 解析),或使用 DNS 转发 到远程 consul 服务器,而不是安装本地 consul 客户端。

兼容性

基于 RedHat 和 Debian 的发行版(x86_64)

支持的 Linux 发行版:
  • Debian:11,12
  • Ubuntu:22.04,24.04
  • CentOS Stream:9
  • Oracle Linux:8,9
  • Rocky Linux:8,9
  • AlmaLinux:8,9
PostgreSQL 版本:

所有支持的 PostgreSQL 版本。

:white_check_mark: 测试通过,运行良好:PostgreSQL 10、11、12、13、14、15、16

集群部署日常自动化测试结果表:

发行版 测试结果
Debian 11 GitHub 工作流状态
Debian 12 GitHub 工作流状态
Ubuntu 22.04 GitHub 工作流状态
Ubuntu 24.04 GitHub 工作流状态
CentOS Stream 9 GitHub 工作流状态
Oracle Linux 8 GitHub 工作流状态
Oracle Linux 9 GitHub 工作流状态
Rocky Linux 8 GitHub 工作流状态
Rocky Linux 9 GitHub 工作流状态
AlmaLinux 8 GitHub 工作流状态
AlmaLinux 9 GitHub 工作流状态
Ansible 版本

最低支持的 Ansible 版本:8.0.0(ansible-core 2.15.0)

要求

点击这里展开...

此剧本需要 root 权限或 sudo。

Ansible (什么是 Ansible?)

如果 dcs_type: "consul",请在控制节点上安装 consul 角色要求:

ansible-galaxy install -r roles/consul/requirements.yml

端口要求

必须为数据库集群开放的所需 TCP 端口列表:

  • 5432(postgresql)
  • 6432(pgbouncer)
  • 8008(patroni rest api)
  • 23792380(etcd)

对于“[类型 A] 具有负载均衡的 PostgreSQL 高可用”方案:

  • 5000(haproxy -(读/写)主服务器)
  • 5001(haproxy -(仅读)所有副本)
  • 5002(haproxy -(仅读)同步副本)
  • 5003(haproxy -(仅读)异步副本)
  • 7000(可选,haproxy 统计)

对于“[类型 C] 具有 Consul 服务发现(DNS)的 PostgreSQL 高可用”方案:

  • 8300(Consul 服务器 RPC)
  • 8301(Consul Serf LAN)
  • 8302(Consul Serf WAN)
  • 8500(Consul HTTP API)
  • 8600(Consul DNS 服务器)

建议

点击这里展开...

  • Linux(操作系统)

在部署之前更新目标服务器上的操作系统;

确保配置了时间同步(NTP)。如果您想要安装和配置 NTP 服务,请指定 ntp_enabled:'true'ntp_servers

  • DCS(分布式共识存储)

快速的驱动器和可靠的网络是 etcd(或 consul)集群性能和稳定性的最重要因素。

避免在与其他进程(如数据库)密集使用磁盘资源的同一驱动器上存储 etcd(或 consul)数据! 将 etcd 和 PostgreSQL 数据存储在不同的磁盘上(见 etcd_data_dirconsul_data_path 变量),如果可能使用 SSD 驱动器。 请参阅 硬件建议调优 指南。

建议将 DCS 集群部署在与数据库服务器分开的专用服务器上。

  • 将集群成员放置在不同数据中心

如果您希望跨数据中心设置,其中复制数据库位于不同的数据中心,etcd 成员的放置变得至关重要。

如果要创建一个真正稳健的 etcd 集群,需考虑的事情有很多,但有一条规则:不要将所有 etcd 成员放置在您的主要数据中心。请参阅一些 示例

  • 如何在自动故障转移的情况下防止数据丢失(同步模式)

由于性能原因,默认情况下禁用同步复制。

为了尽量减少自动故障转移时丢失数据的风险,可以按以下方式配置设置:

  • synchronous_mode: 'true'
  • synchronous_mode_strict: 'true'
  • synchronous_commit: 'on'(或 'remote_apply')

快速入门

要运行 PostgreSQL 集群控制台,请执行以下命令:

docker run -d --name pg-console \
  --publish 80:80 \
  --publish 8080:8080 \
  --env PG_CONSOLE_API_URL=http://localhost:8080/api/v1 \
  --env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
  --volume console_postgres:/var/lib/postgresql \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /tmp/ansible:/tmp/ansible \
  --restart=unless-stopped \
  vitabaks/postgresql_cluster_console:2.0.0

注意:建议在与数据库服务器同一网络中运行控制台,以便监控集群状态。在这种情况下,将 PG_CONSOLE_API_URL 变量中的 localhost 替换为您的服务器 IP 地址。

打开控制台界面

访问 http://localhost/,并使用 secret_token 进行授权。

注意:如果您在其他服务器上设置了控制台,请将 'localhost' 替换为服务器的地址。如果您在 PG_CONSOLE_AUTHORIZATION_TOKEN 变量中重新定义了令牌,请使用您令牌的值。

点击这里展开... 如果您更喜欢命令行。

命令行

  1. 在一个控制节点(可以是笔记本电脑)上 安装 Ansible
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
  1. 下载或克隆此仓库
git clone https://github.com/vitabaks/postgresql_cluster.git
  1. 进入剧本目录
cd postgresql_cluster/automation
  1. 编辑清单文件
指定(非公共)IP 地址和连接设置(ansible_useransible_ssh_passansible_ssh_private_key_file 用于您的环境)
nano inventory
  1. 编辑变量文件 vars/main.yml
nano vars/main.yml
最小变量集:
  • proxy_env # 如果需要(用于下载软件包
  • cluster_vip # 用于客户端访问集群中的数据库(可选)
  • patroni_cluster_name
  • postgresql_version
  • postgresql_data_dir
  • with_haproxy_load_balancing 'true'(类型 A)或 'false'(默认,类型 B)
  • dcs_type # "etcd"(默认)或 "consul"(类型 C)

请参阅 vars/main.ymlsystem.yml 和 (Debian.ymlRedHat.yml) 文件以获取更多详细信息。

如果 dcs_type: "consul",请在控制节点上安装 consul 角色要求:

ansible-galaxy install -r roles/consul/requirements.yml
  1. 尝试连接到主机
ansible all -m ping
  1. 运行剧本:
ansible-playbook deploy_pgcluster.yml

使用 TimescaleDB 部署集群

要部署具有 TimescaleDB 扩展的 PostgreSQL 高可用集群,只需添加 enable_timescale 变量。

示例:

ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"

asciicast

从零开始

如果您需要从头开始,您可以使用剧本 remove_cluster.yml

可用变量:

  • remove_postgres:停止 PostgreSQL 服务并删除数据。
  • remove_etcd:停止 ETCD 服务并删除数据。
  • remove_consul:停止 Consul 服务并删除数据。

运行以下命令以删除特定组件:

ansible-playbook remove_cluster.yml -e "remove_postgres=true remove_etcd=true"

此命令将删除指定组件,允许您从头开始进行新的安装。

:warning: 警告: 在生产环境中运行此命令时请小心。

请给我们加星

如果您觉得我们的项目有帮助,请考虑在 GitHub 上给它加星!您的支持帮助我们成长并激励我们不断改进。给项目加星是表达您鼓励的简单而有效的方式,并帮助其他人发现这个项目。

Star History Chart

赞助此项目

通过赞助我们的项目,您直接为其持续改善和创新做出贡献。作为赞助商,您将获得独特的好处,包括个性化支持、早期访问新功能,以及有机会影响项目的方向。您的赞助对我们来说非常重要,帮助确保项目的可持续性和进展。

今天就成为赞助商,帮助我们将此项目提升到一个新水平!

通过 GitHub Sponsors 支持我们的工作

GitHub Sponsors

通过 Patreon 支持我们的工作

支持我在 Patreon

通过加密钱包支持我们的工作:

USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj

许可证

根据 MIT 许可证进行授权。详细信息请参见 LICENSE 文件。

作者

Vitaliy Kukharik (PostgreSQL DBA)
vitabaks@gmail.com

反馈、错误报告、请求等...

欢迎您 提出!

关于项目

PostgreSQL High-Availability Cluster (based on Patroni)

安装
ansible-galaxy install vitabaks.postgresql_cluster
许可证
mit
下载
735
拥有者