0
点赞
收藏
分享

微信扫一扫

PostgreSQL数据库高可用——patroni介绍

大沈投资笔记 2022-01-20 阅读 82

Patroni是一个模板,您可以使用Python创建自己的定制化、高可用性解决方案,并为最大的可访问性提供分布式配置存储,如ZooKeeper、etcd、Consul或Kubernetes。希望在数据中心或其他任何地方快速部署 HA PostgreSQL的数据库工程师、DBA、DevOps 工程师和 SRE会发现它很有用。我们称 Patroni 为“模板”,因为它远非一刀切或即插即用的复制系统(replication system)。It will have its own caveats. Use wisely. 使用PostgreSQL运行高可用性的方法有很多;有关列表,请参阅PostgreSQL 文档。Patroni当前支持的 PostgreSQL 版本:9.3 到 14。
Kubernetes 用户注意事项:Patroni 可以在 Kubernetes 之上本地运行。请查看 Patroni 文档的Kubernetes章节。

介绍

Patroni 起源于Compose项目Governor的一个分支,包括许多新功能。有关使用 Patroni 的基于 Docker 的部署示例,请参阅目前在 Zalando 使用的Spilo 。有关其他背景信息,请参阅:

  • PostgreSQL HA 与 Kubernetes 和 Patroni,Josh Berkus 在 KubeCon 2016 上的演讲(视频)
  • 2016 年 2 月 Zalando Tech 博客文章

发展状况

Patroni 正在积极开发并接受捐款。有关更多详细信息,请参阅下面的贡献部分。

技术要求/安装

Mac OS 的先决条件
要在 Mac 上安装要求,请运行以下命令:brew install postgresql etcd haproxy libyaml python
Psycopg
从psycopg2-2.8开始,默认情况下将不再安装 psycopg2 的二进制版本。从源代码安装它需要 C 编译器和 postgres+python 开发包。由于在 python 世界中,无法指定依赖项(psycopg2 OR psycopg2-binary),因为您必须决定如何安装它。有几个选项可用:
使用发行版中的包管理器

sudo apt-get install python-psycopg2   # install python2 psycopg2 module on Debian/Ubuntu
sudo apt-get install python3-psycopg2  # install python3 psycopg2 module on Debian/Ubuntu
sudo yum install python-psycopg2       # install python2 psycopg2 on RedHat/Fedora/CentOS

从二进制包安装 psycopg2 pip install psycopg2-binary
从源代码安装 psycopg2 pip install psycopg2>=2.5.4
使用 psycopg 3.0 而不是 psycopg2 pip install psycopg[binary]>=3.0.0
pip安装
Patroni 可以用 pip 安装:pip install patroni[dependencies]
其中依赖项可以为空,也可以由以下一项或多项组成:
etcd 或 etcd3:python-etcd模块,以便将 Etcd 用作 DCS
consul:python-consul模块,以便将 Consul 用作 DCS
zookeeper:kazoo模块,以便将 Zookeeper 用作 DCS
exhibitor:kazoo模块,以便将 Exhibitor 用作 DCS(与 Zookeeper 相同的依赖项)
kubernetes:kubernetes模块,以便在 Patroni 中使用 Kubernetes 作为 DCS
raft:pysyncobj模块,以便使用 python Raft 实现作为 DCS
aws:boto为了使用 AWS 回调
例如,为了将 Patroni 与 Etcd 的依赖项一起安装为 DCS 和 AWS 回调的命令是:pip install patroni[etcd,aws] 请注意,调用副本创建或自定义引导脚本(即 WAL-E)的外部工具应独立于 Patroni 安装。

规划 PostgreSQL 节点数

Patroni/PostgreSQL 节点与 DCS 节点解耦(Patroni 自己实现 RAFT 时除外),因此对最小节点数没有要求。运行一个由一个主服务器和一个备用服务器组成的集群是非常好的。您可以稍后添加更多备用节点。

运行和配置

以下部分假设 Patroni 存储库是从https://github.com/zalando/patroni克隆的。也就是说,您将需要示例配置文件postgres0.yml和postgres1.yml。如果您使用 pip 安装了 Patroni,您可以从 git 存储库中获取这些文件,并将下面的./patroni.py 替换为 patroni命令
要开始,请从不同的终端执行以下操作:

> etcd --data-dir=data/etcd --enable-v2=true
> ./patroni.py postgres0.yml
> ./patroni.py postgres1.yml

然后,您将看到一个高可用性集群启动。测试 YAML 文件中的不同设置以查看集群的行为如何变化。杀死一些组件以查看系统的行为。添加更多postgres*.yml文件以创建更大的集群。
Patroni 提供了一个HAProxy配置,它将为您的应用程序提供一个用于连接到集群领导者的端点。要配置,请运行:

> haproxy -f haproxy.cfg
> psql --host 127.0.0.1 --port 5000 postgres

YAML 配置

转到此处以获取有关 etcd、consul 和 ZooKeeper 设置的全面信息。例如,请参阅postgres0.yml。

环境配置

转到此处以获取有关通过环境变量配置(覆盖)设置的全面信息。

复制选择

Patroni 使用 Postgres 的流复制,默认是异步的。Patroni 的异步复制配置允许maximum_lag_on_failover设置。此设置确保如果跟随者落后于领导者超过一定数量的字节,则不会发生故障转移。此设置应根据业务需求增加或减少。也可以使用同步复制来获得更好的持久性保证。有关详细信息,请参阅复制模式文档。

应用程序不应使用超级用户

从应用程序连接时,请始终使用非超级用户。Patroni 需要访问数据库才能正常运行。通过使用应用程序中的超级用户,您可以使用该superuser_reserved_connections设置潜在地使用整个连接池,包括为超级用户保留的连接。如果 Patroni 由于连接池已满而无法访问主节点,则行为将是不可取的

测试您的 HA 解决方案

测试 HA 解决方案是一个耗时的过程,有很多变数。考虑到跨平台应用程序尤其如此。您需要经过培训的系统管理员或顾问来完成这项工作。这不是我们可以在文档中深入介绍的内容。
也就是说,这里有一些你应该确保测试的基础设施:

  • 网络(系统前面的网络以及 NIC [物理或虚拟] 本身)
  • 磁盘 IO
  • 文件限制(Linux 中的 nofile)
  • 内存。即使您按照建议关闭了 oomkiller,RAM 的不可用也可能会导致问题。
  • 中央处理器
  • 虚拟化争用(过度使用管理程序)
  • 任何 cgroup 限制(可能与上述有关)
    kill -9任何 postgres 进程(除了 postmaster!)。这是一个不错的段错误模拟。您不应该做的一件事是在 postmaster 进程上运行。这是因为这样做不会模仿任何现实生活场景。如果您担心您的基础设施不安全并且攻击者可以运行,那么再多的 HA 进程也无法解决这个问题。攻击者将简单地再次杀死该进程,或以另一种方式造成混乱。kill -9kill -9

https://patroni.readthedocs.io/en/latest/

举报

相关推荐

0 条评论