vitabaks.postgresql_cluster
PostgreSQL 高可用集群 :大象: :闪亮的心:
生产就绪的 PostgreSQL 高可用集群(基于 Patroni)。使用 Ansible 自动化管理。
postgresql_cluster
自动化部署和管理生产环境中的高可用 PostgreSQL 集群。此解决方案专为专用物理服务器、虚拟机以及本地和云基础设施而设计。
您可以在 postgresql-cluster.org 找到可搜索且更易于浏览的文档版本。
:trophy: 使用 赞助 计划获取个性化支持,或为该项目贡献力量。
支持的 Postgres 集群设置
您可以选择三种部署方案:
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.consul
,replica.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 | |
Debian 12 | |
Ubuntu 22.04 | |
Ubuntu 24.04 | |
CentOS Stream 9 | |
Oracle Linux 8 | |
Oracle Linux 9 | |
Rocky Linux 8 | |
Rocky Linux 9 | |
AlmaLinux 8 | |
AlmaLinux 9 |
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)2379
,2380
(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_dir
、consul_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 变量中重新定义了令牌,请使用您令牌的值。
点击这里展开... 如果您更喜欢命令行。
命令行
- 在一个控制节点(可以是笔记本电脑)上 安装 Ansible
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
- 下载或克隆此仓库
git clone https://github.com/vitabaks/postgresql_cluster.git
- 进入剧本目录
cd postgresql_cluster/automation
- 编辑清单文件
指定(非公共)IP 地址和连接设置(ansible_user
、ansible_ssh_pass
或 ansible_ssh_private_key_file
用于您的环境)
nano inventory
- 编辑变量文件 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.yml、system.yml 和 (Debian.yml 或 RedHat.yml) 文件以获取更多详细信息。
如果 dcs_type: "consul",请在控制节点上安装 consul 角色要求:
ansible-galaxy install -r roles/consul/requirements.yml
- 尝试连接到主机
ansible all -m ping
- 运行剧本:
ansible-playbook deploy_pgcluster.yml
使用 TimescaleDB 部署集群
要部署具有 TimescaleDB 扩展的 PostgreSQL 高可用集群,只需添加 enable_timescale
变量。
示例:
ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"
从零开始
如果您需要从头开始,您可以使用剧本 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 上给它加星!您的支持帮助我们成长并激励我们不断改进。给项目加星是表达您鼓励的简单而有效的方式,并帮助其他人发现这个项目。
赞助此项目
通过赞助我们的项目,您直接为其持续改善和创新做出贡献。作为赞助商,您将获得独特的好处,包括个性化支持、早期访问新功能,以及有机会影响项目的方向。您的赞助对我们来说非常重要,帮助确保项目的可持续性和进展。
今天就成为赞助商,帮助我们将此项目提升到一个新水平!
通过 GitHub Sponsors 支持我们的工作
通过 Patreon 支持我们的工作
通过加密钱包支持我们的工作:
USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj
许可证
根据 MIT 许可证进行授权。详细信息请参见 LICENSE 文件。
作者
Vitaliy Kukharik (PostgreSQL DBA)
vitabaks@gmail.com
反馈、错误报告、请求等...
欢迎您 提出!
ansible-galaxy install vitabaks.postgresql_cluster