Patroni-2.0.0(Postgresql集群高可用方案)说明书

Patroni 2.0.0 是一个用于创建高可用性 PostgreSQL 集群的模板,支持多种分布式配置存储,如 ZooKeeper、etcd 和 Kubernetes。它提供了丰富的 REST API 用于监控和管理,包括健康检查、故障转移、配置管理和复制模式。此外,Patroni 支持异步和同步复制,确保数据库的高可用性和数据安全性。文档详述了安装、配置、操作及故障切换流程,适用于数据库工程师、DBA 和 DevOps 工程师。
摘要由CSDN通过智能技术生成

Patroni-2.0.0说明书

翻译:Tenda 翻译来源:https://patroni.readthedocs.io/en/latest

序言

​ Patroni(中文:守护神)是一个模板,您可以使用Python创建模板,并使用最大的可访问性来创建自己的定制的高可用性解决方案,该分布式配置商店如ZooKeeper,etcd,Consul或Kubernetes。希望在数据中心或其他任何地方快速部署HA PostgreSQL的数据库工程师,DBA,DevOps工程师和SRE希望会发现它很有用。
​ 我们将Patroni称为“模板”,因为它远非单一规格的即插即用复制系统。它将有自己的警告。明智地使用。有很多方法可以在PostgreSQL上运行高可用性。有关列表,请参见PostgreSQL文档。
​ 给Kubernetes用户的注意事项:Patroni可以在Kubernetes上本地运行。看一下Patroni文档的Kubernetes一章。

目录

内容:
介绍
发展状况
技术要求/安装
规划PostgreSQL节点数
运行和配置
YAML配置
环境配置
复制选择
应用程序不应使用超级用户

Patroni配置
Patroni REST API
健康检查端点
监控端点
集群状态端点
配置端点
切换和故障转移端点
重新启动端点
重新加载端点
重新初始化端点

环境配置设置
全球/通用
日志记录
引导程序配置
领事

Etcdv3
动物园管理员
参展商
Kubernetes

PostgreSQL的
REST API
CTL

YAML配置设置
动态配置设置
全球/通用
日志记录
引导程序配置
领事

Etcdv3
动物园管理员
参展商
Kubernetes

PostgreSQL的
REST API
CTL
看门狗
标签

安全注意事项
保护DCS
保护REST API
复制成像和引导程序
引导程序
建立副本
备用集群
复制方式
异步模式耐久性
PostgreSQL同步复制
同步模式
同步复制因子
同步模式实施
集群的暂停/恢复模式
目标
实施
用户指南
将Patroni与Kubernetes结合使用
使用端点
使用ConfigMaps
组态
例子
看门狗支持
在Linux上设置软件看门狗

介绍

​ 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
Psycopg2

​ 从psycopg2-2.8开始,默认情况下将不再安装psycopg2的二进制版本。从源代码安装它需要C编译器和postgres + python dev软件包。由于在python世界中不可能将依赖项指定为psycopg2或psycopg2-binary,因此您必须决定如何安装它。有3种选项:

1.使用发行版中的软件包管理器

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

2.从二进制软件包安装psycopg2

pip install psycopg2-binary

3.从源代码安装psycopg2

pip install psycopg2>=2.5.4
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]

请注意,应独立于Patroni安装用于创建副本或自定义引导脚本(即WAL-E)的外部工具。

规划PostgreSQL节点数

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

运行和配置

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

> 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由于连接池已满而无法访问主服务器,则行为将是不希望的。

模式配置

Patroni配置存储在DCS(分布式配置存储)中。共有3种配置类型:

动态配置

这些选项可以随时在DCS中设置。如果更改的选项不是启动配置的一部分,则将它们异步地(在下一个唤醒周期中)应用于每个节点,随后将其重新加载。如果节点要求重新启动以应用配置(对于上下文postmaster的选项,如果它们的值已更改),则在members.data JSON中设置一个特殊标志,未完成_restart来表明这一点。另外,节点状态还通过显示“ restart_pending”来指示这一点:true。

本地配置(patroni.yml)

这些选项在配置文件中定义,并且优先于动态配置。通过将SIGHUP发送到Patroni进程,执行POST / reload REST-API请求或执行patronictl重装,可以更改patroni.yml并在运行时重新加载(无需重新启动Patroni)。

