PostgreSQL: Patroni中文手册
第1章 介绍
Patroni起源于Governor在Compose的项目一个分支,它包括许多新功能。
有关使用Patroni基于Docker的部署示例,请参阅目前在Zalando使用的Spilo。有关其他背景信息,请参见:
•PostgreSQL HA与Kubernetes和Patroni,Josh Berkus在KubeCon 2016年的演讲(视频)
•2016年2月Zalando科技博客文章
1.1发展状况
Patroni正在积极发展并接受资助。有关更多详细信息,请参阅下面的贡献部分。
我们在此报告新发布的信息。
1.2技术要求和安装
Mac OS的先决条件
若要在Mac上安装,请先运行以下命令:
brew install postgresql etcd haproxy libyaml python
Psycopg2
从psycopg2-2.8开始,默认情况下不再安装psycopg2的二进制版本。从源代码安装它需要C编译器和postgres+python开发包。
因为在python中,无法将依赖项指定为psycopg2或psycopg2-binary,所以您必须决定如何安装它。
有几个选项可供选择:
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安装Patroni:
pip install patroni[dependencies]
其中依赖项可以为空,也可以由以下一项或多项组成:
etcd or etcd3
python-etcd 模块,以便将 Etcd 用作 DCS
consul
python-consul 模块,以便将 Consul 用作 DCS
zookeeper
kazoo 模块,以便将 Zookeeper 用作 DCS
exhibitor
kazoo 模块,以便将参展商用作 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)的外部工具。
1.3规划PostgreSQL节点数量
Patroni/PostgreSQL节点与DCS节点分离(除非Patroni自己实现RAFT),并且因为对最小节点数没有要求。运行由一个主服务器和一个备用服务器组成的集群是非常好的。以后可以添加更多备用节点。
1.4运行和配置
如果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配置,它将为您的应用程序提供一个用于连接到集群领导者(Leader)的端点。配置运行如下:
> haproxy -f haproxy.cfg
> psql --host 127.0.0.1 --port 5000 postgres
1.5 YAML配置
在第7章有对etcd、consul和ZooKeeper的设置。示例请访问https://github.com/zalando/patroni/blob/master/postgres0.yml获取postgres0.yml的配置信息。
1.6环境配置
有关通过环境变量配置的全面信息,请查看第6章。
1.7复制选择
Patroni 使用 Postgres 的流式复制,默认情况下是异步的。 Patroni 的异步复制配置允许maximum_lag_on_failover 设置。 此设置可确保如果跟随者超过领导者的一定数量的字节,也不会发生故障转移。应根据业务需求增加或减少此设置。 也可以使用同步复制来获得更好的持久性保证。 有关详细信息,请参阅复制模式文档第10章。
1.8应用程序不应使用超级用户
从应用程序连接时,请始终使用非超级用户。Patroni才能正常访问数据库功能。通过使用应用程序中的超级用户,您可以通过设置superuser_reserved_connections来使用整个连接池,包括为超级用户保留的连接。但是如果Patroni由于连接池已满而无法访问主服务器,那么不希望有这种行为。
1.9测试您的HA解决方案
测试HA解决方案是一个耗时的过程,有很多变量。考虑到跨平台应用程序,情况尤其如此。您需要经过培训的系统管理员或顾问来完成此工作。这不是我们可以在文档中深入讨论的内容。
也就是说,以下是您应该确保测试的一些基础架构:
•网络(系统前面的网络以及NIC[物理或虚拟]本身)
•磁盘IO
•文件限制(Linux中的nofile)
•RAM。即使您按照建议关闭了oomkiller,RAM的不可用也可能导致问题。
•中央处理器
•虚拟化争用(过度使用虚拟机监控程序)
•任何cgroup限制(可能与上述相关)
•kill-9 postgres进程(postmaster除外!)。这是一个不错的故障模拟。
您不应该做的一件事是在postmaster进程上运行kill-9。这是因为这样做不会模仿任何现实场景。如果您担心您的基础设施不安全,并且攻击者可能会运行kill-9,那么再多的HA进程也无法修复这一问题。攻击者只需再次杀死进程,或以另一种方式造成混乱。
第2章Patroni配置
Patroni配置存储在DCS(分布式配置存储)中。有3种类型的配置:
•动态配置。这些选项可随时在DCS中设置。如果更改的选项不是启动配置的一部分,则它们将异步(在下一个唤醒周期中)应用于每个节点,然后重新加载。如果节点需要重新启动以应用配置(对于具有context postmaster的选项,如果其值已更改),则会在members.data JSON中设置一个特殊标志pending_restart标记。此外,节点状态还通过显示“restart_pending”:true来表明这一点。
•本地配置(patroni.yml). 这些选项在配置文件中定义,优先于动态配置。可以通过向Patroni进程发送SIGHUP、执行POST/reload REST-API请求或执行patronictl reload.在运行时(无需重新启动Patroni)更改和重新加载Patroni.yml。
•环境配置。可以使用环境变量设置/覆盖某些“本地”配置参数。当您在动态环境中运行并且事先不知道某些参数时(例如,在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环境变量设置的
• port - 通过postgresql.listen或PATRONI_POSTGRESQL_LISTEN环境设置变量
• cluster_name - 从scope或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,则它包含重命名的“original”配置,并将用作基本配置。
•如果没有custom_conf或postgresql.base.conf,则取原始的postgresql.conf并重命名为postgresql.base.conf。
•动态选项(上述例外情况除外)转储到postgresql.conf中,并在postgresql.conf中为所用的基本配置(postgresql.base.conf或custom_conf上的内容)设置一个include。因此,我们将能够应用新选项,而无需重新读取配置文件以检查是否不包括include。
•使用命令行覆盖对Patroni管理集群至关重要的一些参数。
•如果某些需要重新启动的选项发生更改(我们应查看pg_settings中的上下文以及这些选项的实际值),则会设置给定节点的pending_restart标志。此标志在任何重新启动时重置。
参数将按以下顺序应用(运行时具有最高优先级):
1.从文件postgresql.base.conf(或从custom_conf文件(如果已设置))加载参数
2.从文件postgresql.conf加载参数
3.从文件postgresql.auto.conf加载参数
4.使用 -o –name=value 设置运行时参数
这允许对所有节点进行配置(2),使用ALTER SYSTEM对特定节点进行配置(3),并确保执行对运行Patroni至关重要的参数(4),同时为配置工具留出空间,以便直接管理postgresql.conf而不涉及Patroni(1)。
此外,以下Patroni配置选项只能动态更改:
• 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数据目录中的文件patoni.dynamic.json中。如果DCS中完全没有这些选项或这些选项无效,则仅允许主机从磁盘转储恢复这些选项。
第3章 Patroni REST API
Patroni具有丰富的REST API,Patronictl自身在领导者竞赛中使用了patronictl工具,以执行故障转移/切换/重新初始化/重新启动/重新加载,通过HAProxy或任何其他类型的负载平衡器来执行HTTP健康检查 ,当然也可以用于监视。在下面,您将找到Patroni REST API端点的列表。
3.1 健康检查端点
对于所有运行状况检查,GET请求Patroni返回一个JSON文档以及该节点的状态以及HTTP状态代码。如果您不需要或不需要JSON文档,则可以考虑使用OPTIONS方法而不是GET。
• 仅当Patroni节点作为领导者运行时,对Patroni REST API的以下请求将返回HTTP状态代码200:
–GET/
–GET/master
–GET/primary
–GET/read-write
• GET /standby-leader:仅当Patroni 节点在备用集群中作为leader 运行时才返回HTTP 状态代码200。
• GET /leader:当Patroni 节点有leader 锁时,返回HTTP 状态码200。 与前两个端点的主要区别在于它没有考虑 PostgreSQL 是作为主服务器还是作为后备领导者运行。
• GET /replica: replica健康检查端点。 仅当Patroni节点处于running状态,角色为replica且未设置noloadbalance标签时,才返回HTTP状态码200。
• GET /replica?lag=<max-lag>:replica检查端点。 除了从replica检查外,它还检查复制延迟并仅在低于指定值时返回状态代码 200。 出于性能原因,来自 DCS 的关键 cluster.last_leader_operation 用于 Leader wal 位置和replica上的计算延迟。 max-lag 可以以字节(整数)或人类可读的值指定,例如 16kB、64MB、1GB。
– GET /replica?lag=1048576
– GET /replica?lag=1024kB
– GET /replica?lag=10MB
– GET /replica?lag=1GB
• GET /replica?tag_key1=value1&tag_key2=value2:replica检查端点。 此外,它还将在 yaml 的标签部分检查用户定义的标签 key1 和 key2 及其各自的值 配置管理。 如果没有为实例定义标签,或者 yaml 配置中的值与查询值不匹配,它将返回 HTTP 状态代码 503。
在以下请求中,由于我们正在检查leader或standby-leader的状态,因此 Patroni 不会应用任何用户定义的标签,它们将被忽略。
• GET /?tag_key1=value1&tag_key2=value2
• GET /master?tag_key1=value1&tag_key2=value2
• GET /leader?tag_key1=value1&tag_key2=value2
• GET /primary?tag_key1=value1&tag_key2=value2
• GET /read-write?tag_key1=value1&tag_key2=value2
• GET /standby_leader?tag_key1=value1&tag_key2=value2
• GET /standby-leader?tag_key1=value1&tag_key2=value2
• GET /read-only:与上述端点类似,但也包括主节点
• GET /synchronous 或GET /sync:仅当Patroni 节点作为同步备用节点运行时才返回HTTP 状态代码200。
• GET /asynchronous 或 GET /async:仅当 Patroni 节点作为异步备用节点运行时才返回 HTTP 状态代码 200
• GET /asynchronous?lag= 或 GET /async?lag=:异步待机 检查端点。 除了检查异步或异步之外,它还检查复制延迟并仅在低于指定值时返回状态代码 200。 出于性能原因,来自 DCS 的关键 cluster.last_leader_operation 用于 Leader wal 位置和replica上的计算延迟。 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。 当无法使用 Kubernetes 端点进行领导选举 (OpenShift) 时,端点可用于 readinessProbe。
readiness 和liveness 端点是非常轻量的不需要执行SQL。 探针的配置方式应使其在引导密钥到期时的某个时间开始失效。默认值ttl为30秒,示例探针如下所示:
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
3.2 监控端点
GET /patroni 由 Patroni 在leader选举期间使用。 您的监控系统也可以使用它。此端点生成的 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" } }
3.3 集群状态端点
• 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": "http://127.0.0.1:8008/patroni", "timeline": 5, "tags": { "clonefrom": true } }, { "name": "postgresql1", "host": "127.0.0.1", "port": 5433, "role": "replica", "state": "running", "api_url": "http://127.0.0.1:8009/patroni", "timeline": 5, "tags": { "clonefrom": true }, "lag": 0 } ], "scheduled_switchover": { "at": "2019-09-24T10:36:00+02:00", "from": "postgresql0" } }
• GET /history 端点提供了有关集群切换/故障切换历史的视图。 格式与 pg_wal 目录中的历史文件的内容非常相似。唯一的区别是显示新时间线创建时间的时间戳字段。
$ curl -s http://localhost:8008/history | jq . [ [ 1, 25623960, "no recovery target specified", "2019-09-23T16:57:57+02:00" ], [ 2, 25624344, "no recovery target specified", "2019-09-24T09:22:33+02:00" ], [ 3, 25624752, "no recovery target specified", "2019-09-24T09:26:15+02:00" ], [ 4, 50331856, "no recovery target specified", "2019-09-24T09:35:52+02:00" ] ]
3.4配置端点
GET /config:获取动态配置的当前版本:
$ curl -s localhost:8008/config | jq . { "ttl": 30, "loop_wait": 10, "retry_timeout": 10, "maximum_lag_on_failover": 1048576, "postgresql": { "use_slots": true, "use_pg_rewind": true, "parameters": { "hot_standby": "on", "wal_log_hints": "on", "wal_level": "hot_standby", "max_wal_senders": 5, "max_replication_slots": 5, "max_connections": "100" } } }
PATCH /config:更改现有配置。
$ curl -s -XPATCH -d \ '{"loop_wait":5,"ttl":20,"postgresql":{"parameters":{"max_connections":"101"}} ˓→}' \ http://localhost:8008/config | jq . { "ttl": 20, "loop_wait": 5, "maximum_lag_on_failover": 1048576, "retry_timeout": 10, "postgresql": { "use_slots": true, "use_pg_rewind": true, "parameters": { "hot_standby": "on", "wal_log_hints": "on", "wal_level": "hot_standby", "max_wal_senders": 5, "max_replication_slots": 5, "max_connections": "101" } } }
上面的REST API调用修补了现有配置,并返回了新配置。让我们检查节点是否处理了此配置。 首先,它应该每 5 秒开始打印日志行(loop_wait=5)。 “max_connections”的改变需要重启,因此应显示“pending_restart”标志:
$ curl -s http://localhost:8008/patroni | jq .{ "pending_restart": true, "database_system_identifier": "6287881213849985952", "postmaster_start_time": "2016-06-13 13:13:05.211 CEST", "xlog": { "location": 2197818976 }, "patroni": { "scope": "batman", "version": "1.0" }, "state": "running", "role": "master", "server_version": 90503 }
删除参数:
如果你想删除(重置)一些设置,只需用 null 修补它:
$ curl -s -XPATCH -d \ '{"postgresql":{"parameters":{"max_connections":null}}}' \ http://localhost:8008/config | jq . { "ttl": 20, "loop_wait": 5, "retry_timeout": 10, "maximum_lag_on_failover": 1048576, "postgresql": { "use_slots": true, "use_pg_rewind": true, "parameters": { "hot_standby": "on", "unix_socket_directories": ".", "wal_level": "hot_standby", "wal_log_hints": "on", "max_wal_senders": 5, "max_replication_slots": 5 } } }
上面的调用从动态配置中删除 postgresql.parameters.max_connections.PUT /config: 也可以无条件地执行现有动态配置的完全重写:
$ curl -s -XPUT -d \ '{"maximum_lag_on_failover":1048576,"retry_timeout":10,"postgresql":{"use_ ˓→slots":true,"use_pg_rewind":true,"parameters":{"hot_standby":"on","wal_log_hints": ˓→"on","wal_level":"hot_standby","unix_socket_directories":".","max_wal_senders":5}}, ˓→"loop_wait":3,"ttl":20}' \ http://localhost:8008/config | jq . { "ttl": 20, "maximum_lag_on_failover": 1048576, "retry_timeout": 10, "postgresql": { "use_slots": true, "parameters": { "hot_standby": "on", "unix_socket_directories": ".", "wal_level": "hot_standby", "wal_log_hints": "on", "max_wal_senders": 5 }, "use_pg_rewind": true }, "loop_wait": 3 }
3.5 切换和故障切换端点
POST /switchover 或 POST /failover。 这些端点彼此非常相似。 但是有一些细微的差异:
1. 故障转移端点允许在没有健康节点时执行手动故障转移,但同时不允许调度切换。
2. 切换端点相反。 它仅在集群健康(有领导者)时才起作用,并允许在给定时间安排切换。
如果要在特定时间安排切换,则必须在POST请求的JSON正文中至少指定leader 或candidate 字段以及可选的scheduled_at字段。
示例:执行到特定节点的故障转移:
$ curl -s http://localhost:8009/failover -XPOST -d '{"candidate":"postgresql1"}' Successfully failed over to "postgresql1"
示例:在指定时间调度一个切换,在一个集群中从leader到一些健康的副本节点上:
$ curl -s http://localhost:8008/switchover -XPOST -d \ '{"leader":"postgresql0","scheduled_at":"2019-09-24T12:00+00"}' Switchover scheduled
根据情况,请求可能会以不同的 HTTP 状态代码和内容结束。 成功完成切换或故障转移后,将返回状态码 200。 如果成功安排了切换,Patroni 将返回 HTTP 状态代码 202。如果出现问题,将在响应正文中返回错误状态代码(400、412 或 503 之一)以及一些详细信息。 更多信息请查看patroni/api.py:do_POST_failover() 方法的源代码。
• DELETE /switchover:删除计划切换
POST /switchover 和POST /failover 端点被分别用于 patronictl switchover 和patronictl failover
DELETE /switchover 用于 patronictl flush <cluster-name> switchover。
3.6 重启端点
• POST /restart:您可以通过执行 POST /restart 调用在特定节点上重新启动 Postgres。 在 POST 请求的 JSON 正文中,可以选择指定一些重启条件:
– restart_pending:布尔值,如果设置为 true Patroni 将仅在重启挂起时重启 PostgreSQL,以便应用 PostgreSQL 配置中的一些更改。
– role:只有当节点的当前角色与 POST 请求中的角色匹配时才执行重新启动。
– postgres_version:仅当postgres 的当前版本小于POST 请求中指定的版本时才执行重新启动。
– timeout:在 PostgreSQL 开始接受连接之前我们应该等待多长时间。 覆盖 master_start_timeout。
– schedule:带时区的时间戳,安排在将来某个地方重启。
• DELETE /restart:删除计划的重启
POST /restart 和 DELETE /restart 端点分别被patronictl restart 和patronictl flush <cluster-name> restart 使用。
3.7 重载端点
POST /reload 调用将命令 Patroni 重新读取和应用配置文件。 这相当于向 Patroni 进程发送 SIGHUP 信号。 如果您更改了一些需要重新启动的 Postgres 参数(如 shared_buffers),您仍然必须通过调用 POST/restart 端点或在patriotictl restart 的帮助下明确地重新启动Postgres。
重新加载端点由patriotictl reload 使用。
3.8 重新初始化端点
POST /reinitialize:重新初始化指定节点上的PostgreSQL数据目录。只允许在副本上执行它。 一旦调用,它将删除数据目录并启动pg_basebackup或其他替代副本创建方法。
如果 Patroni 处于尝试恢复(重新启动)故障的 Postgres 的循环中,则调用可能会失败。 为了解决这个问题,可以在请求正文中指定 {"force":true}。
重新初始化端点由patriotictl reinit 使用。
第4章 将独立设备转换为 Patroni 集群
本节介绍将独立的 PostgreSQL 实例转换为 Patroni 集群的过程。 要在不使用预先存在的 PostgreSQL 实例的情况下部署 Patroni 集群,请参阅1.4。
4.1 步骤
可以使用来自单节点 PostgreSQL 数据库的数据目录启动 Patroni 集群。 这是通过严格遵循以下步骤来实现的:
1.手动启动PostgreSQL守护进程
2.按照 Patroni 配置的身份验证部分中的定义创建 Patroni 超级用户和复制用户。 如果此用户是在 SQL 中创建的,则以下查询可实现此目的:
CREATE USER $PATRONI_SUPERUSER_USERNAME WITH SUPERUSER ENCRYPTED PASSWORD '$PATRONI_ ˓→SUPERUSER_PASSWORD'; CREATE USER $PATRONI_REPLICATION_USERNAME WITH REPLICATION ENCRYPTED PASSWORD ' ˓→$PATRONI_REPLICATION_PASSWORD';
3.启动 Patroni(例如:patroni /etc/patroni/patroni.yml)。 它会自动检测 PostgreSQL 守护进程已经在运行,但其配置可能已过期。
4.要求 Patroni 重新启动节点,使用patronictl restart cluster-name node-name。 仅当 PostgreSQL 配置已过期时才需要此步骤。
第5章 PostgreSQL 大版本升级
目前唯一可行的方法是:
1.停止 Patroni
2.升级PostgreSQL二进制文件并在master节点上执行pg_upgrade
3.更新patroni.yml
4.从 DCS 中删除initialize或从 DCS 中擦除完整的集群状态。 第二个可以实现 通过运行patriotictl remove <cluster-name>。 这是必要的,因为 pg_upgrade 运行 initdb 它实际上创建了一个具有新 PostgreSQL 系统标识符的新数据库。
5.如果你在上一步删除了集群状态,你可能希望从旧数据目录复制patoni.dynamic.json 到新的。 它将帮助您保留您之前设置的一些 PostgreSQL 参数。
6.在主节点上启动 Patroni。
7.升级PostgreSQL二进制文件,更新patroni.yml并移除备节点上的data_dir。
8.在备用节点上启动 Patroni 并等待复制完成。
PostgreSQL 不支持在备用节点上运行 pg_upgrade。 如果您知道自己在做什么,您可以尝试 https://www.postgresql.org/docs/current/pgupgrade.html 中描述的 rsync 过程,而不是在备用节点上移除data_dir。 然而,最安全的方法是让 Patroni 为您复制数据。
5.1 常见问题
• 在Patroni 启动过程中,Patroni 抱怨它无法绑定到PostgreSQL 端口。
您需要验证postgresql.conf中的 listen_addresses 和 port ,以及patroni.yml中的 postgresql.listen 。别忘了 pg_hba.conf 应该允许这样的访问。• 在要求 Patroni 重新启动节点后,PostgreSQL 显示错误信息:could not open configuration file "/etc/postgresql/10/main/pg_hba.conf": No such file or directory
根据您管理 PostgreSQL 配置的方式,它可能意味着多种含义。 如果您指定 post gresql.config_dir,则 Patroni 仅在引导新集群时根据引导部分中的设置生成 pg_hba.conf。 在这种情况下,PGDATA 不为空,因此没有发生引导程序。 该文件必须事先存在。
第6章 环境配置设置
可以使用系统环境变量覆盖 Patroni 配置文件中定义的一些配置参数。 本文档列出了 Patroni 处理的所有环境变量。 通过这些变量设置的值始终优先于在 Patroni 配置文件中设置的值。
6.1 全局/通用
• PATRONI_CONFIGURATION:可以通过PATRONI_CONFIGURATION 环境变量为Patroni 设置整个配置。 在这种情况下,不会考虑任何其他环境变量!
• PATRONI_NAME:当前运行Patroni 实例的节点的名称。 对于集群必须是唯一的。
• PATRONI_NAMESPACE:Patroni保留有关集群的信息在配置存储的路径中。 默认值:“/service”
• PATRONI_SCOPE:集群名称
6.2 日志
• PATRONI_LOG_LEVEL:设置一般日志记录级别。 默认值为 INFO(请参阅 Python 日志记录文档 16.6.2)
• PATRONI_LOG_TRACEBACK_LEVEL:设置回溯可见的级别。 默认值为错误。 如果您只想在启用 PATRONI_LOG_LEVEL=DEBUG 时查看回溯,请将其设置为 DEBUG。
• PATRONI_LOG_FORMAT:设置日志格式字符串。 默认值为 %(asctime)s %(levelname)s: %(message)s(参见 LogRecord 属性)
• PATRONI_LOG_DATEFORMAT:设置日期时间格式字符串。 (请参阅 formatTime() 文档 https://docs.python.org/3.6/library/logging.html#logging.Formatter.formatTime)
• PATRONI_LOG_MAX_QUEUE_SIZE:Patroni 使用两步日志记录。 日志记录被写入内存队列,并且有一个单独的线程将它们从队列中拉出并写入 stderr 或文件。 内部队列的最大大小默认限制为 1000 条记录,足以保留过去 1h20m 的日志。
• PATRONI_LOG_DIR:应用程序日志写入的目录。 该目录必须存在并且可由执行 Patroni 的用户写入。 如果您设置此 env 变量,默认情况下应用程序将保留 4 个 25MB 的日志。 您可以使用 PATRONI_LOG_FILE_NUM 和 PATRONI_LOG_FILE_SIZE 调整这些保留值(请参见下文)。
• PATRONI_LOG_FILE_NUM:要保留的应用程序日志的数量。
• PATRONI_LOG_FILE_SIZE:触发日志滚动的patroni.log 文件的大小(以字节为单位)。
• PATRONI_LOG_LOGGERS:重新定义每个python 模块的日志记录级别。 示例 PATRONI_LOG_LOGGERS="{patroni.postmaster: WARNING, urllib3: DEBUG}"
6.3 引导配置
可以在新集群成功初始化后立即创建新的数据库用户。 此过程由以下变量定义:
• PATRONI_<username>_PASSWORD=’<password>’
• PATRONI_<username>_OPTIONS=’list,of,options’
示例:定义 PATRONI_admin_PASSWORD=strongpasswd 和 PATRONI_admin_OPTIONS='createrole,createdb' 将导致使用密码 strongpasswd 创建用户 admin,允许创建其他用户和数据库。
6.4 Consul
• PATRONI_CONSUL_HOST:Consul 本地代理的主机:端口。
• PATRONI_CONSUL_URL:Consul 本地代理的 URL,格式为:http(s)://host:port
• PATRONI_CONSUL_PORT:(可选)Consul端口
• PATRONI_CONSUL_SCHEME:(可选)http 或 https,默认为 http
• PATRONI_CONSUL_TOKEN:(可选)ACL 令牌
• PATRONI_CONSUL_VERIFY:(可选)是否验证 HTTPS 请求的 SSL 证书
• PATRONI_CONSUL_CACERT:(可选)ca 证书。如果存在,它将启用验证。
• PATRONI_CONSUL_CERT:(可选)包含客户端证书的文件
• PATRONI_CONSUL_KEY:(可选)带有客户端密钥的文件。如果密钥是证书的一部分,则可以为空。
• PATRONI_CONSUL_DC:(可选)要与之通信的数据中心。默认情况下使用主机的数据中心。
• PATRONI_CONSUL_CONSISTENCY:(可选)选择consul 一致性模式。可能的值为 default、consistent 或 stale(consul API 参考中的更多详细信息)
• PATRONI_CONSUL_CHECKS:(可选)用于会话的Consul 健康检查列表。默认情况下使用空列表。
• PATRONI_CONSUL_REGISTER_SERVICE:(可选)是否使用scope参数定义的名称注册服务,并根据节点的角色标记master、replica或standby-leader。默认为false
• PATRONI_CONSUL_SERVICE_CHECK_INTERVAL:(可选)对注册的 url 执行健康检查的频率
6.5 Etcd
• PATRONI_ETCD_PROXY:etcd 的代理网址。如果您使用代理连接到 etcd,请使用此参数而不是 PATRONI_ETCD_URL
• PATRONI_ETCD_URL:etcd 的url,格式为:http(s)://(username:password@)host:port • PATRONI_ETCD_HOSTS:etcd 端点列表,格式为‘host1:port1’、‘host2:port2’等。 . .
• PATRONI_ETCD_USE_PROXIES:如果此参数设置为true,Patroni将把主机视为一个代理列表,不会执行etcd集群的拓扑发现,而是坚持使用固定的主机列表。
• PATRONI_ETCD_PROTOCOL:http 或 https,如果未指定,则使用 http。如果指定了 url 或proxy - 将从他们那里获取协议。
• PATRONI_ETCD_HOST:etcd端点格式:host:port。
• PATRONI_ETCD_SRV:搜索 SRV 记录以进行集群自动发现的域。 Patroni 将尝试查询指定域的这些 SRV 服务名称(按该顺序直到第一次成功):_etcd-client-ssl、_etcd-client、_etcd-ssl、_etcd、_etcd-server-ssl、_etcd-server。如果检索到 _etcd-server-ssl 或 _etcd-server 的 SRV 记录,则使用 ETCD 对等协议查询 ETCD 以获取可用成员。否则将使用 SRV 记录中的主机。
• PATRONI_ETCD_SRV_SUFFIX:配置发现期间查询的SRV 名称的后缀。使用此标志来区分同一域下的多个 etcd 集群。仅适用 与 PATRONI_ETCD_SRV 结合使用。例如,如果设置了 PATRONI_ETCD_SRV_SUFFIX=foo 和 PATRONI_ETCD_SRV=example.org,则会进行以下 DNS SRV 查询:_etcd-client-ssl-foo._tcp.example.com(对于每个可能的 ETCD SRV 服务名称,依此类推)。
• PATRONI_ETCD_USERNAME:用于etcd 身份验证的用户名。
• PATRONI_ETCD_PASSWORD:etcd 认证的密码。
• PATRONI_ETCD_CACERT:ca 证书。如果存在,它将启用验证。
• PATRONI_ETCD_CERT:包含客户端证书的文件。
• PATRONI_ETCD_KEY:包含客户端密钥的文件。如果密钥是证书的一部分,则可以为空。
6.6 Etcdv3
Etcdv3 的环境名称与 Etcd 类似,您只需要在变量名称中使用 ETCD3 而不是 ETCD。 示例:PATRONI_ETCD3_HOST、PATRONI_ETCD3_CACERT 等。
警告:使用协议版本2创建的密钥在协议版本3中不可见,反之亦然, 因此仅通过更新Patroni配置就无法从Etcd切换到Etcdv3。
6.7 ZooKeeper
• PATRONI_ZOOKEEPER_HOSTS:ZooKeeper 集群成员的逗号分隔列表:“‘host1:port1’,‘host2:port2’等。 . . ’”。 引用每个实体很重要!
• PATRONI_ZOOKEEPER_USE_SSL:(可选)是否使用SSL默认为false 如果设置为false,将忽略所有SSL特定参数。
• PATRONI_ZOOKEEPER_CACERT:(可选)CA 证书。 如果存在,它将启用验证。
• PATRONI_ZOOKEEPER_CERT:(可选)带有客户端证书的文件。
• PATRONI_ZOOKEEPER_KEY:(可选)带有客户端密钥的文件。
• PATRONI_ZOOKEEPER_KEY_PASSWORD:(可选)客户端密钥密码。
• PATRONI_ZOOKEEPER_VERIFY:(可选)是否验证证书。 默认为true。
注意:需要安装kazoo>=2.6.0才能支持SSL。
6.8 Exhibitor
• PATRONI_EXHIBITOR_HOSTS:Exhibitor (ZooKeeper) 节点的初始列表,格式为:‘host1、host2 等。 . . ’。 每当 Exhibitor (ZooKeeper) 集群拓扑发生变化时,此列表就会自动更新。
• PATRONI_EXHIBITOR_PORT:Exhibitor端口。
6.9 Kubernetes
• PATRONI_KUBERNETES_BYPASS_API_SERVICE:(可选)在与Kubernetes API 通信时,Patroni 通常依赖于kubernetes 服务,其地址通过KUBERNETES_SERVICE_HOST 环境变量暴露在pod 中。如果 PATRONI_KUBERNETES_BYPASS_API_SERVICE 设置为 true,Patroni 将解析服务背后的 API 节点列表并直接连接到它们。
• PATRONI_KUBERNETES_NAMESPACE:(可选)运行Patroni pod 的Kubernetes 命名空间。默认值为default。
• PATRONI_KUBERNETES_LABELS:格式为{label1: value1, label2: value2} 的标签。这些标签将用于查找与当前集群关联的现有对象(Pod 和端点或ConfigMap)。此外,Patroni 将在它创建的每个对象(端点或 ConfigMap)上设置它们。
• PATRONI_KUBERNETES_SCOPE_LABEL:(可选)包含集群名称的标签名称。默认值为集群名称。
• PATRONI_KUBERNETES_ROLE_LABEL:(可选)包含Postgres 角色(主或副本)的标签名称。 Patroni 会在它运行的 pod 上设置这个标签。默认值为 role。
• PATRONI_KUBERNETES_USE_ENDPOINTS:(可选)如果设置为true,Patroni 将使用Endpoints 而不是ConfigMaps 来运行leader 选举并保持集群状态。
• PATRONI_KUBERNETES_POD_IP:(可选)正在运行的Pod Patroni 的IP 地址。启用PATRONI_KUBERNETES_USE_ENDPOINTS 时需要此值,用于在提升Pod 的PostgreSQL 时填充leader 端点子集。
• PATRONI_KUBERNETES_PORTS:(可选)如果服务对象具有端口名称,则端点对象中必须出现相同的名称,否则服务将无法工作。 例如,如果您的服务定义为 {Kind: Service, spec: {ports: [{name: postgresql, port: 5432, targetPort: 5432}]}},那么你必须设置 PATRONI_KUBERNETES_PORTS='[{"name": "postgresql", "port": 5432}]' 并且 Patroni 将使用它来更新领导者端点的子集。 仅当设置了 PATRONI_KUBERNETES_USE_ENDPOINTS 时才使用此参数。
• PATRONI_KUBERNETES_CACERT:(可选)指定带有CA_BUNDLE 文件的文件,其中包含在验证Kubernetes API SSL 证书时要使用的可信CA 证书。 如果未提供,Patroni将使用 ServiceAccount 密钥提供的值。
6.10 Raft
• PATRONI_RAFT_SELF_ADDR:ip:port 监听 Raft 连接。 self_addr 必须可以从集群的其他节点访问。 如果不设置,节点将不参与共识。
• PATRONI_RAFT_BIND_ADDR:(可选)ip:port 用于侦听 Raft 连接。 如果未指定,将使用 self_addr。
• PATRONI_RAFT_PARTNER_ADDRS:集群中其他 Patroni 节点的列表,格式为“'ip1:port1', 'ip2:port2'"。引用每个实体很重要!
• PATRONI_RAFT_DATA_DIR:存放Raft 日志和快照的目录。 如果未指定,则使用当前工作目录。
• PATRONI_RAFT_PASSWORD:(可选)使用指定的密码对Raft通信进行加密,需要使用Python中的cryptography模块。
6.11 PostgreSQL
• PATRONI_POSTGRESQL_LISTEN:Postgres监听的IP地址+ 端口号。 允许使用多个逗号分隔的地址,只要端口组件用冒号附加到最后一个地址之后,如 listen: 127.0.0.1,127.0.0.2:5432。 Patroni 将使用此列表中的第一个地址来建立到 PostgreSQL 节点的本地连接。
• PATRONI_POSTGRESQL_CONNECT_ADDRESS:IP 地址+ 端口,通过该端口可以从其他节点和应用程序访问 Postgres。
• PATRONI_POSTGRESQL_DATA_DIR:Postgres 数据目录的位置,可以是现有的,也可以是由Patroni 初始化的。
• PATRONI_POSTGRESQL_CONFIG_DIR:Postgres 配置目录的位置,默认为数据目录。 必须可由 Patroni 写入。
• PATRONI_POSTGRESQL_BIN_DIR:PostgreSQL 二进制文件的路径。 (pg_ctl, pg_rewind, pg_basebackup,postgres) 默认值是一个空字符串,意味着 PATH 环境变量将用于查找可执行文件。
• PATRONI_POSTGRESQL_PGPASS:.pgpass 密码文件的路径。 Patroni 在执行 pg_basebackup 之前和在其他一些情况下创建这个文件。 该位置必须可由 Patroni 写入。
• PATRONI_REPLICATION_USERNAME:复制用户名; 用户将在初始化期间创建。 副本将使用此用户通过流式复制访问主服务器
• PATRONI_REPLICATION_PASSWORD:复制密码; 用户将在初始化期间创建。
• PATRONI_REPLICATION_SSLMODE:(可选)映射到sslmode连接参数,它允许客户端指定与服务器的 TLS 协商模式的类型。有关每种模式如何工作的更多信息,请访问PostgreSQL 文档。默认模式是prefer。
• PATRONI_REPLICATION_SSLKEY:(可选)映射到sslkey连接参数,该参数指定与客户端证书一起使用的密钥的位置。
• PATRONI_REPLICATION_SSLPASSWORD:(可选)映射到sslpassword连接参数,该参数指定PATRONI_REPLICATION_SSLKEY.
• PATRONI_REPLICATION_SSLCERT:(可选)映射到sslcert连接参数,该参数指定客户端证书的位置。
• PATRONI_REPLICATION_SSLROOTCERT:(可选)映射到sslrootcert连接参数,指定包含一个或多个证书颁发机构(CA)证书的文件的位置,客户端将使用该证书来验证服务器的证书。
• PATRONI_REPLICATION_SSLCRL:(可选)映射到sslcrl连接参数,该参数指定包含证书吊销列表的文件的位置。客户端将拒绝连接到此列表中存在证书的任何服务器。
• PATRONI_REPLICATION_GSSENCMODE:(可选)映射到gssencmode连接参数,该参数确定是否或以何种优先级与服务器协商安全 GSS TCP/IP 连接
• PATRONI_REPLICATION_CHANNEL_BINDING:(可选)映射到channel_binding连接参数,该参数控制客户端对通道绑定的使用。
• PATRONI_SUPERUSER_USERNAME:超级用户的名称,在初始化 (initdb) 期间设置,稍后由 Patroni 用于连接到 postgres。这个用户也被 pg_rewind 使用。
• PATRONI_SUPERUSER_PASSWORD:超级用户的密码,在初始化 (initdb) 期间设置。
• PATRONI_SUPERUSER_SSLMODE:(可选)映射到sslmode连接参数,它允许客户端指定与服务器的 TLS 协商模式的类型。有关每种模式如何工作的更多信息,请访问PostgreSQL 文档。默认模式是prefer。
• PATRONI_SUPERUSER_SSLKEY:(可选)映射到sslkey连接参数,该参数指定与客户端证书一起使用的密钥的位置。
• PATRONI_SUPERUSER_SSLPASSWORD:(可选)映射到sslpassword连接参数,该参数指定PATRONI_SUPERUSER_SSLKEY.
• PATRONI_SUPERUSER_SSLCERT:(可选)映射到sslcert连接参数,该参数指定客户端证书的位置。
• PATRONI_SUPERUSER_SSLROOTCERT:(可选)映射到sslrootcert连接参数,该参数指定包含客户端将用于验证服务器证书的一个或多个证书颁发机构 (CA) 证书的文件的位置。
• PATRONI_SUPERUSER_SSLCRL:(可选)映射到sslcrl连接参数,该参数指定包含证书吊销列表的文件的位置。客户端将拒绝连接到此列表中存在证书的任何服务器。
• PATRONI_SUPERUSER_GSSENCMODE:(可选)映射到gssencmode连接参数,该参数决定是否或以何种优先级与服务器协商安全 GSS TCP/IP 连接
• PATRONI_SUPERUSER_CHANNEL_BINDING:(可选)映射到channel_binding连接参数,该参数控制客户端对通道绑定的使用。
• PATRONI_REWIND_USERNAME : 使用pg_rewind的用户名;在 postgres 11版本以上初始化期间创建用户,并授予所有必要的权限。
• PATRONI_REWIND_PASSWORD : 使用pg_rewind的用户密码; 在初始化过程中创建用户时被创建。
• PATRONI_REWIND_SSLMODE:(可选)映射到sslmode连接参数,它允许客户端指定与服务器的 TLS 协商模式的类型。有关每种模式如何工作的更多信息,请访问PostgreSQL 文档。默认模式是prefer。
• PATRONI_REWIND_SSLKEY:(可选)映射到sslkey连接参数,该参数指定与客户端证书一起使用的密钥的位置。
• PATRONI_REWIND_SSLPASSWORD:(可选)映射到sslpassword连接参数,该参数指定PATRONI_REWIND_SSLKEY.
• PATRONI_REWIND_SSLCERT:(可选)映射到sslcert连接参数,该参数指定客户端证书的位置。
• PATRONI_REWIND_SSLROOTCERT: (可选) 映射sslrootcert连接参数,指定包含一个或多个证书颁发机构(CA)证书的文件的位置,客户端将使用这些证书验证服务器的证书。
• PATRONI_REWIND_SSLCRL:(可选)映射到sslcrl连接参数,该参数指定包含证书吊销列表的文件的位置。客户端将拒绝连接到此列表中存在证书的任何服务器。
• PATRONI_REWIND_GSSENCMODE:(可选)映射到gssencmode连接参数,该参数确定是否或以何种优先级与服务器协商安全 GSS TCP/IP 连接
• PATRONI_REWIND_CHANNEL_BINDING:(可选)映射到channel_binding连接参数,该参数控制客户端对通道绑定的使用。
6.12 REST API
• PATRONI_RESTAPI_CONNECT_ADDRESS:访问 REST API 的 IP 地址和端口。
• PATRONI_RESTAPI_LISTEN:Patroni 将侦听的 IP 地址和端口,为 HAProxy 提供健康检查信息。
• PATRONI_RESTAPI_USERNAME:用于保护不安全 REST API 端点的基本身份验证用户名。
• PATRONI_RESTAPI_PASSWORD:用于保护不安全 REST API 端点的基本身份验证密码。
• PATRONI_RESTAPI_CERTFILE:指定带有 PEM 格式证书的文件。如果未指定 certfile 或将其留空,则 API 服务器将在没有 SSL 的情况下工作。
• PATRONI_RESTAPI_KEYFILE:指定具有 PEM 格式的密钥的文件。
• PATRONI_RESTAPI_KEYFILE_PASSWORD:指定用于解密密钥文件的密码。
• PATRONI_RESTAPI_CAFILE:指定带有 CA_BUNDLE 的文件,其中包含在验证客户端证书时要使用的受信任 CA 的证书。
• PATRONI_RESTAPI_CIPHERS:(可选)指定允许的密码套件(例如“ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM -SHA256:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1”)
• PATRONI_RESTAPI_VERIFY_CLIENT:(none默认),optional或required。当设置为none 时,REST API 不会检查客户端证书时。当required所有 REST API 调用都需要客户端证书时。当optional所有不安全的 REST API 端点都需要客户端证书时。当required使用时,如果证书签名验证成功,则客户端验证成功。对于optional客户端证书将只检查PUT,POST,PATCH,和DELETE请求。
• PATRONI_RESTAPI_ALLOWLIST:(可选):指定允许调用不安全REST API端点的主机集。单个元素可以是主机名、IP地址或使用CIDR表示法的网络地址。默认情况下,将使用allow all。如果设置了allowlist 或 allowlist_include_members,则拒绝未包含的任何内容。
• PATRONI_RESTAPI_ALLOWLIST_INCLUDE_MEMBERS:(可选):如果设置为true它允许从在 DCS 中注册的其他集群成员访问不安全的 REST API 端点(IP 地址或主机名取自成员api_url)。请注意,操作系统可能会使用不同的 IP 进行传出连接。
• PATRONI_RESTAPI_HTTP_EXTRA_HEADERS:(可选)HTTP 标头让 REST API 服务器通过 HTTP 响应传递附加信息。
• PATRONI_RESTAPI_HTTPS_EXTRA_HEADERS:(可选)HTTPS 标头让 REST API 服务器在启用 TLS 时通过 HTTP 响应传递附加信息。这也将传递设置在http_extra_headers.
6.13 CTL
• PATRONICTL_CONFIG_FILE:配置文件的位置。
• PATRONI_CTL_INSECURE:允许连接到 REST API 而无需验证 SSL 证书。
• PATRONI_CTL_CACERT:指定带有 CA_BUNDLE 文件的文件或带有可信 CA 证书的目录,以在验证 REST API SSL 证书时使用。如果没有提供,pavictl 将使用为 REST API“cafile”参数提供的值。
• PATRONI_CTL_CERTFILE:指定具有 PEM 格式的客户端证书的文件。如果没有提供,pavictl 将使用为 REST API“certfile”参数提供的值。
• PATRONI_CTL_KEYFILE:指定具有 PEM 格式的客户端密钥的文件。如果没有提供,pavictl 将使用为 REST API “keyfile”参数提供的值。
第7章 YAML 配置设置
7.1 动态配置设置
动态配置存储在DCS中(分布式配置存储)并应用到所有集群中的节点上。一些参数,例如像 loop_wait, ttl, postgresql.parameters.max_connections, postgresql.parameters.max_worker_processes 等等仅能通过动态配置被设置。一些其他参数像postgresql.listen, postgresql.data_dir 仅能在本地被设置,如在Patroni配置文件或者通过配置变量。在大多数情况下,本地配置将覆盖动态配置。 为了更改动态配置,您可以使用patronictl edit-config工具或Patroni REST API
• loop_wait:循环将休眠的秒数。默认值:10
• ttl:获取leader key的TTL(以秒为单位)。可以将其视为启动自动故障转移过程之前的时间长度。默认值:30
• retry_timeout:DCS和PostgreSQL操作重试超时(秒)。在低于此值时,不会因为DCS或网络问题不会导致Patroni降级。默认值: 10
• maximum_lag_on_failover:跟随者可以延迟的最大字节数,以便能够参加领导人选举。
• maximum_lag_on_syncnode:同步节点在被认为是不健康的候选者并被健康的异步节点交换之前可能滞后的最大字节数。如果有多个从库,Patroni将使用max replica lsn,否则它将使用leader的当前wal lsn。默认值为-1,当该值设置为0或更低时,用户不会采取操作来交换不健康的同步节点。请设置足够高的值,以便在高交易量期间,Patroni不会频繁地交换同步节点。
• max_timelines_history : DCS 中保存的最大时间线历史项目数。默认值:0。当设置为 0 时,它会在 DCS 中保留完整的历史记录。
• master_start_timeout:在触发故障转移之前允许主服务器从故障中恢复的时间(以秒为单位)。默认值为 300 秒。如果可能,设置为 0 时故障转移会在检测到崩溃后立即完成。使用异步复制时,故障转移可能会导致事务丢失。master 故障的最坏情况故障转移时间是:loop_wait + master_start_timeout + loop_wait,除非 master_start_timeout 为零,在这种情况下它只是 loop_wait。根据您的持久性/可用性权衡设置值。
• master_stop_timeout : Patroni 停止 Postgres 时允许等待的秒数,仅在启用 synchronous_mode 时有效。当设置为 > 0 并且启用了 synchronous_mode 时,如果停止操作的运行时间超过了 master_stop_timeout 设置的值,则 Patroni 会向 postmaster 发送 SIGKILL。根据您的持久性/可用性权衡设置值。如果该参数未设置或设置 <= 0,则 master_stop_timeout 不适用。
• synchronous_mode : 打开同步复制模式。在这种模式下,将选择一个副本作为同步副本,只有最新的领导者和同步副本才能参与领导人选举。同步模式确保成功提交的事务不会在故障转移时丢失,代价是在用户无法确保事务持久性的情况下失去写入可用性。有关详细信息,请参阅复制模式文档。
• synchronous_mode_strict:如果没有可用的同步副本,则防止禁用同步复制,从而阻止所有客户端写入主服务器。有关详细信息,请参阅复制模式文档。
• PostgreSQL:
–use_pg_rewind : 是否使用 pg_rewind。默认为false。
–use_slots : 是否使用复制槽。在 PostgreSQL 9.4+ 上默认为true。
–recovery_conf:配置follower写入recovery.conf 的附加配置设置。PostgreSQL 12 中不再有 recovery.conf,但您可以继续使用此部分,因为 Patroni 透明地处理它。
–parameters:Postgres 的配置设置列表。
• Standby_cluster:如果定义了这个部分,我们想要引导一个备用集群。
–host : 远程主机的地址
–port : 远程主机的端口
–primary_slot_name:远程主服务器上用于复制的插槽。此参数是可选的,默认值来自实例名称(请参阅函数slot_name_from_member_name)。
–create_replica_methods:可用于从远程主机引导备用leader的有序方法列表可能与PostgreSQL中定义的列表不同。
–restore_command:将WAL记录从远程主机还原到备用leader的命令,可以与PostgreSQL中定义的列表不同。
–archive_cleanup_command : standby leader的清理命令
–recovery_min_apply_delay : 等待多长时间将WAL记录应用到备用leader上
• slots:定义永久复制槽。这些插槽将在切换/故障切换期间保留。逻辑槽通过重启从主节点复制到备用节点,之后它们的位置每隔loop_wait秒(如有必要)前进。通过libpq连接并使用倒带或超级用户凭据复制逻辑插槽文件(请参阅postgresql.authentication部分)。副本上的逻辑槽位置总是有可能比以前的主位置稍晚,因此应用程序应该准备好在故障转移后第二次可以接收到一些消息。最简单的方法是跟踪confirmed_flush_lsn。启用永久逻辑复制槽需要postgresql.use_slots进行设置,并且还将自动启用hot_standby_feedback. 由于逻辑复制槽的故障转移在 PostgreSQL 9.6 及更早版本上是不安全的,并且 PostgreSQL 10 版缺少一些重要功能,因此该功能仅适用于 PostgreSQL 11及以上版本。
– my_slot_name:复制槽的名称。 如果永久插槽名称与当前主插槽的名称匹配,则不会创建该插槽。操作员有责任确保由Patroni 自动为成员创建的复制槽和永久复制槽之间的名称没有冲突
-- type:插槽类型。可能是physical或logical。如果插槽是合乎逻辑的,则必须另外定义database和plugin。
-- database:应在其中创建逻辑槽的数据库名称。
-- plugin : 逻辑插槽的插件名称。
• ignore_slots:Patroni 应忽略匹配插槽的复制插槽属性集列表。此配置/功能/等。当某些复制槽在 Patroni 之外管理时非常有用。匹配属性的任何子集都会导致插槽被忽略。
– name:复制槽的名称。
– type:插槽类型。可以physical或logical。如果插槽是逻辑的,您可以另外定义database和/或plugin.
– database:数据库名称(匹配logical插槽时)。
– plugin : 逻辑解码插件(匹配logical插槽时)。
注意:slots是一个 hashmap 而ignore_slots是一个数组。例如:
slots: permanent_logical_slot_name: type: logical database: my_db plugin: test_decoding permanent_physical_slot_name: type: physical ... ignore_slots: - name: ignored_logical_slot_name type: logical database: my_db plugin: test_decoding - name: ignored_physical_slot_name type: physical ...
7.2 全局/通用
• name : 主机名。对于集群必须是唯一的。
• namespace:配置存储区内的路径,Patroni 将保存有关群集的信息。默认值:“/service”
• scope:集群名称
7.3 Log
• level:设置一般日志记录级别。默认值为INFO(请参阅Python 日志记录文档)
• traceback_level:设置回溯可见的级别。默认是 ERROR。如果只想在启用时查看回溯,请将其设置为DEBUG,同时log.level=DEBUG。
• format:设置日志格式字符串。默认值为%(asctime)s %(levelname)s: %(message)s(参见LogRecord 属性)
• dateformat : 设置日期时间格式字符串。(请参阅formatTime() 文档)
• max_queue_size:Patroni 使用两步日志记录。日志记录被写入内存队列,并且有一个单独的线程将它们从队列中拉出并写入 stderr 或文件。内部队列的最大大小默认限制为1000条记录,足以保留过去 1h20m 的日志。
• dir : 将应用程序日志写入的目录。该目录必须存在并且可由执行 Patroni 的用户写入。如果设置此值,默认情况下应用程序将保留 4 个 25MB 的日志。您可以使用file_num和file_size调整这些保留值(见下文)。
• file_num:要保留的应用程序日志的数量。
• file_size:触发日志滚动的patoni.log 文件的大小(以字节为单位)。
• loggers:此部分允许重新定义每个 python 模块的日志记录级别
• Patroni.postmaster: WARNING
• urllib3:DEBUG
7.4 引导配置
• bootstrap:
-dcs:在初始化一个集群后,将配置信息写入给定的配置存储 /<namespace>/<scope>/config 中。集群的全局动态配置。在 bootstrap.dcs 中可以设置动态配置中描述的任何参数,在用户初始化(引导)新集群后,它将把这个部分写入配置存储的/<namespace>/<scope>/config。所有以后的bootstrap.dcs 不会有任何效果!如果要更改它们,请使用patronictl edit-config或Patroni REST API
-method:用于引导此集群的自定义脚本。有关详细信息,请参阅自定义引导程序方法文档。initdb指定何时恢复为默认initdb命令。initdb当method 配置文件中没有参数时也会触发。
-initdb:列出要传递给 initdb 的选项。
--data-checksums: 在9.3版本时使用pg_rewind,需要打开。
--encoding: UTF8:默认新数据库的编码。
--locale: UTF8: 新数据库的默认区域设置。
-pg_hba:您应该添加到 pg_hba.conf 的行列表。
--host all all 0.0.0.0/0 md5.
--host replication replicator 127.0.0.1/32 md5: 复制所需要的。
-users : 初始化新集群后需要创建的一些额外用户
--admin : 用户名
--password:zalando:
--options : CREATE USER 语句的选项列表
--- createrole
--- createdb
--- post_bootstrap或post_init:将在初始化集群后执行的附加脚本。该脚本接收一个连接字符串 URL(使用集群超级用户作为用户名)。PGPASSFILE 变量设置为 pgpass 文件的位置。
7.5 Consul
大多数参数是可选的,但您必须指定主机或网址之一
• host:Consul的本地代理,host:port。
• url : Consul 本地代理的 url,格式为:http(s)://host:port。
• port:(可选)Consul端口。
• scheme:(可选)http或https,默认为http。
• token:(可选)ACL 令牌。
• verify:(可选)是否验证 HTTPS 请求的 SSL 证书。
• cacert:(可选)ca 证书。如果存在,它将启用验证。
• cert:(可选)带有客户端证书的文件。
• key:(可选)如果密钥是证书的一部分,则可以为空。
• dc:(可选)要与之通信的数据中心。默认情况下使用主机的数据中心。
• consistency:(可选)选择consul一致性模式。可能的值为default, consistent, 或stale(更多细节在consul API 参考中)
• checks:(可选)用于会话的 Consul 健康检查列表。默认情况下使用空列表。
• register_service:(可选)是否使用由scope参数定义名称以及标签主服务器,副本服务器或备用服务器领导者注册的服务(取决于节点的角色)。模式为false。
• service_tags:(可选)除了角色(master/replica/standby-leader)以外,其他静态标签还可以添加到Consul服务中。默认情况下,使用一个空列表。
• service_check_interval:(可选)对注册的 url 执行健康检查的频率。
token需要有以下ACL权限:
service_prefix "${scope}" { policy = "write" } key_prefix "${namespace}/${scope}" { policy = "write" } session_prefix "" { policy = "write" }
7.6 Etcd
大多数参数是可选的,但您必须指定host、hosts、url、proxy或srv 之一
• host:etcd的端点,host:port。
• hosts : etcd 端点的列表,格式为 host1:port1,host2:port2,etc... 可以是逗号分隔的字符串或实际的 yaml 列表。
• use_proxies:如果此参数设置为true,Patroni 会将主机视为代理列表,并且不会执行etcd 集群的拓扑发现。
• url : etcd 的 url。
• proxy : etcd 的代理 url。如果您使用代理连接到 etcd,请使用此参数而不是url。
• srv:用于搜索 SRV 记录以进行集群自动发现的域。Patroni 将尝试查询指定域的这些 SRV 服务名称(按此顺序直到第一次成功):_etcd-client-ssl, _etcd-client, _etcd-ssl, _etcd, _etcd-server-ssl, _etcd-server。如果检索到_etcd-server-ssl或 的SRV 记录,_etcd-server则使用 ETCD 对等协议查询 ETCD 以获取可用成员。否则将使用 SRV 记录中的主机。
• srv_suffix:为查找期间查询的SRV名称配置后缀。使用此标志区分同一域下的多个etcd群集。仅与srv配合使用。例如,如果设置了srv_suffix:foo和srv:example.org,则会进行以下DNS srv查询:_etcd-client-ssl-foo._tcp.example.com(对于每个可能的etcd srv服务名称,依此类推)。
• protocol:(可选)http 或 https,如果未指定,则使用 http。如果指定了url或proxy -将从他们那里获取协议。
• username:(可选)用于 etcd 身份验证的用户名。
• password:(可选)用于 etcd 身份验证的密码。
• cacert:(可选)ca 证书。如果存在,它将启用验证。
• cert:(可选)带有客户端证书的文件。
• key:(可选)带有客户端密钥的文件。如果密钥是cert 的一部分,则可以为空。
7.7 Etcdv3
如果您希望Patroni通过协议版本3与Etcd集群一起使用,则需要使用Patroni配置文件中的etcd3 部分。 所有配置参数与etcd相同。
警告:使用协议版本 2 创建的密钥在协议版本 3 中不可见,反之亦然,因此无法仅通过更新 Patroni 配置文件来切换etcd到etcd3。
7.8 ZooKeeper
• hosts:ZooKeeper 集群成员列表,格式为:['host1:port1', 'host2:port2', 'etc...']。
• use_ssl:(可选)是否使用 SSL。默认为false. 如果设置为false,则忽略所有 SSL 特定参数。
• cacert:(可选)CA 证书。如果存在,它将启用验证。
• cert:(可选)带有客户端证书的文件。
• key:(可选)带有客户端密钥的文件。
• key_password:(可选)客户端密钥密码。
• verify:(可选)是否验证证书。默认为true.
提示:需要安装kazoo>=2.6.0以支持 SSL。
7.9 Exhibitor
• hosts : Exhibitor (ZooKeeper) 节点的初始列表,格式为:'host1,host2,etc...'。每当 Exhibitor (ZooKeeper) 集群拓扑发生变化时,此列表就会自动更新。
• poll_interval:应从 Exhibitor 更新 ZooKeeper 和 Exhibitor 节点列表的频率。
• port:Exhibitor端口。
7.10 Kubernetes
• bypass_api_service:(可选)在与 Kubernetes API 通信时,Patroni 通常依赖于kubernetes服务,其地址通过KUBERNETES_SERVICE_HOST环境变量暴露在pod中。如果bypass_api_service设置为true,Patroni 将解析服务背后的 API 节点列表并直接连接到它们。
• namespace:(可选)运行 Patroni pod 的 Kubernetes 命名空间。默认值为default。
• labels:标签格式 {label1: value1, label2: value2}。这些标签将用于查找与当前群集关联的现有对象(Pods和Endpoints或ConfigMaps)。Patroni还将在创建的每个对象(端点或ConfigMap)上设置它们。
• scope_label:(可选)包含集群名称的标签名称。默认值为cluster-name。
• role_label:(可选)包含角色(主或副本)的标签的名称。Patroni将在运行它的Pod上设置此标签。默认为role。
• use_endpoints:(可选)如果设置为 true,Patroni 将使用 Endpoints 而不是 ConfigMaps 来运行领导者选举并保持集群状态。
• pod_ip:(可选)Patroni正在运行中的Pod的IP地址。启用use_endpoints时,此值是必需的;当容器的PostgreSQL提升时,该值用于填充领导者端点子集。
• ports:(可选)如果Service对象具有端口的名称,则必须在Endpoint对象中显示相同的名称,否则服务将无法工作。示例如果你服务定义为 {Kind: Service, spec: {ports: [{name: postgresql, port: 5432, targetPort: 5432}]}},那么你需要设置kubernetes.ports: [{"name": "postgresql", "port": 5432}] 。Patroni将使用它来更新领导者端点的子集。仅在设置kubernetes.use_endpoints时使用此参数。
• cacert:(可选)指定带有 CA_BUNDLE 文件的文件,其中包含在验证 Kubernetes API SSL 证书时要使用的受信任 CA 的证书。如果未提供,patroni将使用 ServiceAccount 密钥提供的值。
7.11 Raft
• self_addr:ip:port监听 Raft 连接。在self_addr必须从集群中的其他节点进行访问。如果不设置,节点将不参与共识。
• bind_addr:(可选)ip:port监听 Raft 连接。如果未指定,self_addr将使用 。
• partner_addrs : 集群中其他 Patroni 节点的列表,格式为:['ip1:port', 'ip2:port', 'etc...']
• data_dir : 存放 Raft 日志和快照的目录。如果未指定,则使用当前工作目录。
• password:(可选)使用指定密码加密 Raft 流量,需要cryptographypython 模块。
关于 Raft 实现的简短常见问题解答
问:如何列出所有提供共识的节点?
答:syncobj_admin -conn host:port -status,其中host:port是一个集群节点的地址
问:作为共识一部分的节点已经消失,我无法为其他节点重复使用相同的 IP。如何从共识中删除这个节点?
答:syncobj_admin -conn host:port -remove host2:port2 ,其中 host2:port2就是你要移除的共识节点的地址。
问:从哪里获得syncobj_admin实用程序?
答: 和pysyncobj模块一起安装(python RAFT实现),是Patroni依赖。
问:是否可以在不加入共识的情况下运行 Patroni 节点?
答:是的,只需raft.self_addr从 Patroni 配置中注释掉或删除即可。
问: Patroni 和 PostgreSQL 可以只在两个节点上运行吗?
答:是的,你可以在第三个节点上运行patroni_raft_controller(没有 Patroni 和 PostgreSQL)。在这样的设置中,可以暂时失去一个节点而不会影响主节点。
7.12 PostgreSQL
• PostgreSQL:
-uthentication:
-- superuser:
---username:超级用户的名称,在初始化(initdb)期间设置,稍后由 Patroni 用于连接到 postgres。
---password : 超级用户的密码,在初始化 (initdb) 时设置。
---sslmode:(可选)映射为sslmode连接参数,它允许客户端指定与服务器的 TLS 协商模式的类型。有关每种模式如何工作的更多信息,请访问PostgreSQL 文档。默认模式是prefer。
---sslkey:(可选)映射为sslkey连接参数,该参数指定与客户端证书一起使用的密钥的位置。
---sslpassword:(可选)映射为sslpassword连接参数, 它指定sslkey中指定的密钥密码。
---sslcert:(可选)映射为sslcert连接参数,该参数指定客户端证书的位置。
---sslrootcert:(可选)映射为sslrootcert连接参数,该参数指定包含客户端将用于验证服务器证书的一个或多个证书颁发机构 (CA) 证书的文件的位置。
---sslcrl:(可选)映射为sslcrl连接参数,该参数指定包含证书吊销列表的文件的位置。客户端将拒绝连接到此列表中存在证书的任何服务器。
---gssencmode:(可选)映射为gssencmode连接参数, 它决定是否以什么优先级与服务器协商安全的GSS TCP/IP连接。
---channel_binding:(可选)映射为channel_binding连接参数,它控制客户端对通道绑定的使用。
--replication:
---username:复制用户名;用户将在初始化期间创建。副本将使用此用户通过流式复制访问主服务器
---password:复制用户密码;用户将在初始化期间创建。
---sslmode:(可选)映射为sslmode连接参数,它允许客户端指定与服务器的 TLS 协商模式的类型。有关每种模式如何工作的更多信息,请访问PostgreSQL 文档。默认模式是prefer。
---sslkey:(可选)映射为sslkey连接参数,该参数指定与客户端证书一起使用的密钥的位置。
---sslpassword:(可选)映射为sslpassword连接参数,指定sslkey中指定的密钥密码。
---sslcert:(可选)映射为sslcert连接参数,该参数指定客户端证书的位置。
---sslrootcert:(可选)映射为sslrootcert连接参数,该参数指定包含客户端将用于验证服务器证书的一个或多个证书颁发机构 (CA) 证书的文件的位置。
---sslcrl:(可选)映射为sslcrl连接参数,该参数指定包含证书吊销列表的文件的位置。客户端将拒绝连接到此列表中存在证书的任何服务器。
---gssencmode:(可选)映射为gssencmode连接参数,它决定是否以什么优先级与服务器协商安全的GSS TCP/IP连接。
---channel_binding:(可选)映射为channel_binding连接参数,它控制客户端对通道绑定的使用。
--rewind
---username:使用pg_rewind的用户的用户名; 在postgres 11及以上版本初始化时创建用户,并授予所有必要的权限。
---password:使用pg_rewind的用户的用户密码; 初始化时创建用户
---sslmode:(可选)映射为sslmode连接参数,它允许客户端指定与服务器的 TLS 协商模式的类型。有关每种模式如何工作的更多信息,请访问PostgreSQL 文档。默认模式是prefer。
---sslkey:(可选)映射为sslkey连接参数,该参数指定与客户端证书一起使用的密钥的位置。
---sslpassword:(可选)映射为sslpassword连接参数,指定sslkey中指定密钥的密码
---sslcert:(可选)映射为sslcert连接参数,该参数指定客户端证书的位置。
---sslrootcert:(可选)映射为sslrootcert连接参数,该参数指定包含客户端将用于验证服务器证书的一个或多个证书颁发机构 (CA) 证书的文件的位置。
---sslcrl:(可选)映射为sslcrl连接参数,该参数指定包含证书吊销列表的文件的位置。客户端将拒绝连接到此列表中存在证书的任何服务器。
---gssencmode:(可选)映射为gssencmode连接参数,它决定是否以什么优先级与服务器协商安全的GSS TCP/IP连接
---channel_binding:(可选)映射为channel_binding连接参数,它控制客户端对通道绑定的使用。
-callbacks : 在某些操作上运行的回调脚本。Patroni 将传递操作、角色和集群名称。(请参阅 scripts/aws.py 作为如何编写它们的示例。)
--on_reload:在触发配置重新加载时运行此脚本。
--on_restart:当 postgres 重新启动时运行这个脚本(不改变角色)。
--on_role_change:当 postgres 被提升或降级时运行这个脚本。
--on_start:在 postgres 启动时运行此脚本。
--on_stop:当 postgres 停止时运行这个脚本。
-connect_address:IP 地址 + 端口,通过该端口可以从其他节点和应用程序访问 Postgres。
• create_replica_methods:将Patroni节点转换为新副本的创建方法的有序列表。“basebackup”是默认方法;假定其他方法引用脚本,每个脚本都配置为自己的配置项。有关更多说明,请参见自定义副本创建方法文档。
-data_dir : Postgres 数据目录的位置,可以是现有的,也可以是由 Patroni 初始化的。
-config_dir : Postgres 配置目录的位置,默认为数据目录。必须可由 Patroni 写入。
-bin_dir:PostgreSQL 二进制文件的路径(pg_ctl、pg_rewind、pg_basebackup、postgres)。默认值是一个空字符串,这意味着 PATH 环境变量将用于查找可执行文件。
-listen:Postgres 监听的IP地址+ 端口号; 如果您正在使用流复制,则必须可以从群集中的其他节点进行访问。只要将端口号附加在最后一个冒号后面,即可使用多个逗号分隔的地址,即监听:127.0.0.1,127.0.0.2:5432。Patroni将使用此列表中的第一个地址建立与PostgreSQL节点的本地连接。
-use_unix_socket:指定Patroni使用unix套接字连接到集群。默认为false。如果unix_socket_directories 被定义,如果Patroni将使用其中的第一个合适的值连接到集群,没有合适的选项,回退到tcp。如果 unix_socket_directories没有定义在 postgresql.parameters中, Patroni将假定应使用默认值,并从连接参数中省略host。
-use_unix_socket_repl:指定 Patroni 应首选使用unix套接字进行复制用户集群连接。默认值为false。如果unix_socket_directories已定义,Patroni 将使用其中的第一个合适的值连接到集群,如果没有合适的值,则回退到 tcp。如果postgresql.parameters中没有指定unix_socket_directories,那么Patroni将假定应该使用默认值,并从连接参数中省略host。
-pgpass : .pgpass密码文件的路径。Patroni 在执行 pg_basebackup、post_init 脚本之前以及在其他一些情况下创建这个文件。该位置必须可由 Patroni 写入。
-recovery_conf:配置follower时写入recovery.conf 的附加配置设置。
-custom_conf:可选定制的postgresql.conf 文件路径, 将用于代替postgresql.base.conf。该文件必须存在于所有群集节点上,并且可由PostgreSQL读取,并将包含在实际的postgresql.conf中。请注意,Patroni不会监视此文件的更改,也不会备份它。但是Patroni自己的配置工具仍然可以覆盖其设置-有关详细信息,请参见动态配置。
-parameters:Postgres 的配置设置列表。其中许多是复制工作所必需的。
-pg_hba:Patroni 将用于生成pg_hba.conf. 此参数的优先级高于bootstrap.pg_hba。与动态配置一起,它简化了pg_hba.conf.
-- host all all 0.0.0.0/0 md5.
-- host replication replicator 127.0.0.1/32 md5: 复制需要这样一行代码。
-pg_ident:Patroni 将用于生成pg_ident.conf. 与动态配置一起,它简化了pg_ident.conf.
-- mapname1 systemname1 pguser1。
-- mapname1 systemname2 pguser2。
-pg_ctl_timeout : pg_ctl在启动,停止或重新启动时应等待多长时间。 默认值为60秒。
-use_pg_rewind:尝试在先前领导者作为副本加入群集时在先前领导者上使用pg_rewind。
-remove_data_directory_on_rewind_failure:如果这个选项打开,Patroni将移除PostgreSQL数据目录并重新创建副本。否则将尽量跟随一个新领导者,默认为false。
-remove_data_directory_on_diverged_timelines:如果Patroni注意到时间线不同并且以前的主服务器无法从新的主服务器开始流式传输,则Patroni将删除PostgreSQL数据目录并重新创建副本。当无法使用pg_rewind时,此选项很有用。默认值是false。
-replica_method:对于除 basebackup 之外的每个 create_replica_methods,您将添加一个同名的配置部分。至少,这应该包括“命令”以及要执行的实际脚本的完整路径。其他配置参数将以“parameter=value”的形式传递给脚本。
-pre_promote:在获得领导锁之后,但在副本提升之前,在故障转移期间执行的围栏脚本。如果脚本以非零代码退出,那么Patroni不会升级复制副本并从DCS中删除领导密钥
7.13 REST API
• restapi
-connect_address:IP 地址(或主机名)和端口,用于访问 Patroni 的REST API. 集群的所有成员都必须能够连接到这个地址,所以除非 Patroni 设置是用于本地主机内部的演示,否则这个地址必须是非“localhost”或环回地址(即:“localhost”或“127.0 .0.1”)。它可以作为 HTTP 健康检查的端点(阅读下面关于“listen”REST API 参数的内容),也可以作为用户查询(直接或通过 REST API),以及领导人选举中集群成员进行的健康检查(例如,确定主节点是否仍在运行,或者是否有一个节点的 WAL 位置在执行查询的节点之前;等等)将connect_address放入DCS的成员键中,从而可以将成员名称转换为地址以连接到其REST API。
-listen:Patroni 将为 REST API监听的IP 地址(或主机名)和端口 - 如上所述,还在参与节点之间提供相同的健康检查和集群消息传递。为 HAProxy(或任何其他能够执行 HTTP“OPTION”或“GET”检查的负载均衡器)提供健康检查信息。
-authentication: (可选)
--username : 基本验证的用户名,用于保护不安全的 REST API 端点。
--password : 基本验证的密码,用于保护不安全的 REST API 端点。
-certfile:(可选):指定带有 PEM 格式证书的文件。如果未指定 certfile 或将其留空,则 API 服务器将在没有 SSL 的情况下工作。
-keyfile:(可选):指定具有 PEM 格式的密钥的文件。
-keyfile_password:(可选):指定用于解密密钥文件的密码。
-cafile:(可选):指定带有 CA_BUNDLE 的文件,其中包含在验证客户端证书时要使用的受信任 CA 的证书。
-ciphers:(可选):指定允许的密码套件(例如“ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1”)
-verify_client : (可选): none(默认),optional或required. 当noneREST API 不会检查客户端证书时。当required所有 REST API 调用都需要客户端证书时。当optional所有不安全的 REST API 端点都需要客户端证书时。当required使用时,如果证书签名验证成功,则客户端验证成功。对于optional客户端证书将只检查PUT,POST,PATCH,和DELETE请求。
-allowlist:(可选):指定允许调用不安全REST API端点的主机集。单个元素可以是主机名、IP地址或使用CIDR表示法的网络地址。默认情况下,将使用allow all。如果设置了allowlist或allowlist_include_members,则拒绝未包含的任何内容。
-allowlist_include_members:(可选):如果设置为true它允许从在 DCS 中注册的其他集群成员访问不安全的 REST API 端点(IP 地址或主机名取自成员api_url)。请注意,操作系统可能会使用不同的 IP 进行传出连接。
-http_extra_headers:(可选):HTTP 标头让 REST API 服务器通过 HTTP 响应传递附加信息。
-https_extra_headers:(可选):启用TLS后,HTTPS headers可以让REST API服务器通过HTTP响应传递其他信息。这还将传递http_extra_headers中设置的其他信息
这是http_extra_headers和https_extra_headers 的示例:
restapi: listen: <listen> connect_address: <connect_address> authentication: username: <username> password: <password> http_extra_headers: 'X-Frame-Options': 'SAMEORIGIN' 'X-XSS-Protection': '1; mode=block' 'X-Content-Type-Options': 'nosniff' cafile: <ca file> certfile: <cert> keyfile: <key> https_extra_headers: 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'
7.14 CTL
•ctl : (可选)
-insecure : 允许连接到 REST API 而无需验证 SSL 证书。
-cacert : 指定带有CA_BUNDLE文件的文件或带有受信任CA证书的目录,以在验证REST API SSL证书时使用。如果未提供,则patronictl将使用为REST API “cafile”参数提供的值。
-certfile : 指定带有客户端证书的 PEM 格式的文件。如果没有提供,patronict将使用为 REST API“certfile”参数提供的值。
-keyfile : 指定具有 PEM 格式的客户端密钥的文件。如果没有提供,patronictl将使用为 REST API “keyfile”参数提供的值。
7.15 Watchdog
•mode : off, automatic 或者required. 当设置为off ,那么watchdog禁用。当设置为automatic,WatchDog(如果有)将被使用,但如果没有则将被忽略
•device : watchdog设备的路径。默认为 /dev/watchdog.
•Safety_margin : 领导者密钥到期和WatchDog触发之间的安全余量秒数。
7.16 Tags
•nofailover : true或false,控制是否允许此节点参与领导者竞赛并成为领导者。默认为false
•clonefrom : true 或false。如果设置为true,其他节点可能更喜欢使用该节点进行引导(从pg_basebackup获取)。如果有多个节点的clonefrom标签设置为true,则将随机选择要从中引导的节点。默认为false。
•noloadbalance : true或false。如果设置true为该节点,则将为REST API 健康检查返回 HTTP 状态代码 503 ,因此将从负载平衡中排除。默认为false。
•replicatefrom : 另一个副本的 IP 地址/主机名。用于支持级联复制。
•nosync : true或false. 如果设置true为该节点将永远不会被选为同步副本。
除了这些预定义的标签,您还可以添加自己的标签:
•key1 : true
•key2 : false
•key3 : 1.4
•key4 : "RandomString"
标签在REST API和用户列表中可见。您还可以使用这些标签检查实例的运行状况。如果没有为实例定义标签,或者如果相应的值与查询值不匹配,它将返回HTTP状态代码503。
第8章 安全注意事项
Patroni 集群有两个接口可以防止未经授权的访问:分布式配置存储 (DCS) 和 Patroni REST API。
8.1 保护 DCS
Patroni 和patronictl 都向/从DCS 存储和检索数据。
尽管 DCS 不包含任何敏感信息,但它允许更改某些 Patroni/Postgres 配置。
因此,首先应该保护的是 DCS 本身。 保护的细节取决于所使用的 DCS 类型。 支持的 DCS 类型的身份验证和加密参数(tokens/basicauth/client certificates)包含在设置中
一般建议是为所有 DCS 通信启用 TLS。
8.2 保护 REST API
保护 REST API 是一项更复杂的任务。
Patroni本身会在领导者竞赛期间使用Patroni REST API,通过patronictl 工具来执行故障转移/切换/重新初始化/重新启动/重新加载,通过HAProxy或任何其他类型的负载平衡器来执行HTTP运行状况检查,当然也可以用于监视。
从安全的角度来看,REST API 包含安全(GET 请求,只检索信息)和不安全(PUT、POST、PATCH 和 DELETE 请求,更改节点状态)端点。
可以通过设置 restapi.authentication.username和restapi.authentication.password参数使用HTTP basic-auth保护不安全的端点。如果不启用TLS,则无法保护安全端点。
启用REST API的TLS并建立PKI时,可以对所有端点进行API服务器和API客户端的相互身份验证。
restapi 启用对服务器的TLS客户端身份验证。根据verify_client参数的值,API服务器需要成功地对安全和不安全的API调用(verify_client:required),或者仅对不安全的API调用(verify_client:optional),或者没有API调用(verify_client:none),进行客户端证书验证。
ctl 部分参数启用对客户端的 TLS 服务器身份验证(使用与patroni相同的配置的patronictl 工具)。 设置 insecure: true 以禁用客户端的服务器证书验证。 有关 TLS 客户端参数的详细说明,请参阅设置。
保护 PostgreSQL 数据库免受未经授权的访问超出了本文档的范围,请移步参阅https://www.postgresql.org/docs/current/client-authentication.html
第9章 复制镜像和引导
Patroni允许自定义创建新副本。它还支持定义在引导新的空群集时发生的情况。两者之间的区别已明确定义:只有在集群的DCS中存在初始化键时,Patroni才会创建副本。如果没有初始化键-Patroni将在拥有初初始化键锁定的第一个节点上专门调用引导程序。
9.1 引导
PostgreSQL 提供了 initdb 命令来初始化一个新的集群,Patroni 默认调用它。 在某些情况下,特别是在创建新集群作为现有集群的副本时,有必要用自定义操作替换内置方法。 Patroni 支持执行用户定义的脚本来引导新集群,为它们提供一些必需的参数,即集群的名称和数据目录的路径。 bootstrap的配置是Patroni的配置中的一部分。 例如:
bootstrap: method: <custom_bootstrap_method_name> <custom_bootstrap_method_name>: command: <path_to_custom_bootstrap_script> [param1 [, ...]] keep_existing_recovery_conf: False no_params: False recovery_conf: recovery_target_action: promote recovery_target_timeline: latest restore_command: <method_specific_restore_command>
每个引导方法必须至少定义一个名字和命令。特殊的initdb方法可用于触发默认行为,在这种情况下,方法参数可以完全省略。可以使用绝对路径或相对于Patroni命令位置的路径指定命令。除了在配置文件中定义的固定参数之外,Patroni还提供了两个特定于群集的参数:
--scope 要引导的集群的名称
--datadir 要引导的集群实例的数据目录的路径
可以通过将特殊的 no_params 参数设置为 True 来禁用传递这两个额外的标志。
如果引导脚本返回0,则Patroni尝试配置并启动它生成的PostgreSQL实例。 如果任何中间步骤失败,或者脚本返回非零值,则Patroni会认为引导程序已失败,自行清除后释放初始化锁,使另一个节点有机会进行引导。
如果在与自定义引导程序方法相同的部分中定义了recovery_conf块,则Patroni将在启动新引导的实例之前生成recovery.conf。 通常,此类recovery.conf应包含至少一个recovery_target_*参数,设置为promote的recovery_target_timeline将一起使用。
如果定义了keep_existing_recovery_conf 并将其设置为True,则Patroni 不会删除现有的recovery.conf 文件(如果存在)。 这在使用 pgBackRest 等工具从备份引导时非常有用,这些工具为您生成适当的 recovery.conf。
注意:Bootstrap 方法既不链接,也不会在主方法失败时退回到默认方法
9.2 构建副本
Patroni使用久经考验的pg_basebackup来创建新副本。它的缺点之一是它需要一个正在运行的主节点。另一个是缺乏对备份数据的“即时”压缩,也没有对过时的备份文件进行内置清理。有些人喜欢其他备份解决方案,例如WAL-E, pgBackRest, Barman 等,或者只是滚动自己的脚本。为了适应所有这些用例,Patroni支持运行自定义脚本来克隆新副本。这些在postgresql 配置块中配置:
postgresql: create_replica_methods: - <method name> <method name>: command: <command name> keep_data: True no_params: True no_master: 1
示例:wal_e
postgresql: create_replica_methods: - wal_e - basebackup wal_e: command: patroni_wale_restore no_master: 1 envdir: {{WALE_ENV_DIR}} use_iam: 1 basebackup: max-rate: '100M'
示例:pgbackrest
postgresql: create_replica_methods: - pgbackrest - basebackup pgbackrest: command: /usr/bin/pgbackrest --stanza=<scope> --delta restore keep_data: True no_params: True basebackup: max-rate: '100M'
create_replica_methods 定义了可用的副本创建方法及其执行顺序。
Patroni 将在第一个返回 0 的方法上停止。每个方法都应该在配置文件中定义一个单独的部分,列出要执行的命令以及应该传递给该命令的任何自定义参数。 所有参数将以 --name=value 格式传递。 除了用户定义的参数外,Patroni 还提供了几个特定于集群的参数:
--scope 这个副本属于哪个集群
--datadir 副本的数据目录
--role 复制用户的名字,总是‘replica’
--connstring 连接字符串以连接到要克隆的集群成员(主或其他副本)。 连接字符串中的用户可以执行 SQL 和复制协议命令。
如果定义了特殊的no_master参数,即使没有运行中的主服务器或副本,Patroni也可以调用副本创建方法。在这种情况下,将在连接字符串中传递一个空字符串。这对于从二进制备份还原以前运行的集群很有用
如果定义了特殊的keep_data参数,它将指示Patroni在调用restore之前不清除PGDATA文件夹。
如果定义了特殊的no_params参数,则将传递参数限制为自定义命令。basebackup 方法是一种特殊情况:如果create_replica_methods为空,将使用它,尽管可以在create_replica_methods方法中明确列出它。此方法使用pg_basebackup初始化一个新副本,除非有带有clonefrom标签的副本,否则基本备份将从主获取,在这种情况下,此类副本之一将用作pg_basebackup的来源。
它无需任何配置即可工作。但也可能指定basebackup配置节。适用与其他方法配置相同的规则,即,仅应在此处指定长选项(带有–)。
并非所有参数都有意义,如果您覆盖了连接字符串或提供了创建已压缩或压缩的基本备份的选项,则patroni将无法从中创建副本。传递给basebackup部分的参数的名称或值不执行验证
另请注意,如果符号链接用于 WAL 文件夹,则由用户指定正确的 --waldir 路径作为选项,以便在副本构建或重新初始化后符号链接将持续存在。但是,只有pg v10之后才支持此选项。
您可以将 basebackup 参数指定为映射(键值对)或元素列表,其中每个元素可以是键值对或单个键(对于不接收任何值的选项,例如 ,--verbose)。 考虑这两个例子:
postgresql: basebackup: max-rate: '100M' checkpoint: 'fast'
和
postgresql: basebackup: - verbose - max-rate: '100M' - waldir: /pg-wal-mount/external-waldir
如果所有副本创建方法都失败,Patroni 将在下一个事件循环周期内按顺序重试所有方法。
9.3 备用集群
另一个可用选项是运行“备用集群”,其中仅包含从某个远程主节点复制的备用节点。 这种类型的集群具有:
• “standby leader”,其行为与常规集群领导者非常相似,只是它从远程主服务器复制。
• cascade replicas,从备用leader复制。
Standby leader持有并更新 DCS 中的leader锁。 如果leader锁到期,cascade replicas将执行选举以从备用replica中选择另一个leader。
为了灵活性,您可以通过在standby_cluster 部分提供create_replica_methods 键来指定在集群处于“备用模式”时创建副本和恢复WAL 记录的方法。 与创建副本不同,当集群分离并作为普通集群运行时,由 postgresql 部分中的 create_replica_methods 控制。 postgresql 部分中的“standby”和“normal” create_replica_methods 引用键。
bootstrap: dcs: standby_cluster: host: 1.2.3.4 port: 5432 primary_slot_name: patroni create_replica_methods: - basebackup
要配置这样的集群,您需要在Patroni配置中指定standby_cluster 部分:
请注意,这些选项在集群引导期间只会应用一次,之后更改它们的唯一方法是通过 DCS。
如果在备集群上使用复制槽,还必须在主集群上创建对应的复制槽。 备用集群实施不会自动完成。 您可以在主集群上使用 Patroni 的永久复制槽功能来维护与 primary_slot_name 同名的复制槽,或者如果未提供 primary_slot_name 则为默认值。
第10章 复制模式
Patroni 使用 PostgreSQL 流复制。有关流式复制的更多信息,请参阅Postgres 文档。默认情况下,Patroni 将 PostgreSQL 配置为异步复制。选择复制模式取决于您的业务考虑。调查异步和同步复制以及其他 HA 解决方案,以确定哪种解决方案最适合您。
10.1异步模式持久性
在异步模式下,集群允许丢失一些已提交的事务以确保可用性。当主服务器由于任何其他原因出现故障或变得不可用时,Patroni 会自动将一个足够健康的备用服务器提升为主服务器。任何尚未复制到该备用数据库的事务都保留在主数据库上的“分叉时间线”中,并且实际上无法恢复[1]。
可以丢失的交易量通过maximum_lag_on_failover参数进行控制。由于未实时采样主事务日志位置,因此实际上,故障转移时丢失的数据量是最坏的情况,受限于事务日志的maximum_lag_on_failover字节加上最近ttl秒内写入的数据量(一般情况下是loop_wait/2秒)。但是典型的复制延迟要不到一秒钟。
默认情况下,在进行领导者选举时,Patroni 不会考虑副本的当前时间线,这在某些情况下可能是不受欢迎的行为。您可以通过将check_timeline参数的值更改为true来防止与以前的主节点没有相同时间轴的节点成为新的领导者。
10.2 PostgreSQL 同步复制
您可以在Patroni中使用Postgres的同步复制。同步复制通过在成功返回连接客户端之前确认已写入辅助节点来确保整个群集的一致性。同步复制的成本:降低写入吞吐量。 此吞吐量将完全基于网络性能。
在托管数据中心环境(如 AWS、Rackspace 或您无法控制的任何网络)中,同步复制显著提高了写入性能的可变性。如果主库无法访问从库,主库实际上变为只读。
要启用简单的同步复制测试,请将以下几行添加到YAML 配置文件的parameters部分:
synchronous_commit: "on"
synchronous_standby_names: "*"
使用 PostgreSQL 同步复制时,至少使用三个 Postgres 数据节点,以确保一台主机故障时的写入可用性。
使用 PostgreSQL 同步复制并不能保证在所有情况下都零丢失事务。当当前充当同步副本的主节点和辅助节点同时发生故障时,将提升可能不包含所有事务的第三个节点。
10.3同步模式
对于不允许丢失已提交事务的用例,您可以打开 Patroni 的synchronous_mode. 当synchronous_mode打开时 Patroni 不会提升备用数据库,除非确定备用数据库包含所有可能已将成功提交状态返回给客户端[2] 的事务。这意味着即使某些服务器可用,系统也可能无法进行写入。即使导致事务丢失,系统管理员仍然可以使用手动故障转移命令来提升备用数据库。
开启synchronous_mode并不能保证在所有情况下多节点提交的持久性。当没有合适的备用服务器可用时,主服务器仍将接受写入,但不能保证其复制。当主服务器在此模式下发生故障时,将不会升级备用服务器。当曾经的主机恢复时,它将自动升级,除非系统管理员执行了手动故障转移。 此行为使同步模式可用于2个节点群集。
当synchronous_mode开启并且从机崩溃时,提交将被阻塞,直到Patroni的下一次迭代运行并将主模式切换为独立模式(最坏情况的写入延迟为ttl秒,平均情况为loop_wait/2秒)。手动关闭或重新启动备用数据库不会导致提交服务中断。 在启动PostgreSQL关闭之前,备用服务器将指示主要数据库从同步备用数据库任务中释放出来。
如果绝对有必要确保每个写入都可以持久存储在至少两个节点上,则除了启用synchronous_mode之外,还启用synynchronous_mode_strict。当没有可用的同步备用候选者时,此参数可防止Patroni关闭主服务器上的同步复制。不利的一面是,主数据库不可用于写操作(除非Postgres事务显式转换为synchronous_mode),从而阻止所有客户端写请求,直到出现至少一个同步副本为止。
您可以通过将nosync设置为true来确保备用数据库永远不会成为同步备用数据库。 建议为慢速网络连接之后的备用服务器设置此选项,防止在成为同步备用服务器时会导致性能下降。
同步模式可以通过 Patroni REST 界面打开和关闭。有关说明,请参阅动态配置。
注意:由于PostgreSQL中实现同步复制的方式,即使使用synchronous_mode_strict,仍有可能丢失事务。如果在等待确认复制时取消了PostgreSQL后端(由于客户端超时或后端失败而取消了数据包),则其他后端会看到事务更改。此类更改尚未复制,在从库升级时可能会丢失。
10.4同步复制因素
Patroni使用参数synchronous_node_count来管理同步备用数据库的数量。默认情况下设置为1。当synchronous_mode设置为关闭时它不起作用。启用后,Patroni会根据参数synchronous_node_count管理精确数量的同步备用数据库,并在成员加入和离开时调整DCS和sync_standby_names中的状态。
10.5同步模式实现
当处于同步模式时,Patroni 在 DCS 中维护同步状态,其中包含最新的主数据库和当前同步备用数据库。使用严格的排序约束更新此状态以确保以下不变量:
•只要节点可以接受写入事务,就必须将其标记为最新的领导者。Patroni 崩溃或 PostgreSQL 未关闭可能会导致违反此变量。
•在PostgreSQL中,只要节点发布为同步备用数据库,就必须将其设置为同步备用数据库。
•非领导者或当前同步备用的节点不允许自动升级。
•Patroni 将仅根据synchronous_node_count参数将一个或多个同步备用节点分配给synchronous_standby_names。
在每个 HA 循环迭代中,Patroni 重新评估同步备用节点的选择。如果同步备用节点的当前列表已连接并且尚未请求删除其同步状态,则它保持被选中。否则,将选择复制中最靠前的可用于同步的集群成员。
[1]
数据仍然存在,但是要恢复数据,需要数据恢复专家进行手动恢复。当允许Patroni使用use_pg_rewind参数进行rewind时,分叉的时间线将被自动删除,并且将失败的主节点重新加入集群。
[2]
客户端可以使用 PostgreSQL 的synchronous_commit设置更改每个事务的行为。synchronous_commit值为off和 local的事务可能会在故障转移时丢失,但不会被复制延迟阻塞。
第11章 集群的暂停/恢复模式
11.1目标
在某些情况下,Patroni 需要暂时退出集群管理,同时仍保留 DCS 中的集群状态。可能的用例是集群上的不常见活动,例如主要版本升级或损坏恢复。在这些活动中,节点经常因为 Patroni 不知道的原因启动和停止,一些节点甚至可以临时提升,违反了只运行一个主节点的假设。因此,Patroni 需要能够与正在运行的集群“分离”,在 Pacemaker 中实现等效的维护模式。
11.2实施
当 Patroni 在暂停模式下运行时,它不会改变 PostgreSQL 的状态,但以下情况除外:
•对于每个节点,将有关集群的当前信息更新DCS中的member键中。如果member正在运行,这会导致 Patroni 在member节点上运行只读查询。
•对于带leader 锁的Postgres主节点,Patroni 更新锁。如果带有leader锁的节点不再是主节点(即手动降级),Patroni将释放锁,而不是将节点提升回主节点。
•允许进行计划外的手动重新启动,重新初始化和手动故障转移。 仅在指定要故障转移到的节点时,才允许进行手动故障转移。在暂停模式下,手动故障转移不需要运行中的主节点。
•如果Patroni检测到“并行”主,它会发出警告,但不会在没有leader锁的情况下降级主。
•如果集群中没有leader锁,则运行的master将获取该锁。如果有多个主节点,则第一个获得锁的主节点获胜。如果完全没有主,Patroni 不会尝试提升任何副本。此规则中有一个例外:如果由于旧主降级而不存在leader锁,那么只有升级请求中提到的候选节点可以获取leader锁。授予新的leader锁后(即手动升级从后),Patroni确保从上一个leader流式传输的副本将切换成新的主。
•当 Postgres 停止时,Patroni 不会尝试启动它。当 Patroni 停止时,它不会尝试停止它正在管理的 Postgres 实例。
11.3用户指南
patronictl支持pause和resume命令。
还可以使用 {"pause": true/false/null}键发送 PATCH请求到 {namespace}/{cluster}/config
第12章 将 Patroni 与 Kubernetes 结合使用
Patroni 可以使用 Kubernetes 对象来存储集群状态并管理leader键。这使得它能够在没有任何一致性存储的 Kubernetes 环境中运行 Postgres,即不需要运行额外的 Etcd 部署。Patroni 可以使用两种不同类型的 Kubernetes 对象来存储leader和配置键,它们使用kubernetes.use_endpoints或PATRONI_KUBERNETES_USE_ENDPOINTS 环境变量进行配置。
12.1使用 Endpoints
尽管这是推荐的模式,但出于兼容性的原因,默认情况下它是关闭的。启用时,Patroni将集群配置和leader键存储在它创建的各个端点的metadata: annotations字段中。更改leader比使用ConfigMaps更安全,因为包含leader 信息的注释和指向正在运行的leader的实际地址都会一次性同时更新。
12.2使用 ConfigMaps
在这种模式下,Patroni 将创建 ConfigMaps 而不是 Endpoints 并将键存储在这些 ConfigMaps 的元数据中。更改leader至少需要两次更新,一个更新到leader ConfigMap,另一个更新到相应的端点。
有两种方法可以将流量引导到 Postgres master:
•使用Patroni 提供的回调脚本
•配置 Kubernetes Postgres 服务以使用带有role_label的标签选择器(在patroni配置中配置)。
请注意,在某些情况下,例如,在 OpenShift(OpenShift是红帽的云开发平台即服务)上运行时,除了使用 ConfigMaps 之外别无选择。
12.3配置
Patroni Kubernetes设置 和 环境变量在文档中进行了描述。
12.4示例
•Patroni 存储库的kubernetes文件夹包含 Docker 镜像、Kubernetes 清单和回调脚本的示例,以便测试 Patroni Kubernetes 设置。请注意,在当前状态下,由于权限问题,它将无法使用 PersistentVolumes。
•您可以在Spilo Project 中找到可以使用 Persistent Volumes 的全功能 Docker 镜像 。
•Helm chart 用于部署使用Kubernetes运行的Patroni配置的Spilo映像。
•为了使用 Patroni 和 Spilo 大规模运行您的数据库集群,请查看 postgres-operator项目。它实现了操作员模式来管理 Spilo 集群。
第13章 WatchDog支持
将多个 PostgreSQL 服务器作为主服务器运行可能会因时间线不同而导致事务丢失。这种情况也称为脑裂问题。为了避免裂脑,Patroni 需要确保 PostgreSQL 在 DCS 中的leader键过期后不会接受任何事务提交。在正常情况下,当leader锁更新因任何原因失败时,Patroni 会尝试通过停止 PostgreSQL 来实现这一点。但是,由于各种原因,这可能不会发生:
•Patroni 因错误、内存不足或被系统管理员意外杀死而崩溃。
•关闭 PostgreSQL 太慢了。
•由于系统负载过高、虚拟机管理程序暂停虚拟机或其他基础架构问题,Patroni 无法运行。
为了保证在这些条件下的正确行为,Patroni 支持WatchDog设备。WatchDog设备是软件或硬件机制,当它们在指定的时间范围内没有获得保持活动的心跳时,它们将重置整个系统。这增加了额外的故障安全层,以防通常的 Patroni 脑裂保护机制失败。
Patroni 会在将 PostgreSQL 提升为 master 之前尝试激活WatchDog。如果WatchDog激活失败并且WatchDog模式是required那么节点将拒绝成为主节点。在决定参加leader选举时,Patroni 还将检查WatchDog配置是否允许它成为leader。在将 PostgreSQL 降级后(例如由于手动故障转移),Patroni 将再次禁用WatchDog。当 Patroni 处于暂停状态时,WatchDog也将被禁用。
默认情况下,Patroni 会将WatchDog设置为在 TTL 到期前 5 秒到期。使用默认设置loop_wait=10和ttl=30这使 HA 循环至少有 15 秒 ( ttl- safety_margin- loop_wait) 才能在系统被强制重置之前完成。默认情况下,访问 DCS 配置为在 10 秒后超时。这意味着当 DCS 不可用时,例如由于网络问题,Patroni 和 PostgreSQL 将有至少 5 秒(ttl- safety_margin- loop_wait- retry_timeout)进入所有客户端连接终止的状态。
安全裕度是 Patroni 为leader键更新和WatchDog keepalive之间的时间预留的时间量。Patroni 将在确认leader键更新后立即尝试发送一个 keepalive。如果 Patroni 进程在恰到好处的时刻暂停较长时间,则保活可能会延迟超过安全裕度而不会触发WatchDog。这导致在leader键到期之前WatchDog不会触发的时间窗口,从而使保证无效。为了绝对确保WatchDog在所有情况下都会触发,通过设置safety_margin为 -1 将WatchDog超时设置为TTL 的一半后过期。如果需要此保证,您可能应该增加ttl和/或减少loop_wait和retry_timeout。
目前WatchDog仅支持使用 Linux Watchdog设备接口。
13.1在 Linux 上设置软件WatchDog
/dev/watchdog如果 Patroni 可以访问,默认的 Patroni 配置将尝试在 Linux上使用。对于大多数用例,使用内置在Linux内核中的watchdog 软件是足够安全的。
要启用软件WatchDog,请在启动 Patroni 之前以 root 身份发出以下命令:
modprobe softdog
# Replace postgres with the user you will be running patroni under
chown postgres /dev/watchdog
对于测试,通过向modprobe命令行添加soft_noboot=1来禁用重新启动可能会有所帮助。在这种情况下,watchdog 只会在内核环形缓冲区中记录一行,通过dmesg可见。
成功启用后,Patroni 将记录有关WatchDog的信息。
第14章 发行说明
14.1 Version 2.1.1
新功能
支持 ETCD SRV 名称后缀 (David Pavlicek)
Etcd 允许区分同一域下的多个 Etcd 集群,从现在起 Patroni 也支持它。
与新领袖(huiyalin525)一起丰富历史
它将新列添加到patronictl history输出中。
使 CA 包可配置用于集群内 Kubernetes 配置 (Aron Parsons)
默认情况下,Patroni 正在使用/var/run/secrets/kubernetes.io/serviceaccount/ca.crt,这个新功能允许指定自定义kubernetes.cacert.
支持动态注册/注销为 Consul 服务和更改标签 (Tommy Li)
以前它需要 Patroni 重新启动。
Bug修复
避免不必要的 REST API 重新加载 (Alexander Kukushkin)
如果在磁盘上发生更改,先前版本添加了重新加载 REST API 证书的功能。不幸的是,重新加载是在开始后无条件发生的。
etcd.use_proxies设置时不解析集群成员(Alexander)
Patroni 启动时通过查询成员列表来检查 Etcd 集群的健康状况。除此之外,它还尝试解析他们的主机名,这在通过代理使用 Etcd 时是不必要的,并且会导致不必要的警告。
跳过pg_stat_replication中具有NULL值的行(Alexander)
似乎pg_stat_replication视图在replay_lsn、flush_lsn或write_lsn字段中可能包含空值,即使state='streaming'。
14.2 Version 2.1.0
此版本增加了与 PostgreSQL v14 的兼容性,使逻辑复制槽能够在故障转移/切换中幸存下来,实现对 REST API 的许可名单的支持,并将日志数量减少到每个心跳一行。
新功能
与 PostgreSQL v14的兼容性 (Alexander Kukushkin)
如果patroni本身未处于“暂停”模式,则取消暂停WAL replay。由于某些参数的更改,例如主节点上的max_connections,可能会“暂停”。
故障转移逻辑槽 (Alexander)
使逻辑复制槽在 PostgreSQL v11+ 上的故障转移/切换中继续存在。复制槽如果从主复制到副本并重新启动,然后pg_replication_slot_advance()函数用于将其向前移动。因此,插槽在故障转移之前已经存在,不应丢失任何事件,但是,某些事件可能会被多次传递。
为 Patroni REST API实施许可名单(Alexander)
如果已配置,则仅允许匹配规则的 IP 调用不安全的端点。除此之外,还可以自动将集群成员的 IP 包含到列表中。
添加了对通过 unix 套接字进行复制连接的支持 (Mohamad El-Rifai)
以前 Patroni 总是使用 TCP 进行复制连接,这可能会导致 SSL 验证出现一些问题。使用 unix 套接字允许免除复制用户的 SSL 验证。
用户定义标签的健康检查 (Arman Jafari Tehrani)
连同预定义标签:可以指定在输出和 REST API 中可见的任意数量的自定义标签。从现在开始,可以在健康检查中使用自定义标签。patronictl list
添加了 Prometheus/metrics端点(Mark Mercado、Michael Banck)
端点公开与/patroni.
减少 Patroni 日志的输出 (Alexander)
当一切正常时,每次运行 HA 循环只会写入一行。
重大变化
旧的永久逻辑复制插槽功能将不再适用于PostgreSQL v10及更旧版本(Alexander)
在执行升级后创建逻辑槽的策略不能保证没有逻辑事件丢失并因此被禁用。
如果节点持有锁,/leader端点始终返回200(Alexander)
提升备集群需要更新负载均衡器的健康检查,不是很方便,容易忘记。为了解决这个问题,我们改变了/leader健康检查端点的行为。它会返回 200 而不考虑集群是正常的还是standby_cluster.
Raft 支持的改进
Raft 流量加密的可靠支持
由于PySyncObj加密支持中的不同问题非常不稳定
处理 Raft 实现中的 DNS 问题 (Alexander)
如果self_addr和/或partner_addrs使用 DNS 名称而不是 IP 进行配置,PySyncObj则在创建对象时仅有效地进行一次解析。当同一个节点使用不同的 IP 重新上线时,它会导致问题。
稳定性改进
与psycopg2-2.9+的兼容性(Alexander)
在psycopg2中,with connection块中忽略autocommit=True,这会中断复制协议连接。
使用 Zookeeper修复过多的HA循环运行(Alexander)
成员 ZNode 的更新引起了连锁反应,并导致连续多次运行 HA 循环。
如果 REST API 证书在磁盘上发生更改,则重新加载 (Michael Todorovic)
如果 REST API 证书文件就地更新,则 Patroni 不会执行重新加载。
如果使用 kerberos 身份验证,则不创建 pgpass 目录 (Kostiantyn Nemchenko)
Kerberos 和密码验证是相互排斥的。
修复了自定义引导程序的小问题(Alexander)
仅当我们进行PITR时,才使用hot_standby=off启动Postgres,并在PITR完成后重新启动。
Bug修复
与kazoo-2.7+的兼容性(Alexander)
由于 Patroni 自己处理重试,它依赖于旧行为,kazoo当没有可用连接时,会立即丢弃对 Zookeeper 集群的请求。
当知道我们通过代理连接时,显式请求 Etcd v3 集群的版本 (Alexander)
Patroni 正在通过 gPRC-gateway 使用 Etcd v3 集群,它取决于集群版本,必须使用不同的端点(/v3、/v3beta、 或/v3alpha)。该版本仅与集群拓扑一起解决,但由于后者在通过代理连接时从未完成。
14.3 Version 2.0.2
新功能
能够忽略外部管理的复制槽 (James Coleman)
Patroni 正在尝试删除它不知道的任何复制槽,但肯定存在应该在外部管理复制槽的情况。从现在开始,可以配置不应删除的插槽。
添加了对 REST API 密码套件限制的支持(Gunnar “Nick” Bluth)
它可以通过restapi.ciphers或PATRONI_RESTAPI_CIPHERS环境变量进行配置。
添加了对 REST API 加密 TLS 密钥的支持(Jonathan S. Katz)
它可以通过restapi.keyfile_password或PATRONI_RESTAPI_KEYFILE_PASSWORD环境变量进行配置。
REST API 身份验证凭据的恒定时间比较 (Alex Brasetvik)
使用hmac.compare_digest()而不是==,容易受到定时攻击。
根据复制延迟选择同步节点 (Krishna Sarabu)
如果同步节点上的复制延迟开始超过配置的阈值,则可以将其降级为异步和/或由另一个节点替换。行为受maximum_lag_on_syncnode控制。
稳定性改进
在进行自定义引导时,使用hot_standby=off启动postgres(Igor Yanchenko)
在自定义引导期间,Patroni 正在恢复 basebackup,启动 Postgres,并等待恢复完成。备用数据库上的一些 PostgreSQL 参数不能小于主数据库的参数,如果新值(从 WAL 恢复)高于配置的值,Postgres 会崩溃并停止。为了避免这种行为,我们将在没有hot_standby模式的情况下进行自定义引导。
如果所需的WatchDog不健康,则警告用户 (Nicolas Thauvin)
当WatchDog设备不可写或在required模式下丢失时,无法提升成员。添加了一个警告,以向用户显示在哪里搜索此错误配置。
更详细的单用户模式恢复 (Alexander Kukushkin)
如果 Patroni 注意到 PostgreSQL 没有明确关闭,在某些情况下,崩溃恢复是通过在单用户模式下启动 Postgres 来执行的。可能会发生恢复失败(例如由于磁盘空间不足)但错误被吞下的情况。
添加了与python-consul2模块的兼容性(Alexander、Wilfried Roset)
好东西python-consul几年后就没有维护了,因此有人创建了一个带有新功能和错误修复的分支。
运行patronictl时不使用bypass_api_service(Alexander)
当 K8s pod 在非default命名空间中运行时,它不一定有足够的权限来查询kubernetes端点。在这种情况下,Patroni 会显示警告并忽略bypass_api_service设置。在patronictl警告的情况下有点烦人。
raft.data_dir如果它不存在则创建或确保它是可写的 (Mark Mercado)
提高了用户友好性和可用性。
Bug修复
如果在暂停时失去Leader锁,不要中断重启或升级(亚历山大)
在暂停中,允许在没有锁定的情况下将 postgres 作为主运行。
修复了REST API中的shutdown_request()问题(Nicolas Limage)
为了改进 SSL 连接的处理并延迟握手直到线程启动,Patroni 覆盖了HTTPServer. 该shutdown_request()方法被遗忘了。
修复了使用 Zookeeper时睡眠时间的问题(Alexander)
在运行 HA 代码之间,Patroni 有可能多睡两倍。
修复了os.symlink()引导失败后移动数据目录时的无效调用 (Andrew L'Ecuyer)
如果引导失败 Patroni 正在重命名数据目录、pg_wal 和所有表空间。之后它会更新符号链接,以便文件系统保持一致。由于src和dst参数被交换,符号链接创建失败。
修复了 post_bootstrap() 方法中的错误 (Alexander)
如果没有配置超级用户密码,Patroni 将无法调用post_init脚本,因此整个引导程序都失败了。
修复了备用集群中 pg_rewind 的问题 (Alexander)
如果超级用户名不同于Postgres,则备用集群中的pg_rewin失败,因为连接字符串不包含数据库名称。
仅当使用 Etcd v3 的身份验证显式失败时才退出 (Alexander)
启动时,Patroni 执行 Etcd 集群拓扑的发现,并在必要时进行身份验证。可能会发生其中一个 etcd 服务器不可访问的情况,Patroni 尝试在该服务器上执行身份验证并失败,而不是使用下一个节点重试。
处理psutil cmdline()返回空列表的情况(Alexander)
僵尸进程仍然是postmaster子进程,但它们没有cmdline()
将PATRONI_KUBERNETES_USE_ENDPOINTS环境变量视为布尔值(Alexander)
不这样做会导致无法kubernetes.use_endpoints通过环境禁用。
改进对并发端点更新错误的处理 (Alexander)
Patroni 将显式查询当前端点对象,验证当前 pod 是否仍然持有Leader锁并重复更新。
14.4 Version 2.0.1
新功能
如果没有可用的寻呼机,请在patronictl edit-config中使用“更多”作为寻呼机(Pavel Golub)
在Windows上,它将是more.com。除此之外,在requirements.txt中cdiff被更改为ydiff,但为了兼容性,patronictl仍然支持两者。
增加了对raft bind_addr和password的支持(Alexander Kukushkin)
raft.bind_addr在 NAT 后面运行时可能很有用。raft.password启用流量加密(需要该cryptography模块)。
添加了sslpassword连接参数支持 (Kostiantyn Nemchenko)
连接参数是在 PostgreSQL 13 中引入的。
稳定性改进
改变暂停时的行为(Alexander)
bootstrap如果PGDATA目录丢失/为空,Patroni 将不会调用该方法。
Patroni 不会在暂停时因 sysid 不匹配而退出,只会记录警告。
如果 Postgres 未在恢复中运行(接受写入)但 sysid 与初始化密钥不匹配,则节点将不会尝试在暂停模式下获取Leader键。
master_start_timeout执行崩溃恢复时应用(Alexander)
如果 Postgres 在Leader节点上崩溃,Patroni 通过在单用户模式下启动 Postgres 来执行崩溃恢复。在崩溃恢复期间,Leader锁正在更新。如果崩溃恢复没有在master_start_timeout几秒钟内完成,Patroni 将强制停止并释放Leader锁。
从urllib3要求中删除了secure extra(Alexander)
添加它的唯一原因是ipaddress对 python 2.7的依赖。
Bug修复
修复了Kubernetes.update_leader()中的一个bug(Alexander)
当Leader键更新失败时,一个未处理的异常阻止了主的降级。
修复了patronictl使用 RAFT 时挂起的问题(Alexander)
将patronictl与 Patroni 配置一起使用时,应将self_addr添加到partner_addr。
修复了get_guc_value()中的错误(Alexander)
patroni未能在PostgreSQL 12上获取restore_command值,因此获取pg_rewind缺少的WAL不起作用。
14.5 Version 2.0.0
此版本增强了与PostgreSQL 13的兼容性,增加了对多个同步备节点的支持,在处理pg_rewind方面有了显著的改进,增加了对纯RAFT上的Etcd v3和Patroni的支持(没有Etcd、Consor或Zookeeper),并且可以选择调用pre_promote(围栏)脚本。
PostgreSQL 13支持
• 在PostgreSQL 13+上升级到standby_leader时不启动on_reload(Alexander Kukushkin)
当升级到standby_leader时,我们会更改primary_conninfo,更新角色并重新加载。由于on_role_change和on_reload实际上是相互重复的,所以Patroni将只调用on_role_change。
• 增加了对gssencmode和channel_binding连接参数的支持(Alexander)
PostgreSQL 12引入了gssencmode和13 channel_binding连接参数,现在如果在PostgreSQL.authentication部分中定义,则可以使用它们。
• 将wal_keep_segments重命名为wal_keep_size(Alexander)
如果出现配置错误(13的wal_keep_segments 和旧版本的wal_keep_size),Patroni将自动调整配置。
• 如果可能的话,在13上使用pg_rewind和--restore-target-wal(Alexander)
在PostgreSQL 13上,用户检查restore_command是否已配置,并告诉pg_rewind使用它。
新功能
• [BETA]在pure RAFT上实施对patroni的支持(Alexander)
这使得运行Patroni无需依赖第三方,如Etcd、Consor或Zookeeper成为可能。对于HA,您必须运行三个patroni节点或两个带有patroni的节点,以及一个带有patronictl的节点。有关更多信息,请查看文档。
• [BETA]通过gPRC-gateway实现对Etcd v3协议的支持(Alexander)
ETCD3.0在四年多前发布,默认情况下ETCD3.4已禁用v2。也有可能从Etcd中完全删除v2,因此我们在patroni中实现了对Etcd v3的支持。为了开始使用它,您必须显式地创建etcd3部分,即patroni配置文件。
• 支持多个同步备节点(Krishna Sarabu)
它允许运行具有多个同步副本的集群。同步副本的最大数量由新参数synchronous_node_count控制。默认情况下,它设置为1,并且在synchronous_mode设置为off时不起作用。
• 增加了调用pre_promote脚本的可能性(Sergey Dudoladov)
与回调不同,pre_promote脚本是在获取leader锁之后,但在升级Postgres之前同步调用的。如果脚本失败或退出时带有非零退出代码,则当前节点将释放leader锁。
• 增加了对配置目录的支持(Floris van Nee)
按字母顺序加载和应用目录中的YAML文件。
• PostgreSQL参数的高级验证(Alexander)
如果当前PostgreSQL版本不支持该特定参数,或者其值不正确,则Patroni将完全删除该参数或尝试修复该值。
• 升级后强制检查点完成时唤醒主线程(Alexander)
副本正在等待通过DCS中leader的ember键指示检查点。密钥通常仅在每个HA循环中更新一次。在不唤醒主线程的情况下,副本的等待时间将比需要的时间长loop_wait秒。
• 在9.6+上使用pg_stat_wal_recevier视图(Alexander)
该视图包含primary_conninfo和primary_slot_name的最新值,而recovery.conf的内容可能已过时。
• 改进了Patroni配置文件中IPv6地址的处理(Mateusz Kowalski)
IPv6地址应该用方括号括起来,但我希望能清楚地表达出来。现在这两种格式都受支持。
• 添加Consul service_tags配置参数(Robert Edström)
它们对于动态服务发现非常有用,例如负载平衡器。
• 为Zookeeper实施SSL支持(Kostiantyn Nemchenko)
它要求kazoo>=2.6.0。
• 自定义引导方法的已实现(无参数)选项(Kostiantyn)
它允许调用wal-g、pgBackRest和其他备份工具,而无需将它们包装到shell脚本中。
• 在失败的初始化之后移动WAL和表空间(Feike Steenbergen)
在执行reinit时,Patroni不仅删除了PGDATA,还删除了符号链接的WAL目录和表空间。现在,move_data_directory()方法将执行类似的工作,即重命名WAL目录和表空间,并更新PGDATA中的符号链接。
改进了pg_rewind支持
• 改进的时间线差异检查(Alexander)
当副本上的重放位置不在切换点之前,或者前一主副本上的检查点记录的结尾与切换点相同时,我们不需要倒带。为了得到检查点记录的结尾,我们使用pg_waldump并解析其输出。
如果pg_rewind抱怨找不到WAL(Alexander)
pg_rewind所需的WAL段可能不再存在于pg_wal目录中,因此pg_rewind无法在分歧点之前找到检查点位置。从PostgreSQL 13开始,pg_rewind可以使用restore_command获取丢失的WAL。对于较旧的PostgreSQL版本,Patroni解析倒带尝试失败的错误,并尝试通过自己调用restore_command来获取丢失的WAL。
• 检测备用集群中的新时间线,并在必要时触发倒带/重新初始化(Alexander)
standby_cluster与主集群分离,因此不会立即知道Leader选举和时间线切换。为了检测事实,standby_leader定期检查pg_wal中的新历史文件。
• 缩短和美化历史日志输出(Alexander)
当Patroni试图找出pg_rewind的必要性时,它可以将主历史文件的内容写入日志。历史记录文件随着每次故障切换/切换而不断增长,最终开始占用太多的行,其中大部分都不是很有用。与显示原始数据不同,Patroni只显示当前副本时间线之前的3行和之后的2行。
K8s的改进
• 摆脱kubernetes python模块(Alexander)
官方的python kubernetes客户端包含大量自动生成的代码,因此非常繁重。Patroni只使用了K8S API端点的一小部分,实现对它们的支持并不困难。
• 使绕过kubernetes服务成为可能(Alexander)
在K8s上运行时,patroni通常通过kubernetes服务与K8s API通信,其地址在KUBERNETES_SERVICE_HOST环境变量中公开。与任何其他服务一样,kubernetes服务由kube-proxy处理,而kube-proxy又根据配置依赖于用户空间程序或iptables进行流量路由。跳过中间组件并直接连接到K8s主节点使我们能够实施更好的重试策略,并在K8s主节点升级时降低Postgres降级的风险。
• 同步一个Patroni集群的所有POD的HA循环(Alexander)
不这样做会将故障检测时间从ttl增加到ttl+loop_wait。
• 在K8s上的子集地址中填充references和nodename(Alexander)
一些load-balancers依赖于此信息。
• 修复update_leader()中可能的争用条件(Alexander)
在Patroni之外同时更新leader configmap或端点可能会导致update_leader()调用失败。在这种情况下Patroni重新检查当前节点是否仍然拥有leader锁,并重复更新。
• 明确禁止修补non-existent配置(Alexander)
对于kubernetes以外的DCS,由于cluster.config为None,PATCH调用失败,出现异常,但在kubernetes上,它很高兴地创建了配置注释,并阻止在引导完成后写入引导配置。
• 修正暂停时的错误(Alexander)
当缺少leader键时,复制副本正在删除primary_conninfo并重新启动Postgres,但它们不应执行任何操作。
REST API的改进
•延迟TLS握手,直到工作线程启动(Alexander,Ben Harris)
如果TLS握手是在API线程中完成的,并且client-side没有发送任何数据,则API线程将被阻塞(risking DoS)。
•独立于REST API中的客户端证书进行检查basic-auth(Alexander)
以前只验证了客户端证书。独立进行两次检查是绝对有效的(use-case)。
•在选项请求的HTTP头之后写入双CRLF(Sergey Burladyan)
HAProxy对一个CRLF很满意,而Consul health-check则抱怨连接中断和意外的EOF。
•GET/cluster正在显示Zookeeper的过时成员信息(Alexander)
端点使用的是Patroni内部群集视图。对于Patroni本身来说,它不会引起任何问题,但是当我们暴露在外部世界时,我们需要显示最新的信息,尤其是复制延迟。
•修复了备用集群的健康检查(Alexander)
主设备的GET /standby-leader和standby_leader的GET /master错误地响应了200。
•执行DELETE /switchover (Alexander)
REST API调用删除切换的任务计划。
•创建 /readiness就绪和 /liveness端点(Alexander)
当K8s服务与标签选择器一起使用时,它们有助于从子集地址中消除“unhealthy”的POD。
•增强的GET/replica和GET/async RESTAPI 健康检查(Krishna,Alexander)
检查现在支持可选关键字?lag=<max lag>,并且仅当滞后小于提供的值时才会响应200。如果依赖此功能,请记住,关于leader上的WAL位置的信息仅每隔loop_wait秒更新一次!
•在RESTAPI响应中添加了对用户定义的HTTP头的支持(Yogesh Sharma)
如果从浏览器发出请求,此功能可能会很有用。
Patronictl 改进
•不试图在patronictl pause中调用不存在的leader(Alexander)
暂停K8s上没有leader的集群时,patronictl显示无法访问成员“None”的警告。
• 处理成员conn_url丢失的情况(Alexander)
在K8s上,pod可能没有必要的注释,因为Patroni尚未运行。它使patronictl失败了。
• 增加了打印ASCII群集拓扑的能力(Maxim Fedotov,Alexander)
了解级联复制的集群概况非常有用
• 执行patronictl flush switchover(Alexander)
在此之前patronictl flush仅支持取消restart的任务计划。
错误修正
•使用现有PGDATA引导集群时出现属性错误(Krishna)
尝试create/update /history键时,Patroni正在访问尚未在DCS中创建的ClusterConfig对象。
• 改进了Consul中的异常处理(Alexander)
touch_member()方法中未处理的异常导致整个Patroni进程崩溃。
• 为post_init脚本强制执行synchronous_commit=local(Alexander)
在创建用户(replication, rewind)时,Patroni已经在这样做了,但在post_init的情况下没有这样做是一个疏忽。因此,如果脚本没有自己在内部执行,那么synchronous_mode中的引导就无法完成。
• Consul pool manager中的maxsize增加(ponvenkates)
在默认情况下(size=1),会生成一些警告。
• Patroni错误地报告Postgres正在运行(Alexander)
例如,当Postgres由于磁盘不足错误而崩溃时,状态未更新。
• 将*放入pgpass,而不是缺少或空值(Alexander)
例如,如果未指定standby_cluster.port,则生成的pgpass文件不正确。
• 跳过具有特殊角色的leader节点上的物理复制slot创建(Krishna)
当名称包含特殊字符如“-”(例如“abc-us-1”)时,Patroni似乎正在为leader节点创建一个休眠slot(定义slots时)。
• 避免在自定义引导中删除不存在的 pg_hba.conf(Krishna)
如果在自定义引导后pg_hba.conf恰好位于pgdata目录之外,则Patroni失败。
14.6 Version 1.6.5
新功能
• 主停止超时(Krishna Sarabu)
停止Postgres时允许Patroni等待的秒数。仅在启用synchronous_mode时有效。当设置为大于0的值且启用synchronous_mode时,如果停止操作的运行时间超过master_stop_timeout设置的值,则Patroni向postmaster发送SIGKILL。根据您的耐久性/可用性权衡设置值。如果参数未设置或设置为非正值,master_stop_timeout不起作用。
• 不使用主服务器的名称创建永久物理slot (Alexander Kukushkin)
当复制副本关闭时,主循环(WAL)段是一个常见问题。现在我们有了一个很好的静态集群解决方案,具有固定数量的节点和永不更改的名称。您只需要列出插槽中所有节点的名称,这样当节点关闭(未在DCS中注册)时,主节点将不会删除slot。
• 配置验证程序初稿(Igor Yanchenko)
使用patroni --validate-config patroni.yaml来验证Patroni配置。
• 配置时间线历史记录最大长度的可能性(Krishna)
Patroni将故障切换/切换的历史记录写入DCS中的/history键。随着时间的推移,这个键的大小会变大,但在大多数情况下,只有最后几行是有趣的。max_timeline_history参数允许指定要在DCS中保留的最大时间线历史项目数。
• Kazoo 2.7.0兼容性(Danyal Prout)
Kazoo的一些non-public方法更改了签名,但Patroni依赖于这些签名。
Patronictl 的改进
• 显示成员标签(Kostiantyn Nemchenko,Alexander)
标记是为每个节点单独配置的,没有简单的方法可以获得它们的概述。
• 提高成员产出(Alexander)
冗余集群名称不再显示在每一行上,只显示在表头中。
• 如果明确指定了配置文件但未找到,则失败(Kaarel Moppel)
以前,patronictl只报告DEBUG消息。
• 解决了未初始化K8s Pod破坏的问题patronictl(Alexander)
Patroni依赖K8s上的某些pod注释。当其中一个Patroni Pod停止或启动时,还没有有效的注释,并且patronictl异常失败。
稳定性改进
• 如果对K8s API服务器的列表调用失败,则应用1秒回退(Alexander)
这主要是为了避免淹没日志,但也有助于防止主线程不足。
• 如果K8s API返回retry-after HTTP头,请重试(Alexander)
如果K8s API服务器的请求太多,它可能会要求重试
• 从postmaster清除KUBERNETES_ 环境变量(Feike Steenbergen)
PostgreSQL不需要KUBERNETES_环境变量,但是将它们公开给postmaster也会将它们公开给后端和常规数据库用户(例如使用pl/perl)。
• 重新初始化时清理表空间(Krishna)
在reinit期间,Patroni只删除PGDATA并保留用户定义表空间目录。这导致了Patroni对其进行控制。以前解决该问题的方法是实现自定义引导脚本。
• 升级发生后显式执行CHECKPOINT(Alexander)
它有助于缩短新主设备可用于pg_rewind之前的时间。
• Etcd成员的智能刷新(Alexander)
如果patroni未能在Etcd集群的所有成员上执行请求,则patroni将re-check A或SRV记录中的IPs/hosts更改,然后重试。
• 跳过pg_controldata中缺失的值(Feike)
尝试使用与PGDATA不匹配的版本的二进制文件时,缺少值。不管怎样,Patroni都会尝试启动Postgres,Postgres会抱怨主版本不匹配,并因错误而中止。
错误修正
• 需要时禁用Consul 的SSL验证(Julien Riou)
从urllib3的某个版本开始,cert_reqs必须显式设置为ssl.cert_NONE,以便有效地禁用ssl验证。
• 避免在HA循环的每个周期上打开复制连接(Alexander)
回归在1.6.4中引入。
• 调用on_role_change失败的主上的回调(Alexander)
在某些情况下,这可能导致虚拟IP仍然连接到旧的主IP。回归在1.4.5中引入。
• 如果postgres在成功pg_rewind后启动,则重置倒带状态(Alexander)
由于这个错误,Patroni在暂停模式下手动启动并关闭postgres。
• 检查recovery.conf时将recovery_min_apply_delay转换为ms
如果在早于12的PostgreSQL上配置了recovery_min_apply_delay,则patroni将无限期地重新启动复制副本。
• PyInstaller兼容性(Alexander)
PyInstaller将Python应用程序冻结打包为独立的可执行文件。当我们切换到spawn方法而不是fork进行多处理时,兼容性被破坏。
14.7 Version 1.6.4
新功能
• 为patronictl reinit实现了--wait选项(Igor Yanchenko)
如果Patronictl使用了--wait选项,将等待reinit完成。
• 进一步改进Windows支持(Igor Yanchenko、Alexander Kukushkin)
1. 用于集成测试的所有shell脚本都用python重写
2. pg_ctl kill将用于在非posix系统上停止postgres
3. 不尝试使用unix域套接字
稳定性改进
• 确保unix_socket_directories和stats_temp_directory存在(Igor)
在启动Patroni和Postgres时,请确保unix_socket_directories和stats_temp_directory存在或尝试创建它们。如果创建失败,则Patroni将退出。
• 确保postgresql.pgpass位于patroni具有写访问权限的位置(Igor)
如果它没有写访问权限,我将异常退出。
• 默认情况下禁用Consul服务健康检查(Kostiantyn Nemchenko)
即使在网络出现小问题的情况下,失败的serfHealth也会导致与节点相关的所有会话失效。因此,leader键的丢失比ttl早得多,这会导致副本的不必要重新启动,并可能导致主降级。
• 为与K8s API的连接配置tcp keepalives(Alexander)
如果我们在TTL秒后没有从socket中获得任何信息,则可以认为它已死亡。
• 避免在用户创建时记录密码(Alexander)
如果密码被拒绝,或者日志被配置为verbose,或者根本没有配置,则可能会将密码写入postgres日志。为了避免这种情况,在尝试创建/更新用户之前,Patroni会将log_statement、log_min_duration_statement和log_min_error_statement更改为一些安全值。
错误修正
• 在级联副本上使用restore_command从standby_cluster配置(Alexander)
standby_leader从功能存在的一开始就已经在这样做了。在副本上不这样做可能会阻止它们赶上备集群leader。
• 由备用群集报告的更新时间线(Alexander)
在时间线切换的情况下,备用群集从主群集正确复制,但patronictl报告的是旧的时间线。
在副本上执行恢复参数验证时,如果在patroni配置中未定义恢复参数,而是在postgresql.auto.conf或postgresql.conf以外的文件中定义恢复参数,则patroni将跳过archive_cleanup_command,promote_trigger_file,recovery_end_command,recovery_min_apply_delay和restore_command。
• 改进postgresql参数的处理,名称中使用句点(Alexander)
这样的参数可以通过扩展来定义,其中单位不一定是字符串。更改该值可能需要重新启动(例如pg_stat_statements.max)。
• 改进shutdown期间的异常处理(Alexander)
shutdown期间,patroni试图更新其在DCS中的状态。如果无法访问DCS,则可能引发异常。缺少异常处理导致记录器线程无法停止。
14.8 Version 1.6.3
错误修正
• 运行pg_rewind时不暴露密码(Alexander Kukushkin)
Bug是在#1301中引入的
• 将postgresql.authentication中指定的连接参数应用于pg_basebackup和自定义副本创建方法(Alexander)
它们依赖于url-like连接字符串,因此从未应用参数。
14.9 Version 1.6.2
新特性
• 增加patroni --version(Igor Yanchenko)
它打印当前版本的Patenti并退出。
• 为所有http请求设置user-agent http头(Alexander Kukushkin)
Patenti通过http协议与Concur、Etcd和Kubernetes API进行通信。拥有一个专门设计的user-agent(例如:Patroni/1.6.2 Python/3.6.8 Linux)对于调试和监视可能很有用。
• 可以为异常回溯配置日志级别(Igor)
如果你设置log.traceback_level=DEBUG则只有当log.level=DEBUG时,才能看到回溯。
默认行为保持不变。
稳定性改进
• 搜索配置文件所需的模块时,避免导入所有DCS模块(Alexander)
如果我们只需要例如Zookeeper,则无需为Etcd、Consor和Kubernetes导入模块。它有助于减少内存使用,并解决信息消息导入smth失败的问题。
• 从明确需求中删除python requests模块(Alexander)
它没有用于任何重要的用途,但在发布新版本的urllib3时会引起很多问题。
• 改进处理etcd.hosts作为逗号分隔字符串而不是YAML数组写入(Igor)
以前,以格式host1:port1,host2:port2(逗号后的空格字符)编写时失败。
可用性改进
• 不强迫用户从patronictl的空列表中选择成员(Igor)
如果用户提供了错误的集群名称,我们将引发异常,而不是要求从空列表中选择成员。
• 如果REST API无法绑定,则使错误消息更有帮助(Igor)
对于没有经验的用户来说,可能很难从Python 堆栈跟踪中找出问题所在。
错误修正
• 固定计算wal_buffers(Alexander)
PostgreSQL 11中的基本单位已从8KB块更改为字节。
• 仅在PostgreSQL 10+上使用primary_conninfo中的passfile(Alexander)
在旧版本上,除非安装了最新版本的libpq,否则不能保证passfile能够工作。
14.10 Version 1.6.1
新特性
• 添加了PATRONICTL_CONFIG_FILE环境变量(msvechla)
它允许环境变量为patronictl提供--config-file参数。
• 添加patronictl history(Alexander Kukushkin)
它显示故障切换/切换的历史记录。
• 执行pg_rewind时在PGOPTIONS中通过-c statement_timeout=0(Alexander Kukushkin)
当服务器上的statement_timeout设置为某个较小的值,并且pg_rewind执行的某个语句被取消时,它可以防止出现这种情况
• 允许较低的PostgreSQL配置值(Soulou)
Patroni不允许将某些PostgreSQL配置参数设置为小于某些固定值。现在允许的最小值更小,默认值没有更改。
• 允许基于证书的身份验证(Jonathan S.Katz)
此功能为超级用户、复制用户和rewind 用户启用基于证书的身份验证,并允许用户指定要连接的sslmode。
• 使用primary_conninfo中的passfile而不是密码(Alexander Kukushkin)
它允许避免在postgresql.conf上设置600个权限
• 执行pg_ctl reload而不考虑配置更改(Alexander Kukushkin)
有些配置文件可能不受patroni控制。当有人通过restapi或向patroni进程发送SIGHUP进行重新加载时,通常是希望Postgres也会被重新加载。以前,当patroni配置的postgresql部分没有更改时,就不会发生这种情况。
• 比较所有恢复参数,而不仅仅是primary_conninfo(Alexander Kukushkin)
以前,check_recovery_conf() 方法只检查primary_conninfo是否已更改,从不考虑所有其他恢复参数。
• 使应用某些恢复参数而无需重新启动成为可能(Alexander Kukushkin)
从PostgreSQL 12开始,无需重新启动即可更改以下恢复参数:archive_cleanup_command, promote_trigger_file, recovery_end_command, and recovery_min_apply_delay。在未来的Postgres发行版中,该列表将被扩展,并且Patroni将自动支持该列表。
• 在线更改use_slots(Alexander Kukushkin)
以前它需要重新启动Patenti并手动移除。
• 启动Postgres时仅删除PATRONI_前缀的环境变量(Cody Coons)
它将解决运行不同的外部数据包装器的许多问题。
稳定性改进
• 使用K8s API时使用LIST + WATCH(Alexander Kukushkin)
它允许有效地接收对象更改(pods, endpoints/configmaps),并减少K8s主节点上的压力。
• 在引导过程中PGDATA不为空时改进工作流(Alexander Kukushkin)
根据initdb源代码,当只存在lost+found和.dotfiles时,它可能会考虑PGDATA空。现在,我也这么做了。如果PGDATA恰好为非空,同时从pg_controldata的角度来看无效,则Patroni将投诉并退出。
• 避免在每个HA循环上调用昂贵的os.listdir()(Alexander Kukushkin)
当系统处于IO压力下时,os.listdir() 可能需要几秒钟(甚至几分钟)才能执行,严重影响了patroni的HA循环。由于缺少更新,这甚至可能导致leader键从DCS中消失。有一种更好、更便宜的方法来检查PGDATA是否为空。现在,我们检查PGDATA中是否存在global/pg_control文件。
• 日志基础设施的一些改进(Alexander Kukushkin)
以前有可能在关机时丢失最后几行日志,因为日志线程是守护进程线程。
• 在Python3.4+上使用spawn多处理启动方法(Maciej Kowalczyk)
Python中的一个已知问题是线程和多处理不能很好地混合。建议从默认方法fork切换到spawn。不这样做可能会导致Postmaster启动流程挂起,并且Patroni会无限期地报告INFO: restarting after failure in progress,而Postgres实际上已启动并运行
REST API的改进
• 使在REST API中检查客户端证书成为可能(Alexander Kukushkin)
如果verify_client设置为required,则Patroni将检查所有REST API调用的客户端证书。将其设置为optional时,将检查所有不安全REST API端点的客户端证书。
• 如果Postgres未运行,则返回GET /replica健康检查请求的响应代码503(Alexander Anikin)
Postgres在开始接受客户端连接之前可能会花费大量时间进行恢复。
• 实现 /history和 /cluster端点(Alexander Kukushkin)
/history端点显示DCS中history键的内容。/cluster端点显示所有集群成员和一些服务信息,如挂起的和计划任务的重新启动或切换。
Etcd支持的改进
• 重试Etcd RAFT内部错误(Alexander Kukushkin)
关闭Etcd节点时,它会发送(response code=300,data='etcdserver:server stopped'),这会导致patroni降级主。
• 不过早放弃Etcd请求重试(Alexander Kukushkin)
当出现一些网络问题时,patroni会很快耗尽Etcd节点列表,并在不使用整个节点的情况下放弃retry_timeout,这可能会导致主节点降级。
错误修正
• 向pg_rewind用户授予执行权限时禁用 synchronous_commit(kremius)
如果引导是使用synchronous_mode_strict:true完成的,GRANT EXECUTE语句由于非同步节点可用而无限期等待。
• 修复python 3.7上的内存泄漏(Alexander Kukushkin)
patroni使用ThreadingMixIn处理REST API请求,默认情况下,python 3.7使线程为每个非守护进程请求生成。
• 修复异步操作中的竞争条件(Alexander Kukushkin)
恢复停止的Postgres的尝试有可能会覆盖condenictl reinit--force。结果是,当basebackup运行时,Patroni试图启动Postgres。
• 修复postmaster_start_time()方法中的争用条件(Alexander Kukushkin)
如果该方法是从RESTAPI线程执行的,则需要创建一个单独的游标对象。
• 修复了名称包含大写字母的同步待机无法升级的问题(Alexander Kukushkin)
我们将名称转换为小写,因为Postgres在将(application_name)与(synchronous_standby_names)中的值进行比较时也在执行相同的操作。
• 在启动新的回调进程之前,杀死所有子进程(Alexander Kukushkin)
如果不这样做,则很难在bash中实现回调,并最终导致两个回调同时运行的情况。
• 修复“启动失败”问题(Alexander Kukushkin)
在某些情况下,Postgres状态可能设置为“start failed”,尽管Postgres正在启动和运行。
14.11 Version 1.6.0
此版本增加了与PostgreSQL 12的兼容性,使得在PostgreSQL 11及更新版本上无需超级用户即可运行pg_rewind,并支持IPv6。
新功能
• Psycopg2已从要求中删除,必须独立安装(Alexander Kukushkin)
从2.8.0开始,psycopg2被分为两个不同的包:psycopg2和psycopg2 binary,可以同时安装到文件系统的同一位置。为了减少依赖问题,我们让用户选择如何安装它。有几个选项可用,请查阅文档。
• 与PostgreSQL 12的兼容性(Alexander Kukushkin)
从PostgreSQL 12开始,不再有recovery.conf,所有以前的恢复参数都转换为GUC。为了防止ALTER SYSTEM SET primary_conninfo或类似情况,patroni将解析postgresql.auto.conf并从中删除所有备用和恢复参数。patroni配置保持向后兼容。例如,尽管restore_command是一个GUC,但仍然可以在postgresql.recovery_conf.restore_command部分中指定它,并且对于postgresql 12,Patroni将把它写入postgresql.conf。
• 在PostgreSQL 11及更高版本上无需超级用户即可使用pg_rewind(Alexander Kukushkin)
如果要使用此功能,请在用户配置文件的postgresql.authentication.rewind部分中定义username和password。对于已经存在的集群,您必须手动创建用户并GRANT EXECUTE对一些函数的权限。您可以在PostgreSQL文档中找到更多详细信息。
• 对副本上的实际primary_conninfo 值和期望primary_conninfo值进行智能比较(Alexander Kukushkin)
当您将一个已经存在的(主备用)集群转换为一个由Patroni管理的集群时,这可能有助于避免副本重新启动。
• IPv6支持(Alexander Kukushkin)
有两个主要问题。Patroni REST API服务仅在0.0.0.0上侦听,api_url和conn_url中使用的IPv6 IP地址没有正确引用。
• Kerberos支持(Ajith Vilas、Alexander Kukushkin)
这使得在Postgres节点之间使用Kerberos身份验证而不是在Patroni配置文件中定义密码成为可能。
• 管理pg_ident.conf (Alexander Kukushkin)
此功能的工作原理与pg_hba.conf类似:如果postgresql.pg_ident是在配置文件或DCS中定义的,则Patroni 会将其值写入pg_ident.conf,但是,如果postgresql.parameters.ident_file是定义的,Patroni 会假定pg_ident是从外部管理的,不会更新文件。
REST API的改进
• 新增 /health端点(Wilfried Roset)
只有在PostgreSQL正在运行时,它才会返回HTTP状态代码
• 添加 /read-only和 /read-write读写端点(Julien Riou)
/read-only端点支持在副本和主副本之间平衡读取。/read-write端点是/primary、/leader和/master的别名。
• 使用SSLContext包装REST API套接字(Julien Riou)
ssl.wrap_socket()的使用已被弃用,并且仍然允许使用像TLS 1.1这样的即将弃用的协议。
日志改进
• Two-step 日志
所有日志消息首先写入内存队列,然后从单独的线程异步刷新到stderr或文件中。最大队列大小有限(可配置)。如果达到限制,Patroni将开始丢失日志,这仍然比阻塞HA循环要好。
• 为GET/OPTIONS API调用和延迟启用调试日志记录(Jan Tomsa)
它将有助于调试HAProxy、Concur或其他决定哪个节点是主/副本的工具执行的运行状况检查。
• 重试时捕获日志异常(Daniel Kucera)
当达到尝试次数或超时,记录最后一个异常。当与DCS的通信失败时,它有望帮助调试一些问题。
Patronictl 改进
• 增强计划切换和重启的对话(Rafia Sabih)
以前的对话没有考虑到预定的行动,因此具有误导性。
• 检查配置文件是否存在(Wilfried Roset)
当给定的文件名不存在时,请详细说明配置文件,而不要默默忽略(这可能导致误解)。
• 为EDITOR添加回退值(Wilfried Roset)
当未定义EDITOR环境变量时,patronictl edit config因PatroniCtlException而失败。新的策略是尝试editor和而不是vi,这应该在大多数系统上都可用。
Consul支持改进
• 允许指定Consul一致性模式(Jan Tomsa)
您可以在此处阅读有关一致性模式的更多信息。
• 在SIGHUP上重新加载Consul配置(Cameron Daniel, Alexander Kukushkin)
当有人更改令牌的值时,它特别有用。
错误修正
• 修复切换/故障切换中的bug(Sharon Thomas)
如果REST API不可访问,并且我们使用DCS作为回退,则变量scheduled_at可能未定义。
• 自定义引导期间在pg_hba.conf中打开对本地主机的信任(Alexander Kukushkin)
以前它只对unix_socket开放,这导致了很多错误:FATAL: no pg_hba.conf
entry for replication connection from host "127.0.0.1", user "replicator"。
• 即使前leader领先,也可以认为同步节点是健康的。(Alexander Kukushkin)
如果主节点失去对DCS的访问,它将以只读方式重新启动Postgres,但其他节点可能仍然可以通过REST API访问旧的主节点。这种情况导致同步待机无法升级,因为旧的主服务器在同步待机之前报告WAL位置。
• 备用群集错误修复(Alexander Kukushkin)
当备用主机无法访问时,可以在备用集群中引导副本,并进行一些其他小修复。
14.12 Version 1.5.6
新功能
• 通过一组代理支持etcd集群的工作(Alexander Kukushkin)
etcd集群可能无法直接访问,而是通过一组代理进行访问。在这种情况下,Patroni将不执行etcd拓扑发现,而只是通过代理主机进行循环。行为由(etcd.use_proxies)控制。
• 更改节点上的角色时的回调行为(Alexander)
如果角色已从主节点角色或备用集群leader角色更改为备节点角色或从备节点角色更改为备用集群leader角色,则将不再调用on_restart callback以支持on_role_change callback。
• 改变我们开始postgres的方式(Alexander)
使用multiprocessing.Process而不是执行自身和multiprocessing.Pipe将postmaster pid传输到patroni进程。在我们使用管道之前,是什么让postmaster进程关闭了stdin。
错误修复
• REST API为备用集群leader返回的修复角色(Alexander)
它错误地返回了replica,而不是standby_leader
• 如果无法终止,请等待回调结束(Julien Tachoires)
Patroni没有足够的权限终止在sudo what下运行的取消新回调的回调脚本。如果无法终止正在运行的脚本,patroni将等待它完成,然后运行下一个回调。
• 通过dcs.get_cluster方法减少锁定时间(Alexander)
由于锁定被保持,DCS的慢度会影响REST API运行状况检查,从而导致误报。
• 当pg_wal/pg_xlog是符号链接时,改进PGDATA的清理(Julien)
在这种情况下,patroni将显式地从目标目录中删除文件。
• 删除 os.path.relpath不必要的用法 (Ants Aasma)
这取决于是否能够解析工作目录,如果在一个后来与文件系统断开链接的目录中启动了Patroni,那么将失败什么。
• 与Etcd通信时不强制执行ssl版本(Alexander)
由于一些未知的原因,debian和ubuntu上的python3 etcd不基于最新版本的软件包,因此它强制执行etcd v3不支持的TLSv1。我们在Patroni方面解决了这个问题。
14.13 Version 1.5.5
这个版本引入了自动重新安装前主节点的可能性,改进了patronictl list输出并修复了一些错误。
新功能
•添加对PATRONI_ETCD_PROTOCOL、PATRONI_ETCD_USERNAME和PATRONI_ETCD_PASSWORD环境变量的支持(Étienne M)
在此之前,只能在配置文件中配置它们,或将其作为PATRONI_ETCD_URL的一部分进行配置,这并不总是方便的。
• 可以自动控制前主节点(Alexander Kukushkin)
如果pg_rewind被禁用或无法使用,则由于时间线不一致,以前的主节点可能无法作为新副本启动。在这种情况下,修复它的唯一方法是删除数据目录并重新初始化。可以通过设置postgresql.remove_data_directory_on_diverged_timelines来更改此行为。设置后,Patroni将删除数据目录,并自动重新初始化前主节点目录。
• 在用户列表中显示有关时间线的信息(Alexander)
它有助于检测过时的副本。除此之外,如果端口值不是默认值,或者在同一主机上运行多个成员,则主机将包括“:{port}”。
• 创建与 $SCOPE-config端点关联的无头服务(Alexander)
“config”端点保存有关集群范围的Patroni和Postgres配置、历史文件的信息,最后但最重要的是,它保存着initialize键。重新启动或升级Kubernetes主节点时,它会删除没有服务的端点。无头服务将防止其被移除。
错误修复
• 调整leader watch阻塞查询的读取超时(Alexander)
根据Consul文档,实际响应超时会增加一小部分随机的额外等待时间,并将其添加到提供的最大等待时间中,以分散任何并发请求的唤醒时间。它加起来等于最大持续时间的等待/16额外时间。在我们的例子中,我们添加了wait/15或1秒,这取决于哪个更大。
• 不为wal-only备用集群将primary_conninfo写入recovery.conf(Alexander)
尽管在standby_cluster配置中既没有定义主机也没有定义端口,但Patroni将primary_conninfo放入了recovery.conf中,这是无用的,并且会产生很多错误。
14.14 Version 1.5.4
此版本实现了灵活的日志记录,并修复了许多错误
新功能
• 改进日志基础(Alexander Kukushkin、Lucas Capistrant、Alexander Anikin)
日志配置不仅可以从环境变量配置,还可以从Patroni配置文件配置。它可以在运行时通过更新配置并重新加载或向patroni进程发送消息来更改日志记录配置。默认情况下,Patroni将日志写入stderr,但现在可以将日志直接写入文件,并在文件达到一定大小时进行轮转。除此之外,还增加了对自定义dateformat的支持,以及对每个python模块的日志级别进行微调的可能性。
• leader选举期间考虑当前的时间表(Alexander Kukushkin)
节点可能认为自己是最健康的节点,尽管它目前不在最新的已知时间线上。在某些情况下,我们希望避免升级此类节点,这可以通过将check_timeline参数设置为true来实现(默认行为保持不变)。
• 放宽对超级用户凭据的要求
Libpq允许在不明确指定用户名和密码的情况下打开连接。根据情况,它依赖于pg_hba.conf中的pgpass文件或信任身份验证方法。由于pg_rewind也使用libpq,因此其工作方式相同。
• 实现了通过环境变量配置Consul 服务注册和检查间隔的可能性(Alexander Kukushkin)
1.5.0版中增加了Consul服务注册,但到目前为止,只能通过Patroni.yaml启用。
稳定性改进
• 自定义引导过程中将archive_mode 设置为off(Alexander Kukushkin)
我们希望避免归档WAL和历史文件,直到集群完全正常运行。如果自定义引导涉及pg_upgrade,那么它真的很有帮助。
• 在启动时加载全局配置时应用5秒后退(Alexander Kukushkin)
这有助于在Patroni刚启动时避免锤击(DCS)。
• 减少关机时生成的错误消息量(Alexander Kukushkin)
他们是无害的,但相当烦人,有时还很吓人。
• 在创建时显式保护recovery.conf的rw perms(Lucas)
我们不希望任何人patroni/postgres用户读取此文件,因为它包含复制用户和密码。
• 将HTTPServer异常重定向到记录器(Julien Riou)
默认情况下,这些异常记录在标准输出上,与常规日志混淆。
错误修复
• 已去除pg_ctl程序通向标准装置的标准管道(Cody Coons)
从主Patroni进程继承stderr允许查看所有Postgres日志以及所有用户日志。这在容器环境中非常有用,因为patroni和Postgres日志可以使用标准工具(docker日志、kubectl等)使用。除此之外,此更改还修复了一个错误,即当postgres在stderr中写入一些警告时,Patroni无法捕获postmaster pid。
• 以Go time格式设置Consul服务检查注销超时(Pavel Kirillov)
没有明确提到时间单位注册失败。
• 放松对备用集群配置的检查(Dmitry Dolgov,Alexander Kukushkin)
它只接受字符串作为有效值,因此无法将端口指定为整数并将create_replica_methods创建为列表。
14.15 Version 1.5.3
兼容性和错误修复版本。
• 提高python3对抗zookeeper时的稳定性(Alexander Kukushkin)
loop_wait的改变导致Patroni与zookeeper断开连接,再也无法重新连接。
• 修复与postgres 9.3不兼容的问题(Alexander)
打开复制连接时,我们应该指定replication=1,因为9.3不理解replication='database'。
• 确保每个HA循环至少刷新一次Consul会话,并改进Consul会话异常的处理(Alexander)
重新启动本地consul代理将使与节点相关的所有会话无效。未按时调用会话刷新以及未正确处理会话错误导致主节点降级。
14.16 Version 1.5.2
兼容性和错误修复版本。
• 与kazoo-2.6.0的兼容性(Alexander Kukushkin)
为了确保在适当的超时情况下执行请求,Patroni从python kazoo模块重新定义了create_connection方法。kazoo的上一个版本稍微改变了create_connection方法的调用方式。
• 修复Consul集群失去leader时的Patroni崩溃(Alexander)
崩溃是由于touch_member方法的不正确实现造成的,它应该返回布尔值,并且不会引发任何异常。
14.17 Version 1.5.1
此版本实现了对永久复制插槽的支持,添加了对PGA的支持,并修复了大量错误。
新功能
• 永久复制slots(Alexander Kukushkin)
永久复制slots在故障切换/切换时保留,也就是说,新主服务器上的Patroni将在执行升级后立即创建已配置的复制slots。slots可以在patronictl edit-config的帮助下进行配置。初始配置也可以在bootstrap.dcs中完成。
• 增加pgbackrest支持(Yogesh Sharma)
pgBackrest可以在现有$PGDATA文件夹中恢复,这允许快速恢复自上次备份以来未更改的文件,为支持此功能,引入了新参数keep_data。有关其他示例,请参见副本创建方法一节。
错误修复
• “standby cluster”工作流中的一些错误修复(Alexander)
请看https://github.com/zalando/patroni/pull/823更多细节。
• 修复群集管理暂停且无法访问DCS时的REST API运行状况检查(Alexander)
回归引入的 https://github.com/zalando/patroni/commit/90cf930036a9d5249265af15d2b787ec7517cf57
14.18 Version 1.5.0
此版本使Patroni HA cluster能够在备用集群模式下运行,引入了在Windows上运行的实验性支持,并提供了一个新的配置参数以在Consul中注册PostgreSQL服务。
新功能
• 备用集群(Dmitry Dolgov)
一个或多个用户节点可以形成一个备用集群,该集群与主集群(即在另一个数据中心)并行运行,并由从主集群中复制的副本组成。备用集群中的所有PostgreSQL节点都是副本;其中一个副本选择自己直接从远程主节点进行复制,而其他副本则以级联方式从远程主机进行复制。有关此功能的更详细描述和一些配置示例,请参见此处。
• Consul注册服务(Pavel Kirillov, Alexander Kukushkin)
如果启用了Consul配置中的register_service参数,则节点将使用名称scope和标记master、replica或standby-leader注册服务
• 实验性Windows支持(Pavel Golub)
从现在起,在Windows上运行Patroni是可能的,尽管Windows支持是全新的,并且没有得到像Linux那样多的实际测试。我们欢迎您的反馈!
Patronictl 的改进
• 添加patronictl -k/–insecure标志和对restapi证书的支持(Wilfried Roset)
在过去,如果REST API受到自签名证书的保护,则patronictl将无法验证这些证书。无法禁用该验证。现在可以将patronictl配置为完全跳过证书验证,或者在配置的ctl:部分中提供CA和客户端证书。
• 从patronictl切换/故障转移输出中排除具有nofailover标记的成员(Alexander Anikin)
以前,在通过patronictl执行交互式切换或故障切换时,这些成员被错误地推荐为候选成员。
稳定性改进
• 避免解析pg_controldata的non-key-value输出行(Alexander Anikin)
在某些情况下pg_controldata输出不带冒号字符的行。这将在解析pg_controldata输出的用户代码中触发错误,隐藏实际问题;通常,在常规输出之前pg_controldata显示的警告中会发出此类行,即当二进制主版本与PostgreSQL数据目录不匹配时。
• 在leader选举期间向错误消息中添加成员名称(Jan Mussler)
在leader选举期间,Patroni连接到集群的所有已知成员并请求其状态。该状态会写入用户日志,并包括成员名。以前,如果无法访问该成员,则错误消息不会指示其名称,只包含URL。
• 创建复制slot后立即保留WAL位置(Alexander Kukushkin)
从9.6开始,pg_create_physical_replication_slot函数提供了一个额外的布尔参数immediately_reserve。当设置为false这也是默认值时,slot在收到第一个客户端连接之前不会保留WAL位置,这可能会在插槽创建和初始客户端连接之间的时间窗口中丢失客户端所需的某些段。
• 修复严格同步复制中的错误(Alexander Kukushkin)
在使用synchronous_mode_strict: true运行时,在某些情况下,Patroni会将*intosynchronous_standby_names,从而将大多数复制连接的同步状态更改为潜在状态。以前,Patroni无法在这种curcuimstances下选择同步候选者,因为它只考虑状态为async的候选者。
14.19 Version 1.4.6
Bug修复和稳定性改进
此版本修复了非主节点的Patroni API /master终端端返回200的关键问题。这是一个报告问题,没有真正的发生脑裂,但在某些情况下,客户端可能被定向到只读节点。
• 重置is_leader状态为降级(Alexander Kukushkin,Olii Kliuk)
确保降级的集群成员停止响应/master API调用中的代码200。
• 将新的“cluster_unlocked”字段添加到API输出(Dmitry Dolgov)
此字段指示集群是否正在运行主节点。当除了其中一个复制副本之外,无法查询任何其他节点时,可以使用该方法。
14.20 Version 1.4.5
新功能
• 在应用新的postgres配置时改进日志记录(Don Seiler)
Patroni记录更改的参数名称和值。
• Python 3.7兼容性(Christoph Berg)
async是python3.7中的保留关键字。
• 当一个成员关闭时,在DCS中将状态设置为“stopped”(Tony Sorrentino)
这将在“patronictl list”命令中将成员状态显示为“stopped”。
• 改进stale postmaster.pid与正在运行的进程匹配时记录的消息(Ants Aasma)
前一个是无可置疑的。
• 实现patronictl reload功能(Don Seiler)
在此之前,只能通过调用REST API或向用户进程发送SIGHUP信号来重新加载配置。
• 作为副本启动时,从controldata获取并应用一些参数(Alexander Kukushkin)
在全局配置中设置的max_connections和一些其他参数的值可能低于主节点实际使用的值;发生这种情况时,复制副本无法启动,应手动修复。Patroni现在通过读取和应用pg_controldata中的值、启动postgres并设置pending_restart标志来解决这个问题。
• 如果已设置,则在启动postgres时使用LD_LIBRARY_PATH(Chris Fraser)
当启动Postgres时,Patroni正在通过PATH,LC_ALL和LANG env Var如果已设置。现在它对LD_LIBRARY_PATH执行相同的操作。如果有人将PostgreSQL安装到非标准位置,应该会有所帮助。
• 将create_replica_method重命名为create_replica_methods(Dmitry Dolgov)
为了清楚地表明它实际上是一个数组。为了向后兼容,仍然支持旧名称。
Bug修复和稳定性改进
• 修复由于pg_rewind处于暂停状态而导致副本启动的条件(Oleksii Kliukin)
避免启动之前已执行pg_rewind的复制副本。
• 仅当更新锁定成功时才对主运行状况检查作出响应(Alexander)
如果DC已分区,防止patroni在前(降级)主节点报告自己是主。
• 修复与新consul模块的兼容性(Alexander)
从v1.1.0开始,python-consul更改了内部API,并开始使用list而不是dict来传递查询参数。
• 在关机期间从Patroni REST API线程捕获异常(Alexander)
这些未捕获的异常使PostgreSQL在关闭时保持运行。
• 只有在Postgres以主节点身份运行时才执行崩溃恢复(Alexander)
要求pg_controldata报告“生产中”或“关闭”或“故障恢复中”。在所有其他情况下,无需进行故障恢复。
• 改进配置错误的处理(Henning Jacobs,Alexander)
通过更新Patroni配置文件并向patroni进程发送SIGHUP,可以在运行时更改许多参数(包括restapi.listen)。当某些参数接收到无效值时,此修复程序消除了“restapi”线程中的模糊异常。
14.21 Version 1.4.4
稳定性改进
• 修正 poll_failover_result 中的竞争条件(Alexander Kukushkin)
它既不直接影响故障切换,也不直接影响切换,但在一些罕见的情况下,它过早地报告成功,当前任leader释放锁时,会生成一条Failed over to “None”消息,而不是Failed over to “desired-node”消息。
• 将Postgres参数名称视为不区分大小写(Alexander)
大多数Postgres参数都有snake_case名称,但有三个例外:DateStyle、IntervalStyle和TimeZone。Postgres在不同情况下写入时接受这些参数(例如。e.g.timezone = ‘some/tzn’);但是,patroni无法在pg_settings中找到这些参数名称的不区分大小写的匹配项,因此忽略了这些参数。
• 如果连接到正在运行的postgres且集群未初始化,则中止启动(Alexander)
Patroni可以将自己连接到已经运行的Postgres实例。在访问复制副本之前,必须在主节点上开始运行Patroni。
• 修复 patronictl scaffold的行为(Alexander)
将dict对象传递给touch_member而不是json编码的字符串,DCS实现将负责对其进行编码。
• 如果未能在暂停中更新leader键,则不降级主(Alexander)
在维护过程中,DCS可能会在继续响应读取请求的同时开始失败写入请求。在这种情况下,在无法更新DCS中的Leader锁后,Patroni通常将Postgres主节点置于read-only模式。
• Patroni注意到新的postmaster流程时同步复制slots(Alexander)
如果Postgres已重新启动,则patroni必须确保复制slots列表符合其预期。
• 在暂停结束后验证sysid和同步复制slots(Alexander)
在维护模式期间,可能会发生数据目录被完全重写的情况,因此我们必须确保数据库系统标识符仍然属于我们的集群,并且复制插槽与patroni的期望同步。
• 修复在存在postmaster锁文件的数据目录上不运行Postgres的可能故障(Alexander)
检测postmaster锁定文件中PID的重用。如果在docker容器中运行Patroni和Postgres,则更可能遇到此类问题。
• 改进DCS意外擦除的保护(Alexander)
在这种情况下,Patroni有很多逻辑来防止故障转移;它还可以恢复所有的键;然而,在此更改之前,/config键的意外删除是关闭暂停模式1个HA循环。
• 遇到无效的系统ID时不要退出(Oleksii Kliukin)
当集群系统ID为空或未通过验证检查时,请勿退出。在这种情况下,集群很可能需要一个reinit;在结果消息中提及它。避免终止patroni,否则它不会发生。
与Kubernetes 1.10的兼容性+
• 增加了空 subsets检查(Cody Coons)
Kubernetes 1.10.0+开始返回Endpoints.Subset,并将其设置为None,而不是[]
Bootstrap改进
• 将删除recovery.conf设置为可选(Brad Nicholson)
如果bootstrap..keep_existing_recovery_conf已定义并设置为True,则patroni不会删除现有recovery.conf文件。这在使用pgBackRest等工具从备份中引导时非常有用,这些工具可以为您生成适当的recovery.conf。
• 允许basebackup内置方法的选项(Oleksii)
现在可以通过在配置中定义basebackup部分为内置basebackup方法提供选项,类似于为自定义副本创建方法定义这些选项的方式。不同之处在于basebackup部分接受的格式:由于pg_basebackup同时接受–key=value和–key选项,因此该部分的内容可以是键值对的字典,或者是一个元素字典的列表,或者只是键(对于不接受值的选项)。有关其他示例,请参见副本创建方法一节。
14.22 Version 1.4.3
日志改进
• 从环境变量中配置日志级别(Andy Newton、Keyvan Hedayati)
PATRONI_LOGLEVEL-设置一般日志级别PATRONI_REQUESTS_LOGLEVEL-设置所有HTTP请求的日志级别,例如Kubernetes API调用请参阅Python日志记录文档
<https://docs.python.org/3.6/library/logging.html#levels>获取可能的日志级别的名称
稳定性改进和错误修复
• 观察超时时不重新发现etcd集群拓扑(Alexander Kukushkin)
如果我们在etcd配置中只有一台主机,而实际上该主机不可访问,那么Patroni就开始发现集群拓扑,但从未成功过。相反,它应该只切换到下一个可用节点。
• 在自定义引导后将bootstrap.pg_hba的内容写入pg_hba.conf(Alexander)
现在,它的行为类似于initdb的常规引导
• 单用户模式正在等待用户输入,但从未完成(Alexander)
引入的https://github.com/zalando/patroni/pull/576
14.23 Version 1.4.2
Patronictl 改进
• 将计划failover 重命名为计划switchover (Alexander Kukushkin)
failover 和 switchover 功能在版本1.4中是分开的,但patronictl list仍然报告计划的failover ,而不是计划switchover。
• 显示有关挂起的重新启动的信息(Alexander)
为了应用某些配置更改,有时需要重新启动postgres。在REST API中以及在将节点状态写入DCS时,Patroni已经给出了关于这一点的提示,但是没有简单的方法来显示它。
• 使show-config与配置文件中的cluster_name一起工作(Alexander)
它的工作原理与patronictl edit-config类似
稳定性改进
• 避免在引导过程中调用pg_controldata(Alexander)
在initdb或自定义引导期间,当pgdata不为空但pg_controldata尚未写入时,会有一个时间窗口。在这种情况下,pg_controldata调用失败并显示错误消息。
• 处理从psutil引发的异常(Alexander)
每次调用cmdline ()方法时,都会读取和分析cmdline。可能正在检查的进程已经消失,在这种情况下NoSuchProcess被提出。
Kubernetes支持改进
• 不接受来自k8s API的错误(Alexander)
对Kubernetes API的调用可能会由于不同的原因而失败。在某些情况下,应该重试此类调用,在其他一些情况下,我们应该记录错误消息和异常堆栈跟踪。此处的更改将有助于调试Kubernetes权限问题。
• 更新Kubernetes示例Dockerfile以从主分支安装Patroni(Maciej Szulik)
在此之前,它使用的是feature/k8s,这已经过时了。
• 添加适当的RBAC以在k8s上运行patroni(Maciej)
添加分配给集群POD的服务帐户、仅持有必要权限的角色以及连接服务帐户和角色的rolebinding。
14.24 Version 1.4.1
修复patronictl
• 在要故障切换到的成员,建议列表中不显示当前的leader。(Alexander Kukushkin)
当集群中有leader时,patronictl failover仍然可以工作,并且应该将其从可以故障切换到的成员列表中排除。
• 使patronictl switchover与旧Patroni api兼容(Alexander)
若POST/SWITCHOVERT REST API调用失败,状态代码为501,则它将再次执行该操作,但会对/failover端点执行该操作。
14.25 Version 1.4
此版本增加了对使用 Kubernetes 作为 DCS 的支持,允许在 Kubernetes 中将 Patroni 作为云原生代理运行,而无需额外部署 Etcd、Zookeeper 或 Consul。
升级通知
通过 pip 安装 Patroni 将不再引入依赖项(例如 Etcd、Zookeper、Consul 或 Kubernetes 的库,或对 AWS 的支持)。为了启用它们,您需要在 pip install 命令中明确列出它们,例如pip install pausei[etcd,kubernetes]。
Kubernetes 支持
实施基于 Kubernetes 的 DCS。端点元数据用于存储配置和leader 键。pods 定义中的元数据字段用于存储与成员相关的数据。除了使用 端点之外,Patroni 还支持 ConfigMaps。您可以[在文档]
(https://patroni.readthedocs.io/en/latest/kubernetes.html#kubernetes)的[Kubernetes 章节中]
(https://patroni.readthedocs.io/en/latest/kubernetes.html#kubernetes)找到有关此功能的更多信息
稳定性改进
- 将 postmaster 进程分解为一个单独的对象(Ants Aasma)
该对象通过 pid 和启动时间识别正在运行的 postmaster 进程,并简化了对 postmaster 在我们背后重新启动或 postgres 目录从文件系统中消失的情况的检测(和解决)。
- 最大限度地减少 Patroni 在 HA 循环的每个循环中发出的 SELECT 数量(Alexander Kukushkin)
在 HA 循环的每次迭代中,Patroni 需要知道恢复状态和绝对 wal 位置。从现在开始,Patroni 将只运行单个 SELECT 来获取此信息,而不是在副本上运行两个,在主服务器上运行三个。
- 仅当我们有锁时才在关机时移除Leader键(Ants)
无条件删除会产生不必要的和误导性的例外情况。
保护的改进
- 将版本命令添加到patronictl (Ants)
它将显示已安装的 Patroni 的版本和运行的 Patroni 实例的版本(如果指定了集群名称)。
- 为某些守护程序命令设置可选的指定 cluster_name 参数(Alexander,Ants)
如果patronictl 使用带有`scope`定义的通常的Patroni 配置文件,它将起作用。
- 显示有关计划switchover和维护模式的信息 (Alexander)
在此之前,只能从 Patroni 日志或直接从 DCS 获取此信息。
- 改进`patronictl reinit`(Alexander)
有时在 Patroni 忙于其他操作时拒绝继续,即尝试启动 postgres。switchover 没有提供任何命令来取消这种长时间运行的操作,唯一的(危险的)解决方法是手动删除数据目录。reinit的新实现在继续 reinit 之前强制取消其他长时间运行的操作。
-实现——patronictl pause和patronictl resume中的--wait标志(Alexander)
它将`patronictl`等待直到请求的操作被集群中的所有节点确认。这种行为是通过`pause`为 DCS 中的每个节点以及通过 REST API公开标志来实现的。
- 将`patronictl failover`重命名为`patronictl switchover`(Alexander)
前者`failover`实际上只能做一个切换;它拒绝在没有leader的情况下继续在集群中运行。
- 改变`patronictl failover` 的行为(Alexander)
即使没有Leader,它也能工作,但在这种情况下,您必须明确指定一个应该成为新Leader的节点。
公开有关时间线和历史的信息
- 在 DCS 中和通过 API 公开当前时间线 (Alexander)
存储有关集群每个成员的当前时间线的信息。此信息可通过 API 访问并存储在 DCS 中
- 在 DCS的 /history 键中存储提升历史 (Alexander)
此外,在DCS的/history键中存储包含相应升级时间戳的时间线历史记录,并在每次提升时更新。
添加端点以获取同步和异步副本
- 添加新的 /sync 和 /async 端点(Alexander、Oleksii Kliukin)
这些端点(也可以作为 /synchronous 和 /asynchronous 访问)仅针对同步和异步副本相应地返回 200 (不包括标记为noloadbalance 的那些)。
允许 Etcd 的多个主机
- 向 Etcd 配置添加新的hosts参数 (Alexander)
此参数应包含将用于发现和填充正在运行的 etcd 集群成员列表的hosts 的初始列表。如果在工作期间由于某种原因发现的hosts 列表已用完(该列表中没有可用的主机),Patroni 将从hosts参数返回到初始列表。
14.26 Version 1.3.6
稳定性改进
- 检查 postgres 是否正在运行时验证进程启动时间。(Ants Aasma)
在没有清理 postmaster.pid 的崩溃之后,可能会有一个具有相同 pid 的新进程,导致 is_running() 的误报,这将导致各种不良行为。
- 当我们丢失数据目录时,在引导之前关闭 postgresql (ainlolcat)
当主节点上的数据目录被强制删除时,postgres进程仍可以保持活动状态一段时间,并防止在该主节点上创建的副本启动或复制。修复程序使patroni缓存postmaster pid及其开始时间,并允许它终止旧的postmaster,以防在删除相应的数据目录后它仍在运行。
- 如果 postgres 主节点死亡,则在单用户模式下执行故障恢复 (Alexander Kukushkin)
如果postgres没有完全关闭,立即作为备启动是不安全的,并且不可能运行`pg_rewind`。单用户故障恢复仅在`pg_rewind`已启用或目前没有主时生效。
Consul改进
- 使为 Consul 提供数据中心配置成为可能(Vilius Okockis,Alexander)
在此之前,Patroni 始终与其运行的主机的数据中心进行通信。
- 始终在 X-Consul-Token http 标头中发送令牌(Alexander)
如果`consul.token`在 Patroni 配置中定义,我们将始终在“X-Consul-Token”http 标头中发送它。python-consul 模块尝试与 Consul REST API“一致”,它不接受令牌作为[会话 API](https://www.consul.io/api/session.html)的查询参数,但它仍然适用于“X-Consul-Token”标头。
- 如果提供的值小于可能的最小值,则调整会话 TTL(Stas Fomin,Alexander)
Patroni 配置中提供的 TTL 可能小于 Consul 支持的最小值。在这种情况下,Consul 代理无法创建新会话。没有会话 Patroni 无法在 Consul KV 存储中创建成员和Leader 键,从而导致集群不健康。
其他改进
- 通过环境变量`PATRONI_LOGFORMAT`定义自定义日志格式(Stas)
如果系统logger已添加时间戳和 Patroni 日志中的其他类似字段,则允许禁用它们(通常在 Patroni 作为服务运行时)。
14.27 Version 1.3.5
错误修正
- 如果删除了数据目录,则将角色设置为“uninitialized”(Alexander Kukushkin)
如果节点作为主节点运行,它会阻止故障转移。
稳定性提升
- 如果我们尝试启动 postgres 并失败,请尝试在单用户模式下运行 postmaster (Alexander)
通常,当作为主节点运行的节点终止并且时间线出现分歧时,会发生此类问题。如果recovery.conf定义了restore_command,postgres很有可能中止启动并保持controldata不变。这使得无法使用pg_rewind,这需要一个干净的shutdown。
领事改进
- 可以在创建会话时指定健康检查 (Alexander)
如果未指定,Consul 将使用“serfHealth”。一方面,它允许快速检测孤立的主节点,但另一方面,它使 Patroni 无法容忍短暂的网络延迟。
错误修正
- 修复 Python 3 上的WatchDog(Ants Aasma)
对 ioctl() 调用接口的误解。如果 mutable=False 那么 fcntl.ioctl() 实际上返回 arg 缓冲区。这意外地在 Python2 上起作用,因为 int 和 str 比较没有返回错误。错误报告实际上是通过在 Python2 上引发 IOError 和在 Python3 上引发 OSError 来完成的。
14.28 Version 1.3.4
不同的 Consul 改进
- 将consul令牌作为标头传递(Andrew Colin Kissa)
标头现在是将令牌传递给
consul [API](https://www.consul.io/api/index.html#authentication)的首选方式。
- Consul的高级配置 (Alexander Kukushkin)
指定`scheme`、`token`客户端和 CA 证书
[详细信息的]
(https://patroni.readthedocs.io/en/latest/SETTINGS.html#consul-settings)可能性。
- 与 python-consul-0.7.1 及更高版本的兼容性(Alexander)
新的 python-consul 模块改变了一些方法的签名
- “Could not take out TTL lock”消息从未被记录(Alexander)
不是一个严重的错误,但缺乏适当的日志记录会使出现问题时的调查复杂化。
使用 quote_ident 引用 synchronous_standby_names
- 将`synchronous_standby_names`写入`postgresql.conf`其值必须加引号(Alexander)
如果没有正确引用,PostgreSQL 将有效禁用同步复制并继续工作。
围绕暂停状态的不同错误修正,主要与WatchDog有关(Alexander)
- 如果WatchDog不活动,则不要发送保活
- 避免在暂停模式下激活WatchDog
- 在暂停模式下设置正确的 postgres 状态
- 如果 postgres 停止,不要尝试从 API 运行查询
14.29 Version 1.3.3
Bug修复
- 即使启用了 synchronous_mode_strict,在升级后不久同步复制也被禁用 (Alexander Kukushkin)
- `pg_ident.conf`如果从备份恢复后丢失,则创建空文件(Alexander)
- 在`pg_hba.conf`中开放访问所有数据库,不仅是 postgres (Franco Bellagamba)
14.30 Version 1.3.2
错误修正
- patronictl edit-config 不适用于 ZooKeeper (Alexander Kukushkin)
14.31 Version 1.3.1
错误修正
- 由于`_MemberStatus`中的更改,通过 API 进行的故障转移已中断(Alexander Kukushkin)
14.32 Version 1.3
1.3 版本增加了自定义引导程序的可能性,显着改进了对 pg_rewind 的支持,增强了同步模式支持,增加了对增加了patronictl对配置的编辑,并在 Linux 上实现了WatchDog支持。此外,这是第一个与 PostgreSQL 10 一起正常工作的版本。
升级通知
新版本的 Patroni 没有已知的兼容性问题。版本 1.2 的配置应该无需任何更改即可工作。可以通过安装新软件包并重新启动 Patroni(将导致 PostgreSQL 重新启动)或先将Patroni 置于[暂停模式](https://patroni.readthedocs.io/en/latest/pause.html#pause)然后在集群中的所有节点上重新启动 Patroni(处于暂停模式的 Patroni 不会尝试停止)来进行升级/启动PostgreSQL),最后从暂停模式恢复。
自定义引导程序
- 使引导集群的过程可配置 (Alexander Kukushkin)
允许自定义引导脚本,而不是`initdb`在初始化集群中的第一个节点时。bootstrap 命令接收集群的名称和数据目录的路径。生成的集群可以配置为执行恢复,从而可以从备份引导并进行时间点恢复。有关此功能的更详细说明,请参阅[文档页面]
(https://patroni.readthedocs.io/en/latest/replica_bootstrap.html#custom-bootstrap)。
更智能的 pg_rewind 支持
- 通过查看与当前 master的时间线差异来决定是否运行 pg_rewind (Alexander)
以前,Patroni 有一组固定的条件来触发 pg_rewind,即在启动之前的主节点时,当为集群中的每个其他节点切换到指定节点时,或者当存在带有 nofailover 标记的副本时。所有这些情况都有一个共同点,即某些副本可能领先于新的主节点。在某些情况下, pg_rewind 什么都不做,在其他一些情况下,它在必要时不运行。Patroni 不依赖于这个有限的规则列表,而是比较主和副本的 WAL 位置(使用流复制协议),以便可靠地决定副本是否需要切换。
严格的同步复制模式
- 通过添加严格模式来增强同步复制支持(James Sewell,Alexander)
通常,当`synchronous_mode`启用并且没有副本附加到主时,Patroni 将禁用同步复制以保持主服务器可用于写入。该`synchronous_mode_strict`选项更改为,当它被设置时,Patroni 不会在缺少副本的情况下禁用同步复制,从而有效地阻止所有客户端向主服务器写入数据。除了防止由于自动故障转移导致任何数据丢失的同步模式保证之外,严格模式还确保每次写入要么持久存储在两个节点上,要么在集群中只有一个节点时完全不发生。
使用patronictl 进行配置编辑
- 将配置编辑添加到patronictl (Ants Aasma, Alexander)
添加patronictl 对存储在 DCS 中的动态集群配置进行编辑的能力。支持从命令行指定参数/值、调用 $EDITOR 或从 yaml 文件应用配置。
Linux WatchDog支持
- 实现对 Linux 的WatchDog支持(Ants)
支持 Linux 软件WatchDog,以便在 Patroni 没有运行或没有响应的节点重新启动(例如,由于高负载) Linux 软件WatchDog重新启动无响应的节点。可以从 Patroni 配置的WatchDog部分配置要使用的WatchDog设备(默认为/dev/watchdog)和模式(on, automatic, off)。您可以从[WatchDog文档中](https://patroni.readthedocs.io/en/latest/watchdog.html#watchdog)获取更多信息。
添加对 PostgreSQL 10 的支持
- Patroni 与迄今为止发布的所有 PostgreSQL 10 测试版兼容,我们预计它会在发布时与 PostgreSQL 10 兼容。
PostgreSQL 相关的小改进
- 通过 Patroni 配置文件或 DCS 中的动态配置定义 pg_hba.conf(Alexander)
允许在配置部分`pg_hba.conf`的`pg_hba`子部分中定义内容`postgresql`。这简化了`pg_hba.conf`在多个节点上的管理,因为只需要在 DCS 中定义它,而不是记录到每个节点,手动更改它并重新加载配置。
定义后,本节的内容将`pg_hba.conf`完全取代当前。如果`hba_file`设置了 PostgreSQL 参数,Patroni 会忽略它。
- 支持通过 UNIX 套接字连接到本地 PostgreSQL 集群 (Alexander)
将`use_unix_socket`选项添加到Patroni 配置的`postgresql`部分。当设置为 true 并且 PostgreSQL`unix_socket_directories`选项不为空时,使 Patroni 能够使用它的第一个值连接到本地 PostgreSQL 集群。如果`unix_socket_directories`未定义,Patroni 将采用其默认值并完全省略`host`PostgreSQL 连接字符串中的参数。
- 支持在重新加载时更改超级用户和复制凭据(Alexander)
- 支持在 PostgreSQL 数据目录之外存储配置文件 (@jouir)
添加新的配置`postgresql`配置指令`config_dir`。它默认为数据目录,并且必须可由 Patroni 写入。
错误修复和稳定性改进
- 处理 EtcdEventIndexCleared 和 EtcdWatcherCleared 异常 (Alexander)
通过避免无用的重试,在 Etcd 结束监视操作时更快地恢复。
- 消除 Etcd 故障时的错误旋转并减少日志垃圾邮件 (Ants)
避免在第二次和后续 Etcd 连接失败时立即重试并在日志中发出堆栈跟踪。
- 分叉 PostgreSQL 进程时导出语言环境变量 (Oleksii Kliukin)
在使用 NLS 构建的 PostgreSQL 的非英语语言环境中,避免postmaster 在启动期间成为多线程的致命错误。
- 删除复制槽时的额外检查(Alexander)
在某些情况下,WAL 发送方会阻止 Patroni 删除复制槽。
- 将复制槽名称截断为 63 (NAMEDATALEN - 1) 个字符以符合 PostgreSQL 命名规则 (Nick Scott)
- 修复了导致从 Patroni 打开到 PostgreSQL 集群的额外连接的竞争条件(Alexander)
- 当节点以空数据目录重新启动时释放Leader键 (Alex Kerney)
- 在没有Leader的情况下运行引导程序时将异步执行程序设置为繁忙 (Alexander)
不这样做可能会导致错误,指出节点属于不同的集群,因为 Patroni 继续进行正常的业务,同时由不需要Leader存在于集群中的引导方法引导。
- 改进 WAL-E 副本创建方法(Joar Wandborg,Alexander)。
- 在解析 WAL-E 基础备份时使用 csv.DictReader,接受带有空格分隔的日期和时间的 ISO 日期。
- 支持从副本中获取当前 WAL 位置以估计要恢复的 WAL 数量。以前,用于调用仅在主节点上可用的系统信息函数的代码。
14.33 Version 1.2
此版本对同步复制的处理进行了重大改进,使启动过程和故障转移更加可靠,添加了 PostgreSQL 9.6 支持并修复了大量错误。此外,包括这些发行说明在内的文档已移至 (https://patroni.readthedocs.io/)。
同步复制
- 添加同步复制支持。(Ants Aasma)
添加一个新的配置变量`synchronous_mode`。启用后,`synchronous_standby_names`只要有可用的健康备库,Patroni 就会设法启用同步复制。启用同步模式后,Patroni 将仅自动故障转移到同步备用服务器。这实际上意味着在这种情况下不会丢失任何用户可见的事务。有关详细说明和实现细节,请参阅 [功能文档](https://patroni.readthedocs.io/en/latest/replication_modes.html#synchronous-mode)。
可靠性改进
- 当 PostgreSQL 不是 100% 健康时,不尝试更新Leader 键。当Leader 键更新失败时立即降级。 (Alexander Kukushkin)
- 从克隆新副本的目标列表中排除不健康的节点(Alexander)
- 为 Consul 实施重试和超时策略,类似于对 Etcd 的做法。(Alexander)
- 将`--dcs`和`--config-file`应用到`patronictl`的所有选项。(Alexander)
- 将所有 postgres 参数写入 postgresql.conf。(Alexander)
它允许启动由patroni配置的PostgreSQL,只需pg_ctl。
- 当配置中没有用户时避免异常。(Kirill Pushkin)
- 允许暂停不健康的集群。在此修复之前,`patronictl`如果它尝试暂停不健康节点,则将退出。(Alexander)
- 改进领导观察功能。(Alexander)
以前,副本一直在监视Leader 键(休眠直到超时或Leader 键更改)。通过此更改,他们仅在副本的 PostgreSQL 处于`running`状态时进行监视,而不会在它停止/启动或重新启动 PostgreSQL时进行监视。
- 将 SIGCHILD 作为 PID 1 处理时,避免遇到竞争条件。(Alexander)
以前在 Docker 容器中运行时可能会发生竞争条件,因为 Patroni 中的同一个进程既产生了新进程,又从它们处理了 SIGCHILD。此更改为 Patroni 使用 fork/execs,并使原始 PID 1 进程负责处理来自子进程的信号。
- 修复 WAL-E 还原。(Oleksii Kliukin)
以前 WAL-E 恢复使用该`no_master`标志来完全避免咨询主控,这使得 Patroni 总是选择从 WAL 恢复而不是`pg_basebackup`. 此更改将其还原为 的原始含义`no_master`,即如果 master 未运行,则可以选择 Patroni WAL-E 还原作为复制方法。通过检查传递给方法的连接字符串来检查后者。此外,它使重试机制更加健壮并处理其他细节。
- 实现异步 DNS 解析器缓存。(Alexander)
避免在 DNS 暂时不可用时失败(例如,由于节点接收的流量过多)。
- 实现启动状态和主启动超时。(Ants, Alexander)
以前`pg_ctl`等待超时,然后高兴地考虑考虑运行 PostgreSQL。这导致 PostgreSQL 在列表中显示为正在运行,而实际上并没有运行,并导致竞争条件,从而导致故障转移或崩溃恢复,或因故障转移和错过倒带而中断的崩溃恢复。此更改添加了一个`master_start_timeout`参数并为主 HA 循环引入了一个新状态:`starting`。当`master_start_timeout`是 0 时,一旦有故障转移候选者,当主节点崩溃时,我们将立即进行故障转移。否则,Patroni 将在超时期间尝试在 master 上启动 PostgreSQL 后等待;当它到期时,它会在可能的情况下进行故障转移。即使在超时到期之前,手动故障转移请求也将在主服务器崩溃期间得到满足。
将`timeout`参数引入`restart`API 端点和`patronictl`. 当它被设置并且重启时间超过超时时间时,PostgreSQL 被认为是不健康的,其他节点有资格获得领导者锁。
- 修复`pg_rewind`暂停模式下的行为。(Ants)
当 Patroni 认为它需要倒带但无法倒带(即`pg_rewind`不存在)时,避免在暂停模式下不必要的重新启动。如果 pg_rewind相关用户配置部分中缺少超级用户身份验证,则返回超级用户(默认操作系统用户)的默认libpq值。
- 序列化回调执行。当新的回调即将运行时,杀死前一个相同类型的回调。修复运行回调时产生僵尸进程的问题。(Alexander)
- 避免在 DCS 中设置Leader键但更新此Leader键失败时提升前主。(Alexander)
这避免了当前主节点与 Etcd 和其他 DCS 中允许“不一致读取”的少数节点一起分区时继续保持其角色的问题。
各种各样的
- `post_init`在引导程序上添加配置选项。(Alejandro Martínez)
Patroni 将在`initdb`为新集群运行和启动 PostgreSQL后立即调用此选项的脚本参数。脚本接收超级用户的连接URL,并将PGPASSFILE设置为指向包含密码的.pgpass文件。如果脚本失败,Patroni 初始化也会失败。它对于在新集群中添加新用户或创建扩展很有用。
- 实现 PostgreSQL 9.6 支持。(Alexander)
使用wal_level=replica作为hot_standby的同义词,避免在从一个更改为另一个时挂起重新启动标志。(Alexander)
文档改进
- 添加 Patroni 主[循环工作流图]
(https://raw.githubusercontent.com/zalando/patroni/master/docs/ha_loop_wqaqaxauxnrvhdmbedusqttmfgiyipaq.png)。(Alejandro,Alexander)
- 改进自述文件,添加 Helm 图表和发布说明链接。(Lauri Apple)
- 将 Patroni 文档移至阅读文档。 最新文档可在 https://patroni.readthedocs.io 获得。(Oleksii)
使文档可以从不同的设备(包括智能手机)轻松查看和搜索。
- 将包移动到语义版本控制。(Oleksii)
Patroni 将遵循major.minor.patch 版本架构,以避免在小但关键的错误修正上发布新的次要版本。我们只会发布包含所有补丁的次要版本的发行说明。
14.34 Version 1.1
此版本通过引入暂停模式改进了 Patroni 集群的管理,通过计划和有条件的重启改进了维护,使 Patroni 与 Etcd 或 Zookeeper 的交互更具弹性,并大大增强了 patronictl。
升级通知
从低于 1.0 的版本升级时,请阅读 1.0 版本说明中有关更改凭据和配置格式的信息。
暂停模式
- 引入暂停模式以暂时将 Patroni 与管理 PostgreSQL 实例分离。(Murat Kabilov、Alexander Kukushkin、Oleksii Kliukin)
以前,必须向 Patroni 发送 SIGKILL 信号以停止它而不终止 PostgreSQL。新的暂停模式将 Patroni 从 PostgreSQL 集群范围内分离,而不会终止 Patroni。它类似于 Pacemaker 中的维护模式。Patroni 仍然负责更新 DCS 中的成员和leader键,但它不会在此过程中启动、停止或重新启动 PostgreSQL 服务器。有一些例外,例如,仍然允许手动故障转移、重新初始化和重新启动。您可以阅读[此功能的详细说明]
(https://patroni.readthedocs.io/en/latest/pause.html#pause)。
此外,padomictl 支持新的`pause`和`resume`命令来切换暂停模式。
计划重启和有条件重启
- 向重启 API 命令添加条件(Oleksii)
此更改通过添加几个可以验证以进行重新启动的条件来增强 Patroni 重新启动。条件包括在 PostgreSQL 角色是主服务器或副本时重新启动、检查 PostgreSQL 版本号或仅在需要重新启动以应用配置更改时才重新启动。
- 添加计划重启 (Oleksii)
现在可以安排将来重新启动。每个节点仅支持一次计划重启。如果不再需要,可以清除计划的重启。支持计划重启和有条件重启的组合,例如,可以在夜间计划次要 PostgreSQL 升级,仅重启运行过时次要版本的实例,而无需向管理脚本添加 postgres 特定的逻辑。
- 将有条件的和预定的重启支持添加到patronictl (Murat)。
守护者重启支持几个新选项。还有patriotictl flush命令来清理计划的动作。
强大的 DCS 交互
- 根据 loop_wait设置 Kazoo 超时 (Alexander)
最初,ping_timeout 和connect_timeout 值是根据协商会话超时计算得出的。未考虑 Patroni loop_wait。因此,单次重试可能需要比会话超时更多的时间,从而迫使 Patroni 释放锁定并降级。
此更改将 ping 和连接超时设置为 loop_wait 值的一半,加快检测连接问题并留出足够的时间在丢失锁定之前重试连接尝试。
- 仅在原始请求成功后更新 Etcd 拓扑(Alexander)
推迟更新客户端已知的 Etcd 拓扑,直到原始请求之后。在检索集群拓扑时,根据 Etcd 集群中已知的节点数实现重试超时。这使得我们的客户更喜欢获得请求的结果,而不是拥有最新的节点列表。
面对网络问题,这两项更改都使 Patroni 与 DCS 的连接更加可靠。
Patronictl,监控和配置
- 通过 API返回有关流式副本的信息 (Feike Steenbergen)
以前,没有可靠的方法向 Patroni 查询无法流式传输更改(例如,由于连接问题)的 PostgreSQL 实例。此更改通过 /patroni 端点公开 pg_stat_replication 的内容。
- 添加patronictl scaffold 命令(Oleksii)
在 Etcd 中添加创建集群结构的命令。集群是用用户指定的 sysid 和leader创建的,leader和members键都是持久的。此命令可用于创建所谓的无主配置,其中 Patroni 集群仅由副本组成,从不知道 Patroni 的外部主节点复制。随后,可以删除leader 键,提升 Patroni 节点之一并用基于 Patroni 的 HA 集群替换原来的主节点。
- 添加配置选项`bin_dir`以定位 PostgreSQL 二进制文件 (Ants Aasma)
当 Linux 发行版支持同时安装多个 PostgreSQL 版本时,能够显式指定 PostgreSQL 二进制文件的位置很有用。
- 允许使用`custom_conf`覆盖配置文件路径(Alejandro Martínez)
允许自定义配置文件路径,这将由 Patroni 管理,[详细信息]
(https://patroni.readthedocs.io/en/latest/SETTINGS.html#postgresql-settings)。
错误修复和代码改进
- 使 Patroni 兼容 PostgreSQL 10 及以上的新版本模式(Feike)
在根据 PostgreSQL 版本进行有条件重启时,请确保 Patroni 理解 2 位版本号。
- 使用 pkgutil 查找 DCS 模块 (Alexander)
使用专用的 python 模块而不是手动遍历目录来查找 DCS 模块。
- 启动 Patroni时始终调用 on_start 回调 (Alexander)
以前,Patroni 在附加到具有正确角色的已运行节点时不会调用任何回调。由于回调通常用于路由客户端连接,这可能导致无法在连接路由方案中注册正在运行的节点。通过此修复,即使连接到已运行的节点,Patroni 也会调用 on_start 回调。
- 不要丢弃活动复制槽(Murat、Oleksii)
避免删除 master 上的活动物理复制槽。无论如何,PostgreSQL 不能删除这样的插槽。此更改使在主服务器上运行非 Patroni 管理的副本/消费者成为可能。
- 在 PostgreSQL 实例启动期间关闭 Patroni 连接 (Alexander)
当 PostgreSQL 节点启动时,强制 Patroni 关闭所有以前的连接。如果 postmaster 被 SIGKILL 杀死,则避免重用以前的连接的陷阱。
- 从member名称构造槽名称时替换无效字符(Ants)
确保不符合槽命名规则的备用名称不会导致槽创建和备用启动失败。将插槽名称中的破折号替换为下划线,并将插槽名称中不允许的所有其他字符替换为其 unicode 代码点。
14.35 Version 1.0
此版本引入了全局动态配置,允许动态更改整个 HA 集群的 PostgreSQL 和 Patroni 配置参数。它还提供了许多错误修正。
升级通知
从 v0.90 或更低版本升级时,请始终在 master 之前升级所有副本。由于我们不再在 DCS 中存储复制凭据,旧副本将无法连接到新主服务器。
动态配置
- 实现动态全局配置 (Alexander Kukushkin)
引入新的 REST API 端点 /config 以提供应为整个 HA 集群(主节点和所有副本)全局设置的 PostgreSQL 和 Patroni 配置参数。这些参数在 DCS 中设置,并且在许多情况下可以在不中断 PostgreSQL 或 Patroni 的情况下应用。当某些值需要重新启动 PostgreSQL 时,Patroni 会通过 API 设置一个称为“待重启”的特殊标志。在这种情况下,应通过 API 手动发出重新启动。
Patroni SIGHUP 或 POST 到 /reload 将使它重新读取配置文件。
有关 哪些参数可以更改以及处理差异配置源的顺序的详细信息,请参阅[动态配置]
(https://patroni.readthedocs.io/en/latest/dynamic_configuration.html#dynamic-configuration)。
自 v0.90 以来,配置文件格式已更改。Patroni 仍然与旧的配置文件兼容,但为了利用引导程序参数,需要对其进行更改。鼓励用户通过参考[动态配置文档页面]
(https://patroni.readthedocs.io/en/latest/dynamic_configuration.html#dynamic-configuration)来更新它们。
更灵活的配置
- 使 postgresql 配置和数据库名称 Patroni 连接到可配置 (Misja Hoebe)
引入database和config_base_name配置参数。其中,可以使用 PipelineDB 和其他 PostgreSQL fork 运行 Patroni。
- 实现通过环境配置一些 Patroni 配置参数的可能性(Alexander)
这些包括范围、节点名称和命名空间,以及秘密,使在动态环境(即 Kubernetes)中运行 Patroni 变得更容易。请参阅[支持的环境变量]
(https://patroni.readthedocs.io/en/latest/ENVIRONMENT.html#environment)以获取更多详细信息。
- 更新内置的 Patroni docker 容器以利用基于环境的配置 (Feike Steenbergen)。
- 将 Zookeeper 支持添加到 Patroni docker 镜像 (Alexander)
- 拆分 Zookeeper 和 Exhibitor 配置选项(Alexander)
- 让patronictl 重用来自Patroni 的代码来读取配置(Alexander)
这允许patronictl 利用基于环境的配置。
- 在 primary_conninfo 中将应用程序名称设置为节点名称(Alexander)
这简化了给定节点的同步复制的识别和配置。
稳定性、安全性和可用性改进
- 重置 sysid 并且在恢复正在进行的备份时不调用 pg_controldata (Alexander)
此更改减少了 Patroni API 运行状况检查在从备份中对该节点进行冗长初始化期间产生的噪音量。
- 修复一堆 pg_rewind 角落案例(Alexander)
如果源集群不是主集群,请避免运行 pg_rewind。
此外,避免在倒带失败时删除数据目录,除非新参数remove_data_directory_on_rewind_failure设置为 true。默认情况下它是false的。
- 从 DCS中的复制连接字符串中删除密码 (Alexander)
以前,Patroni 始终使用 DCS 中 Postgres URL 中的复制凭据。现在已更改为从 Patoni 配置中获取凭据。机密(复制用户名和密码)并不再在 DCS 中公开。
- 修复降级调用周围的异步机制 (Alexander)
Demote 现在完全异步运行,不会阻止 DCS 交互。
- 如果已配置,则使 Patientictl 始终发送授权标头 (Alexander)
当 Patroni 被配置为需要对这些请求进行授权时,这允许 Patronictl 发出“受保护的”请求,即重新启动或重新初始化。
- 正确处理 SystemExit 异常 (Alexander)
避免 Patroni 在收到 SIGTERM 时无法正常停止的问题
- confd (Alexander) 的示例 haproxy 模板
使用 confide 从 DCS 中的 Patoni 状态生成并动态更改 haproxy 配置
- 改进和重组文档,使其对新用户更友好(Lauri Apple)
- API 必须在 pg_ctl 停止期间报告 role=master (Alexander)
使回调调用更可靠,尤其是在集群停止的情况下。此外,引入pg_ctl_timeout选项以通过pg_ctl设置启动、停止和重启调用的超时时间。
- 修复 etcd (Alexander) 中的重试逻辑
使重试更具可预测性和稳健性。
- 使 Zookeeper 代码更能抵御短网络故障 (Alexander)
减少连接超时,使 Zookeeper 连接尝试更频繁。
14.36 Version 0.90
该版本增加了对Consul,包括一个新的noloadbalance标签,改变的行为clonefrom标签,提高pg_rewind处理和改善patronictl控制程序。
Consul支持
- 实施Consul支持 (Alexander Kukushkin)
除了 Etcd 和 Zookeeper 之外,Patroni 还对抗 Consul。连接参数可以在 YAML 文件中配置。
新的和改进的标签
- 实现noloadbalance标签 (Alexander)
此标记使 Patroni 始终返回副本对负载均衡器不可用。
- 更改clonefrom标签的实现(Alexander)
以前,必须向clonefrom提供节点名称,强制标记副本从特定节点克隆。新的实现使clonefrom成为一个布尔标签:如果它被设置为 true,则副本成为其他副本从中克隆的候选者。当存在多个候选时,副本随机选择一个。
稳定性和安全性改进
- 许多可靠性改进(Alexander)
删除一些虚假的错误消息,提高故障转移的稳定性,解决一些从 DCS 读取数据、关闭、降级和重新附加前领导者的极端情况。
- 改进系统脚本以避免在停止时杀死 Patroni 子节点(Jan Keirse、Alexander Kukushkin)
以前,在停止 Patroni 时,systemd也会向 PostgreSQL 发送信号。由于 Patroni 也尝试自行停止 PostgreSQL,因此导致发送到不同的关闭请求(智能关闭,然后是快速关闭)。这导致副本过早断开连接,并且前主节点在降级后无法重新加入。由 Jan 使用 Alexander 先前的研究修复。
- 消除一些前主控在作为副本重新加入之前无法调用 pg_rewind 的情况(Oleksii Kliukin)
以前,我们只在前主服务器崩溃时调用pg_rewind。只要 pg_rewind 存在于系统中,就将其更改为始终为以前的 master 运行 pg_rewind。这解决了在副本设法获取最新更改之前关闭主服务器的情况(即在“智能”关闭期间)。
- 对单元测试和验收测试的大量改进,特别是支持 Zookeeper 和 Consul (Alexander)。
- 使 Travis CI 更快,并支持对 Zookeeper(Exhibitor)和 Consul(Alexander)运行测试
在每次提交或拉取请求时,单元测试和验收测试都会针对 Etcd、Zookeeper 和 Consul 自动运行。
- 从 Patroni (Feike Steenbergen) 调用 PostgreSQL 命令之前清除环境变量
这可以防止通过连接到 Patroni 管理的 PostgreSQL 集群来读取系统环境变量的可能性。
配置和控制更改
- 统一patronictl和Patroni配置(Feike)
Patroni 可以使用与 Patroni 本身相同的配置文件。
- 启用 Patroni 从环境变量中读取配置 (Oleksii)
这简化了自动为 Patroni 生成配置,或合并来自不同来源的单个配置。
- API返回的信息中包含数据库系统标识(Feike)
- 为所有可用的 DCS实现delete_cluster (Alexander)
在patronictl 中启用对Etcd 以外的DCS 的支持。
14.37 Version 0.80
此版本增加了对级联复制的支持,并通过提供预定的故障转移来简化 Patroni 管理。可以将旧版本的 Patroni(特别是 0.78)与该版本结合使用,以便迁移到新版本。请注意,计划故障转移和级联复制相关功能仅适用于 Patroni 0.80 及更高版本。
级联复制
- 添加对patroni 节点的replicatefrom和clonefrom标签的支持。(Oleksii Kliukin)
- 标签replicatefrom允许副本使用任意节点作为源,而不是主节点。该clonefrom做为初始备份相同。它们一起使 Patroni 能够完全支持级联复制。
- 添加对运行复制方法的支持以初始化副本,即使没有正在运行的复制连接 (Oleksii)。
这对于从存储在 S3 或 FTP 上的快照创建副本很有用。不需要正在运行的复制连接的复制方法应该在 yaml 配置中提供no_master: true。如果存在复制连接,这些脚本仍将按顺序调用。
Patronictl、API 和 DCS 改进
- 计划任务failover (Feike Steenbergen)。
failover可以被安排在未来的某个时间发生,使用patonictl 或API 调用。
- 在patronictl (Feike) 中添加对dbuser和password参数的支持。
- 将 PostgreSQL 版本添加到健康检查输出 (Feike)。
- 改进对守护程序的 Zookeeper 支持(Oleksandr Shulgin)
- 迁移到 python-etcd 0.43 (Alexander Kukushkin)
配置
- 为 Patroni 添加示例系统配置脚本。(Jan Keirse)
- 修复 Patroni 忽略数据库连接配置文件中指定的超级用户名的问题。(Alexander)
- 通过为 Patroni启动的 postmaster 创建单独的会话 ID 和进程组来修复 CTRL-C 的处理。 (Alexander)
测试
- 添加具有behave验收测试,以检查运行 Patroni的真实场景。(Alexander、Oleksii)
可以使用behave命令手动启动测试。它们也会针对拉取请求和提交后自动启动。
可以在[项目的 github 页面](https://github.com/zalando/patroni/releases)上找到一些旧版本的发行说明。
第15章 贡献指南
想为 Patroni 做出贡献吗?是的 - 这就是方法!
15.1互动
只想与其他 Patroni 用户聊天?正在寻找交互式故障排除帮助?在[PostgreSQL Slack](https://postgres-slack.herokuapp.com/)频道#patroni 上加入我们。
15.2运行测试
运行行为测试的要求:
1. 需要安装 PostgreSQL 包。
2. PostgreSQL 二进制文件必须在您的PATH 中可用。您可能需要使用类似PATH=/usr/lib/postgresql/11/bin:$PATH python -m 行为的内容将它们添加到路径中。
3. 如果您想使用外部 DCS(例如 Etcd、Consul 和 Zookeeper)进行测试,您将需要安装软件包和运行相应的服务,并在 localhost 和默认端口上接受未加密/未受保护的连接。在 Etcd 或 Consul 的情况下,如果二进制文件在PATH中可用,行为测试套件可以启动它们。
安装依赖:
# You may want to use Virtualenv or specify pip3. pip install -r requirements.txt pip install -r requirements.dev.txt
安装所有依赖项后,您可以运行各种测试套件:
# You may want to use Virtualenv or specify python3. # Run flake8 to check syntax and formatting: python setup.py flake8 # Run the pytest suite in tests/: python setup.py test # Run the behave (https://behave.readthedocs.io/en/latest/) test suite in features/; # modify DCS as desired (raft has no dependencies so is the easiest to start with): DCS=raft python -m behave
15.3 报告问题
如果您有关于patroni的问题或在使用它时遇到问题,请在提交问题之前阅读[自述](https://patroni.readthedocs.io/en/latest/README.html#readme)文件。还要仔细检查我们的[问题跟踪器](https://github.com/zalando/patroni/issues)上的当前问题。
15.4 贡献拉取请求
1. 提交对相关问题的评论或创建一个描述您提议的更改的新问题。
2. 做一个 fork,开发和测试你的代码更改。
3. 包括文档
4. 提交拉取请求。
您将尽快获得有关您的拉取请求的反馈。
快乐的 Patroni 黑客 😉