面对在数字需求不断变化的背景下维护弹性的PostgreSQL数据库的挑战?如果术语“Patroni”与您的技术愿景 resonates,您即将解锁将PostgreSQL提升为高可用性堡垒的解决方案。
当然,挑战在等待着,但不要害怕——您正在踏上一个变革性的旅程,构建一个坚不可摧的PostgreSQL集群。设想一个未来,在那里数据库中断只是小插曲,而您的PostgreSQL设置将成为可靠性的典范。
准备好将您的PostgreSQL环境加固成一个不可动摇的堡垒吧!
先决条件
在您着手为PostgreSQL实现高可用性之前,请确保已经准备好以下内容:
- 五个(或更多)Linux服务器——本教程使用Debian 12服务器,每个服务器都有一个非root用户,具有sudo/administrator权限,如下所示:
Hostname | IP Address | Used as |
---|---|---|
postgres01 | 192.168.5.20 | PostgreSQL Server |
postgres02 | 192.168.5.21 | PostgreSQL Server |
postgres03 | 192.168.5.22 | PostgreSQL Server |
etcd | 192.168.5.15 | Cluster Data Store |
haproxy | 192.168.5.16 | Load Balancer |
- A client machine (Linux, Windows, or MacOS) with a PostgreSQL client installed.
安装PostgreSQL服务器和Patroni
满足所有先决条件后,将此时刻视为打下健壮、可靠数据库环境基础的时刻。目标是通过PostgreSQL 15创建一个高可用性的PostgreSQL部署。但首先,您必须在所有PostgreSQL服务器上安装所需的软件包(PostgreSQL服务器和Patroni)。
Patroni是一个基于Python的应用程序,用于在您的数据中心中创建高可用性的PostgreSQL部署,从裸机到Kubernetes。Patroni可以在官方的PostgreSQL存储库中获得,并支持PostgreSQL服务器9.5-16。
要安装PostgreSQL服务器和Patroni,请执行以下操作:
? 注意:在PostgreSQL服务器上完成以下操作。在本例中,
postgres01
、postgres02
和postgres03
。
1. 打开终端并运行下面的curl
命令,它不会输出任何内容,但会将PostgreSQL存储库的GPG密钥添加到/usr/share/keyrings/pgdg.gpg
。
? 本教程使用root帐户执行命令以确保演示的兼容性。但请记住,使用具有sudo特权的非root帐户是非常明智的。对于非root帐户,您必须在命令前加上
sudo
以获得更好的安全性和最佳实践。
2. 接下来,执行以下命令,它不会提供输出,但会将PostgreSQL存储库添加到/etc/apt/sources.list.d/pgdg.list
文件的软件包源列表中。
3. 一旦添加,运行下面的apt update
命令来刷新您的软件包索引并获取更新的软件包信息。

4. 更新后,执行以下命令来安装以下软件包:
postgresql-15
– PostgreSQL数据库管理系统版本15。patroni
– 一个开源解决方案,用于PostgreSQL的高可用性,使用Python和etcd创建PostgreSQL HA集群的模板。python3-etcd
– 一个用于与etcd交互的Python客户端库,etcd是一个分布式键值存储。该库允许Python应用程序与和管理etcd集群进行通信。python3-psycopg2
– Python 3的PostgreSQL适配器,连接Python应用程序和PostgreSQL数据库。
在提示时输入Y以继续安装。

5. 安装了这些软件包后,请运行下面的每个命令,它们在终端中没有输出,但执行以下操作:
- 停止
postgresql
和patroni
服务。在Debian/Ubuntu上,postgresql
和patroni
服务在安装后会自动启动。 - 在
/usr/sbin
目录为PostgreSQL二进制文件创建一个symlink
。这样做可以确保patroni
能够执行PostgreSQL二进制文件,以创建和管理PostgreSQL。
6. 最后,执行以下命令验证patroni
和psql
的二进制路径,以及patroni
的安装版本的--version
。
以下是patroni
(/usr/bin/patroni)和psql
(/usr/sbin/psql)二进制文件的路径;安装的Patroni版本是3.2.1。