环境配置

可以使用环境变量设置/覆盖某些“本地”配置参数。当您在动态环境中运行并且事先不知道某些参数时(例如,当您在docker内部运行时,无法知道您的外部IP地址),环境配置非常有用。

本地配置可以是单个YAML文件或目录。当它是目录时,该目录中的所有YAML文件均按排序顺序依次加载。如果在多个文件中定义了键,则最后一个文件中的键优先。
某些PostgreSQL参数在主数据库和副本数据库上必须具有相同的值。对于这些,在本地用户配置文件中或通过环境变量设置的值均无效。要更改或设置其值,必须更改DCS中的共享配置。以下是此类参数的实际列表以及默认值:

  • max_connections: 100
  • max_locks_per_transaction: 64
  • max_worker_processes: 8
  • max_prepared_transactions: 0
  • wal_level: hot_standby
  • wal_log_hints: on
  • track_commit_timestamp: off

对于以下参数,PostgreSQL在主副本和所有副本之间不需要相等的值。但是,考虑到副本随时可能成为母版的可能性,对它们进行不同的设置并没有多大意义。因此,Patroni将其值限制为动态配置。

  • max_wal_senders: 5
  • max_replication_slots: 5
  • wal_keep_segments: 8
  • wal_keep_size: 128MB

这些参数经过验证以确保它们是合理的或符合最小值。

Patroni还控制着其他一些Postgres参数:

listen_addresses-从postgresql.listen或从PATRONI_POSTGRESQL_LISTEN环境变量设置
端口-从postgresql.listen或从PATRONI_POSTGRESQL_LISTEN环境变量设置
cluster_name-从作用域或PATRONI_SCOPE环境变量设置
hot_standby:on

为了安全起见,上述列表中的参数未写入postgresql.conf中,而是作为参数列表传递给pg_ctl start,这赋予了它们最高的优先级,甚至高于ALTER SYSTEM。

应用本地或动态配置选项时,将执行以下操作:

节点首先检查是否存在postgresql.base.conf或是否设置了custom_conf参数。
如果设置了custom_conf参数,它将把在其上指定的文件作为基本配置,而忽略postgresql.base.conf和postgresql.conf。
如果未设置custom_conf参数并且存在postgresql.base.conf,则它将包含重命名的“原始”配置,并将其用作基本配置。
如果既没有custom_conf也没有postgresql.base.conf,则采用原始的postgresql.conf并将其重命名为postgresql.base.conf。
动态选项(上面的例外除外)被转储到postgresql.conf中,并且在postgresql.conf中将包含设置为使用的基本配置(postgresql.base.conf或custom_conf中的内容)。因此,我们将能够应用新选项,而无需重新读取配置文件以检查是否不包括include。
使用命令行覆盖了Patroni管理集群所必需的一些参数。
如果更改了一些需要重启的选项(我们应该查看pg_settings中的上下文以及这些选项的实际值),则会设置给定节点的pending_restart标志。重启后将重置此标志。

这些参数将按以下顺序应用(运行时具有最高优先级):

从文件postgresql.base.conf(或从custom_conf文件,如果设置)中加载参数
从文件postgresql.conf加载参数
从文件postgresql.auto.conf加载参数
使用-o –name = value的运行时参数

这允许对所有节点进行配置(2),使用ALTER SYSTEM(3)对特定节点进行配置,并确保强制执行Patroni运行所必需的参数(4),并为管理postgresql的配置工具留出空间。直接配置,无需涉及Patroni(1)。

  • ttl: 30
  • loop_wait: 10
  • retry_timeouts: 10
  • maximum_lag_on_failover: 1048576
  • max_timelines_history: 0
  • check_timeline: false
  • postgresql.use_slots: true

更改这些选项后,Patroni将读取DCS中存储的配置的相关部分并更改其运行时值。
每次更改配置时,Patroni节点都会将DCS选项的状态转储到磁盘上,并将其放入Postgres数据目录中的文件patroni.dynamic.json中。如果DCS完全缺少这些选项或它们无效,则仅允许主服务器从磁盘转储中恢复这些选项。

Patroni REST API