设置和配置etcd服务器
现在您已经安装了PostgreSQL服务器和Patroni,您需要一个巩固您的PostgreSQL服务器之间协调的支撑,以实现无缝的高可用性。您将设置和配置etcd,一个键值数据存储。
这个键值数据存储是幕后的默默的建筑师,确保与您的PostgreSQL集群部署相关的数据被安全地存储和高效地管理。
? 注意:确保在单独的服务器上安装etcd。在本例中,etcd安装在etcd服务器上。
要安装和配置etcd,请按照以下步骤操作:
1. 在您的etcd服务器上,执行以下命令以update
存储库索引并获取最新的包信息。

2. 接下来,在服务器上运行以下命令以安装
etcd
。

3. 安装完etcd后,使用您喜欢的编辑器打开默认配置/etc/default/etcd,并插入以下配置。
此配置设置了一个单独的etcd集群,确保将IP地址192.168.5.15
更改为您的内部IP地址。
ETCD_LISTEN_PEER_URLS="<http://192.168.5.15:2380>"
ETCD_LISTEN_CLIENT_URLS="<http://localhost:2379>,<http://192.168.5.15:2379>"
ETCD_INITIAL_ADVERTISE_PEER_URLS="<http://192.168.5.15:2380>"
ETCD_INITIAL_CLUSTER="default=http://192.168.5.15:2380,"
ETCD_ADVERTISE_CLIENT_URLS="<http://192.168.5.15:2379>"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
保存更改并退出编辑器。

4. 现在,运行以下systemctl
命令重新启动etcd
并应用您的修改。
此命令没有输出,但您将在以下步骤中验证更改。
5. 一旦etcd
重新启动,请验证etcd
服务正在运行并已启用。
如果etcd
服务正在运行,您将看到输出active (running)
。当启用时,您将看到输出enabled
,这也意味着etcd
将在启动时自动启动。

6. 最后,运行以下etcdctl
命令以验证etcd集群上可用服务器的list
。
在这种情况下,etcd作为单节点集群运行在本地IP地址http://192.168.5.15:2379/。

Bootstrapping PostgreSQL Cluster via Patroni
随着etcd服务器的稳固建立,您站在下一个关键阶段的门槛上。通过使用Patroni启动引导过程,您将您的PostgreSQL配置提升为强大且容错的集群。
? 如果您要在现有的PostgreSQL服务器上部署PostgreSQL集群,请务必首先备份您的数据库。
要通过Patroni引导您的PostgreSQL集群,请在每个PostgreSQL服务器上执行以下操作:
1. 在文本编辑器中打开Patroni的默认配置(/etc/patroni/config.yml),并添加以下配置。
确保您将name
选项的值替换为您的PostgreSQL服务器的主机名(即,postgres01
),但尚未关闭编辑器。
此配置设置了名为postgres
的PostgreSQL集群。
2. 接下来,添加以下配置以设置Patroni REST API在192.168.5.20:8008
上运行。
您必须确保集群中的每个PostgreSQL服务器都可以通过API连接。因此,请将IP地址192.168.5.20
更改为每个PostgreSQL服务器的相应IP地址。
3. 添加以下配置以启用与 etcd
的集成。在此情况下,etcd
服务器正在运行的IP地址为 192.168.5.15
。
4. 现在,添加以下配置以通过 initdb
引导
PostgreSQL服务器。
此配置设置了客户端认证的默认规则和设置(pg_hba.conf
),以及一个名为 admin
的新用户和密码 admin
。
务必将PostgreSQL集群的IP地址输入到 pg_hba
部分,并在 users
部分更改默认的 admin
密码。
5. 在配置了PostgreSQL启动方式后,插入以下配置以设置每个服务器上PostgreSQL的运行方式。
至于postgres01
服务器,PostgreSQL将在IP地址192.168.5.20
上运行,数据目录为/var/lib/patroni
。
此外,此配置创建了一个名为replicator
的新用户用于复制操作,并将postgres
用户设置为超级用户/管理员,密码为(secretpassword
)。
确保更改IP地址和默认密码(secretpassword
)。
6. 将以下配置插入以设置标签,确定PostgreSQL服务器在集群上的行为,保存更改,并关闭文件。
使用保存的配置,运行以下命令来集体准备Patroni数据目录,确保它适当地拥有和保护以供PostgreSQL使用。
这些命令不会提供输出,但这一步在使用Patroni设置高可用性的PostgreSQL数据库集群中非常重要。
接下来,执行以下systemctl
命令来启动和验证patroni
服务。
在postgres01服务器上,PostgreSQL服务器运行,并初始化集群。此外,postgres01服务器被选为集群领导者。

在postgres02服务器上,通过Patroni启动PostgreSQL服务器,并通过REST API加入PostgreSQL集群。
如果一切顺利,您将看到以下消息:

在postgres03服务器上,输出与postgres02服务器类似。

9. 使用已初始化的 PostgreSQL 集群,执行以下 patronictl
命令以显示由 Patroni 管理的 PostgreSQL 实例的 list
。
在下面的输出中,您可以看到您的 PostgreSQL 集群 (postgres) 运行。
请注意,您的集群以三个成员运行:postgres01 作为集群 Leader,postgres02,以及 postgres03 作为 Replica,模式/状态为 streaming。

10. 最后,运行以下 systemctl
命令以禁用 postgresql
服务在系统启动时的自动启动。
如果成功,此命令不会有输出,但是很关键,因为 Patroni 控制新的 PostgreSQL 服务器。
安装和配置 HAProxy 作为负载均衡器
部署了 PostgreSQL 集群后,如何使其可以从客户端访问,并在发生问题时启用故障转移?解决方案是使用 HAProxy 作为 PostgreSQL 集群前的负载均衡器。
HAProxy 是使您的 PostgreSQL 集群能够处理不同工作负载、智能分发请求并保持高可用性的关键。
? 注意:在单独的服务器上安装 HAProxy。在本例中,HAProxy 服务器安装在具有 IP 地址 192.168.5.16 的 haproxy 服务器上。
要将 HAProxy 安装为 PostgreSQL 集群的负载均衡器并进行配置,请按照以下步骤进行:
1. 使用您喜欢的文本编辑器打开 /etc/hosts 文件,插入您的 PostgreSQL 服务器的 IP 地址和主机名,保存更改,然后关闭文件。
192.168.5.20 postgres01
192.168.5.21 postgres02
192.168.5.22 postgres03
2. 接下来,运行以下命令更新您的软件包索引。

3. 更新完毕后,执行以下命令将 haproxy
软件包安装到您的系统中。

4. 现在,运行以下命令将默认的 HARPOXY 配置备份到 /etc/haproxy/haproxy.cfg.orig
。
此命令不会产生输出,但在进行任何修改之前,这是一项预防措施。
5. 接下来,使用您喜欢的编辑器创建一个名为 /etc/haproxy/haproxy.cfg 的新文件,并插入以下配置。确保用您的 PostgreSQL 服务器 IP 地址替换每个位置,保存文件,然后关闭编辑器。
此 HAProxy 配置为您的 PostgreSQL 集群设置了 HAProxy 负载均衡器,具有两个代理,如下:
stats
– 此块在端口8080
上运行,监视 HAProxy 服务器性能和后端。postgres
– 此块是 PostgreSQL 集群的负载均衡器配置。
# 全局配置设置
global
# 最大全局连接数
maxconn 100
# 日志配置设置
log 127.0.0.1 local2
# 默认设置
defaults
# 全局日志配置
log global
# 设置为TCP模式
mode tcp
# 重试次数
retries 2
# 客户端超时时间
timeout client 30m
# 连接超时时间
timeout connect 4s
# 服务器超时时间
timeout server 30m
# 检查超时时间
timeout check 5s
# 统计配置
listen stats
# 设置为HTTP模式
mode http
# 绑定到端口8080
bind *:8080
# 启用统计
stats enable
# 统计URI
stats uri /
# PostgreSQL配置
listen postgres
# 绑定到端口5432
bind *:5432
# 启用HTTP检查
option httpchk
# 期望状态为200
http-check expect status 200
# 服务器设置
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
# 定义PostgreSQL服务器
server postgres01 192.168.5.20:5432 maxconn 100 check port 8008
server postgres02 192.168.5.21:5432 maxconn 100 check port 8008
server postgres03 192.168.5.22:5432 maxconn 100 check port 8008
6. 配置好HAProxy后,运行以下systemctl
命令以重启
并验证(status
)haproxy
服务。