Patroni具有丰富的REST API,在领导者竞赛中Patroni本身会使用它,patronictl工具会使用它来执行故障转移/切换/重新初始化/重启/重新加载,HAProxy或任何其他类型的负载平衡器来执行HTTP运行状况检查,当然也可以用于监视。在下面,您将找到Patroni REST API端点的列表。

健康检查端点

对于所有运行状况检查GET请求,Patroni返回带有节点状态的JSON文档以及HTTP状态代码。如果您不需要或不需要JSON文档,则可以考虑使用OPTIONS方法而不是GET。

仅当Patroni节点作为领导者运行时,对Patroni REST API的以下请求将返回HTTP状态代码200:

  • GET /
  • GET /master
  • GET /leader
  • GET /primary
  • GET /read-write

GET / replica:副本运行状况检查端点。仅当Patroni节点处于运行状态,角色为副本且未设置noloadbalance标记时,它才返回HTTP状态代码200。

GET / replica?lag = :副本检查端点。除了检查副本之外,它还检查复制延迟并仅在其低于指定值时才返回状态码200。由于性能原因,DCS的key cluster.last_leader_operation用于领导者位置和计算副本上的延迟。 max-lag可以字节(整数)或人类可读的值指定,例如16kB,64MB,1GB。

  • GET /replica?lag=1048576
  • GET /replica?lag=1024kB
  • GET /replica?lag=10MB
  • GET /replica?lag=1GB

GET / read-only:与上述端点类似,但也包含主要端点。

GET / standby-leader:仅当Patroni节点作为备用群集中的领导者运行时,才返回HTTP状态代码200。

GET / synchronous或GET / sync:仅当Patroni节点作为同步备用数据库运行时,才返回HTTP状态代码200。

GET / asynchronous或GET / async:仅当Patroni节点作为异步备用数据库运行时,才返回HTTP状态代码200。

GET / asynchronous?lag = 或GET / async?lag = :异步备用检查端点。除了从异步或异步进行检查之外,它还检查复制延迟并仅在其低于指定值时才返回状态码200。由于性能原因,DCS的key cluster.last_leader_operation用于领导者位置和计算副本上的延迟。 max-lag可以字节(整数)或人类可读的值指定,例如16kB,64MB,1GB。

  • GET /async?lag=1048576
  • GET /async?lag=1024kB
  • GET /async?lag=10MB
  • GET /async?lag=1GB

GET / health:仅当PostgreSQL启动并运行时,才返回HTTP状态代码200。

GET / liveness:始终返回HTTP状态代码200,该状态代码仅表示Patroni正在运行。可以用于livenessProbe。

GET / readiness:当Patroni节点作为领导者运行或PostgreSQL启动并运行时,返回HTTP状态代码200。当无法使用Kubenetes端点进行领导者选举(OpenShift)时,可以将该端点用于readinessProbe。

准备和活动端点都很轻巧,并且不执行任何SQL。探针的配置方式应使其在前导密钥到期时开始失效。默认值ttl为30s,示例探针如下所示:

readinessProbe:
  httpGet:
    scheme: HTTP
    path: /readiness
    port: 8008
  initialDelaySeconds: 3
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3
livenessProbe:
  httpGet:
    scheme: HTTP
    path: /liveness
    port: 8008
  initialDelaySeconds: 3
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3
监控端点

​ GET / patroni在领先者竞赛中由Patroni使用。监视系统也可以使用它。该端点生成的JSON文档与运行状况检查端点生成的JSON具有相同的结构。

$ curl -s http://localhost:8008/patroni | jq .
{
   
  "state": "running",
  "postmaster_start_time": "2019-09-24 09:22:32.555 CEST",
  "role": "master",
  "server_version": 110005,
  "cluster_unlocked": false,
  "xlog": {
   
    "location": 25624640
  },
  "timeline": 3,
  "database_system_identifier": "6739877027151648096",
  "patroni": {
   
    "version": "1.6.0",
    "scope": "batman"
  }
}
集群状态端点

​ GET / cluster端点生成一个描述当前集群拓扑和状态的JSON文档:

$ curl -s http://localhost:8008/cluster | jq .
{
   
  "members": [
    {
   
      "name": "postgresql0",
      "host": "127.0.0.1",
      "port": 5432,
      "role": "leader",
      "state": "running",
      "api_url"
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值