7. 最后,打开您首选的Web浏览器,访问带有端口8080的HAProxy IP地址(例如,http://192.168.5.16:8080/)。在下面的输出中,您可以看到以下内容:
在下面的输出中,您可以看到以下内容:
- stats代理用于监控HAProxy状态。
-
postgres代理是PostgreSQL集群的负载均衡器。
请注意,postgres02和postgres03服务器被标记为下线,因为两者都在流式传输模式下运行。

测试 PostgreSQL 集群的故障切换
从设置 HAProxy 作为可靠的负载均衡器开始,现在是时候测试你的 PostgreSQL 集群了。这一关键步骤将揭示你的高可用设置的弹性。你必须确保你的 PostgreSQL 集群在可能发生故障的情况下仍然强大而响应迅速。
为了测试 PostgreSQL 集群的故障切换,你将从客户端机器连接到集群,并通过以下步骤验证切换操作:
1. 登录到客户端机器,打开终端,并运行下面的 psql
命令连接到通过 HAProxy 负载均衡器的 PostgreSQL。
在提示时输入你的 PostgreSQL 密码。你可以在 /etc/patroni/config.yml 文件中找到必要的密码信息。

2. 一旦连接成功,运行以下查询以找出你连接到的 PostgreSQL 服务器,并 quit
当前的 PostgreSQL 会话。
如果你的 PostgreSQL 安装成功,你将连接到 postgres01 服务器。

3. 现在,切换到 postgres01 服务器,运行以下命令停止 patroni
服务,并 list
PostgreSQL 集群的状态。
此步骤允许你测试 PostgreSQL 故障切换。
你可以看到 postgres01 服务器的状态变为 stopped,新的集群领导者被委派给 postgres03 服务器。

4. 返回到HAProxy监控统计数据,你会看到postgres01服务器已经宕机,而postgres03现在是UP状态。

或者,运行以下patronictl
命令来验证PostgreSQL集群的状态。
如下所示,postgres01服务器不再在集群中。

5. 切换回客户端机器,运行以下psql
命令通过HAProxy连接到PostgreSQL服务器。

6. 连接后,运行以下查询来验证当前连接的PostgreSQL服务器。
如果故障切换成功,你将连接到其中一个正在运行的服务器,本例中是postgres03。

结论
在这个旅程中,你沉浸在确保PostgreSQL数据库高可用性的复杂性中,利用了Patroni和HAProxy的强大组合。在PostgreSQL和Patroni设置阶段无缝导航时,你熟练处理了配置etcd服务器的细微差别。
你的编排技能得到了展现,因为你使用Patroni构建了一个弹性的PostgreSQL集群,并且通过HAProxy调优了负载均衡的艺术。这次高风险冒险的最终成果是对你的PostgreSQL集群故障转移能力进行了彻底的测试。
考虑在反思在建立健壮且容错性强的PostgreSQL环境方面取得的成就时,是否考虑扩展您的专业知识呢?为什么不尝试使用Kubernetes部署Patroni,以实现更加动态的环境呢?或者深入研究在多个数据中心之间设置PostgreSQL高可用性的复杂性呢?