Master关闭超时
停止Postgres时允许Patroni等待的秒数。synchronous_mode
参数启用时生效。当设置的值大于0并且启用了synchronous_mode
时,如果停止操作运行的时间超过master_stop_timeout
设置的值,则patroni将SIGKILL发送到postmaster。根据您系统的耐用性/可用性权衡来设置值。 如果未设置这个参数参数或将其设置为非正值,则master_stop_timeout
无效。
不要使用primary的名字创建永久的物理插槽
一个常见的问题是,primary 服务器在slave服务器关闭时回收wal段。现在我们为静态集群提供了一个很好的解决方案,他具有固定数量的节点和名称,并且永远不会更改。你只需要列出插槽中所有节点的名称,以便primary在节点关闭(未在DCS中注册)时不会删除这个插槽
配置验证器初稿
使用patroni --validate-config patroni.yaml
验证patroni
配置的有效性
可以配置时间线的历史的最大长度
patroni
将故障转移/切换的历史记录写入到DCS
中的/history
中。随着时间推移,此秘钥的大小会变大但是在大多数情况下,只有最后几条记录有意义。max_timelines_history
参数允许指定要在DCS
中保留的时间轴历史项的最大数量。
Kazoo 2.7.0 兼容性
Kazoo中的某些非公开方法更改了其签名,但是Patroni
依赖它们。
显示成员标签
标签是为每个节点分别配置的,没有简单的方法可以对其进行概述
增加成员输出
多余的集群名称将不在显示在每一行上,仅显示在表格标题中
$ patronictl list
+ Cluster: batman (6813309862653668387) +---------+----+-----------+---------------------+
| Member | Host | Role | State | TL | Lag in MB | Tags |
+-------------+----------------+--------+---------+----+-----------+---------------------+
| postgresql0 | 127.0.0.1:5432 | Leader | running | 3 | | clonefrom: true |
| | | | | | | noloadbalance: true |
| | | | | | | nosync: true |
+-------------+----------------+--------+---------+----+-----------+---------------------+
| postgresql1 | 127.0.0.1:5433 | | running | 3 | 0.0 | |
+-------------+----------------+--------+---------+----+-----------+---------------------+
如果显示指定了配置文件但是未找到,则失败
之前,patronictl
仅报告DEBUG
消息
解决了未初始化的K8s Pod
损坏模块的问题
patroni依赖k8s上的某些Pod。当其中一个patroni pod
停止或启动时,尚无有效的注释,并且patronictl
异常失败
如果对K8s API
服务器的LIST
调用失败,则应用1秒回退
多数情况下需要避免泛滥日志,但同时也有助于防止主线程饥饿。
如果K8s API
返回了重试HTTP
标头,则重试
如果K8s API
服务器对请求不知所措,则可能会要求重试。
从postmaster清理KUBERNETES_
环境
PostgreSQL不需要KUBERNETES_
环境变量,但是将它们公开给postmaster
也将它们公开给后端和常规数据库用户(例如,使用pl/perl)
重新初始化时清理表空间
在重新初始化期间,Patroni仅删除PGDATA
并保留用户定义的表空间目录。这导致Patroni
循环重新初始化。 解决该问题的先前工作方法是实现 custom bootstrap脚本。
在升级完成后执行checkpoint
这有助于减少新的primary master数据库用于pg_rewind的时间
智能刷新etcd
成员
万一patroni
无法在etcd
集群的所有成员上执行请求,patroni
将在再次尝试之前重新检查A或SRC记录中的IPs/hosts更改
跳过pg_controldata
中缺少的值
当尝试使用用与PGDATA
不匹配版本的二进制文件时。patroni
仍然尝试启动PostgreSQL
,而PostgreSQL
将报错主版本不匹配并因错误而终止。
必要时为Consul禁用SSL验证
从特定版本的urllib3开始,必须将cert_reqs
显式设置为ssl.CERT_NONE
才能有效地禁用ssl验证
避免在HA循环的每个周期上打开复制连接
回归在1.6.4中引入
在失败的primary服务器上调用on_role_change
回调
在某些情况下,这可能会导致VIP仍附加到旧的主IP。 回归在1.4.5中引入。
如果在成功pg_rewind
之后启动postgres,则重置rewind状态
由于该错误,Patroni会在暂停模式下手动启动postgres进行关闭。
检查recovery.conf时,将recovery_min_apply_delay
转换为ms
如果在早于12的PostgreSQL上配置了recovery_min_apply_delay
,Patroni会无限期地重启副本
PyInstaller兼容性
PyInstaller将Python应用程序冻结(打包)为独立的可执行文件。 当我们切换到spawn方法而不是fork进行多处理时,兼容性被破坏了。
为patronictl reinit
实现了--wait
选项
如果patronictl
使用了--wait
选项,那么他将等待reinit
完成
Windows支持的进一步改进
pg_ctl kill
将用于在非posix系统上停止postgres确保unix_socket_directories
和stats_temp_directory
文件存在
在Patroni和Postgres启动时,请确保存在unix_socket_directories
和stats_temp_directory
,或尝试创建它们。 如果创建失败,Patroni将退出
确保postgresql.pgpass
位于Patroni拥有写访问权的位置
如果没有写权限,Patroni会异常退出。
默认情况下禁用Consul serfHealth
检查
即使在网络问题很少的情况下,失败的serfHealth
也会导致与该节点关联的所有会话失效。因此,leader key比ttl丢失的时间要早很多,这会导致replicas意外重启以及primary降级
配置tcp keepalive
以连接到K8s API
如果在TTL秒后我们没有从socket上得到任何东西,则可以认为它已失效。
避免在创建用户时记录密码
如果拒绝密码或将日志记录配置为verbose
或根本没有配置,则可能会将密码写入postgres日志中。为了避免这种情况,Patroni将在尝试创建/更新用户之前将log_statement
,log_min_duration_statement
和log_min_error_statement
更改为一些安全值。
在级联副本上使用standby_cluster
配置中的restore_command
这个功能存在之初,standby_leader
就已经开始这样做了。 在副本服务器上不做同样的事情可能会阻止它们赶上备用领导服务器。
standby集群报告的更新时间线
在时间线切换的情况下,standby群集可以从primaty群集正确复制,但是patronictl
正在报告旧的时间线。
允许在custom_conf
中定义某些恢复参数
如果未在patroni配置中定义以及postgresql.auto.conf
或postgresql.conf
以外的文件中未定义恢复参数,则在对Patroni进行恢复参数验证时,Patroni将跳过archive_cleanup_command
,promoting_trigger_file
,recovery_end_command
,recovery_min_apply_delay
和restore_command
改进对Postgresql参数的处理,其名称中带有.
此类参数可以通过扩展定义,其中单位不一定是字符串。 更改值可能需要重新启动(例如pg_stat_statements.max
)
改善关机期间的异常处理
在关闭期间,Patroni尝试更新其在DCS中的状态。如果无法访问DCS,则可能会引发异常。缺少异常处理阻止了记录器线程停止
在运行pg_rewind
时不再暴露密码
详见#1301的说明。
使用postgresql.authentication
中指定的连接参数去执行pg_basebackup
和 自定义流复制的创建方法
他们依靠类似url的连接字符串,因此从未应用过参数
增加patroni --version
打印patroni的版本信息并退出
user-agent
为所有http请求设置http标头
patroni通过HTTP协议和consul、etcd和Kubernetes联系。拥有专门设计的user_agent
(例如:Patroni/1.6.2 Python/3.6.8 Linux
)可能对调试和监控很有用
可以配置日志级别的异常回溯
这样就可以在Postgres节点之间使用Kerberos身份验证,而不是在Patroni配置文件中定义密码
如果你设置log.traceback_level=DEBUG
,日志回溯将只能在log.level=DEBUG
时可见。
搜索配置文件所需的模块时,避免导入所有DCS模块
加入我们只需要使用zookeeper
,我们就不在需要导入etcd、consual、kubernetes模块。他有助于减少内存的使用量并且解决了在INFO
级别消息时的错误消息Failed to import smth
从必须的模块列表中删除了python的requests
模块
它没有用于任何重要的事情,但是在发布新版本的urllib3时会引起很多问题。
改进了etcd.hosts
中以逗号分隔字符串而不是YAML数组的格式。
在之前按照格式host1:port1, host2:port2
书写会失败(逗号后的空格字符)
不再强制用户从patronicl
的空列表中选择成员
如果用户给出了一个错误的集群名称,我们将会抛出一个异常而不是让用户从一个空列表中选择成员
如果REST API无法绑定,则使错误消息更有帮助
对于一个没有经验的用户,可能很难从Python堆栈跟踪中找出问题所在。
修改了wal_buffers
的计算
在PostgreSQL 11中,这个基本单元已经从8KB修改为bytes
在PostgreSQL 10+支持在primary_conninfo
使用passfile
在旧版本不支持使用passfile
,除非安装了最新版本的libpq
添加PATRONICTL_CONFIG_FILE
环境变量
他允许patronictl
从环境变量中配置--config-file
添加patronictl history
他能展示集群failover/switchover的历史
在做pg_rewind
时在PGOPTIONS
中传递-c statement_timeout=0
他可以防止以下情况,服务器上的statement_timeout设置为某个小值,并且取消由pg_rewind执行的语句
允许PostgreSQL配置更小的值
Patroni不允许PostgreSQL中的一些参数被配置成小于某些硬编码值。现在最小允许值配置更小,默认值未更改。
允许基于证书的身份验证
这个功能能够为超级用户、复制用户和rewind用户启用基于证书的身份验证,并允许用户指sslmode
在primary_conninfo
中使用passfile
而不必是密码
可以避免使用在postgresql.conf
文件中设置600权限的文件
无论配置如何更改,都执行pg_ctl reload
某些配置文件可能不受patroni控制。当有人通过REST API或通过将SIFHUP发送到patroni进行进行重新加载时,通常的期望是PostgreSQL也将被加载。以前,当Patroni配置的postgresql部分没有更改时,不会发生这种情况
比较所有的恢复参数,而不仅仅是primary_conninfo
之前check_recovery_conf()
方法只检查primary_conninfo
是否发生变化,而从未考虑过其他恢复参数
无需重新启动即可应用一些恢复参数
从PostgreSQL的12起以下恢复参数可以在不重启而改变,archive_cleanup_command
、promote_trigger_file
、recovery_end_command
和recovery_min_apply_delay
。在将来的PostgreSQL版本中,此列表将得到扩展,patroni将自动支持他
支持在线更改use_slot
以前,他需要重新启动patroni并手动删除复制槽
在启动PostgreSQL是仅移除PATRONI_
前缀的环境变量这样就可以在Postgres节点之间使用Kerberos身份验证,而不是在Patroni配置文件中定义密码
通过运行不同的外部数据包装器,它将解决很多问题。
支持有效的对象更改(pods, endpoints/configmaps),使k8s的主节点压力更小
引导过程总PGDATA目录不为空是的流程改善
根据initdb
源代码,当目录中仅包含lost+found
和.dotfiles
时,他可能认为PGDATA为空。现在,patroni也是做了相同的判断。如果PGDATA
恰好是非空的,并且同时从pg_controldata
的角度来看是无效的,则patroni将退出
避免在每个ha循环上调用代价昂贵的os.listdir()
在系统处于大压力下,os.listdir()可能需要花费几秒钟(甚至几分钟)来执行,从而严重影响patroni的HA循环。由于DCS缺少master主机的键值更新,可能会出现键值消失。现在采用了一种有有效并且低代价的方法来检查PGDATA是否为空,现在检查PGDATA是否存在global/pg_control
文件
日志记录基础架构的一些改进
以前,由于日志记录线程是守护程序线程,因此在关机时可能会丢失最后几行日志。
在python3.4+上使用 spwan
多进程启动的方法
Python中的一个已知问题是线程和多进程不能很好地融合在一起。现在默认方法从fork
切换成spwan
。如果不这样做,可能会导致postmaster启动过程无限挂起,并且patroni无限报错:INFO: restarting after failure in progress
支持使用REST API检查客户端认证证书
如果verify_client
被设置为required
,那么Patroni将检查所有REST API调用的客户端证书。
当他被设置成optional
,将检查客户端证书中所有不安全的REST API端点。
如果PostgreSQL未运行,则返回get/reolica
运行状况检查请求的相应代码503
Postgres在开始接受客户端连接之前可能会花费大量时间进行恢复
添加了/history
和/cluster
端点
/history
端点显示DCS中历史记录秘钥的内容。/cluster
节点展示了所有的集群成员和所有服务信息,例如暂挂和计划的重新启动和切换。
Etcd RAFT内部错误重试
当etcd节点被关闭,他会发出response code=300, data='etcdserver: server stopped'
的异常,这会导致prtroni的主节点降级
不要放弃etcd请求重试
当出现一些网络问题时,Patroni很快耗尽了Etcd节点列表,并且在不使用整个retry_timeout
的情况下放弃了该操作,从而有可能导致主节点降级。
向pg_rewind
用户授予执行权限时,禁用sync_commit
如果引导程序是通过synchronous_mode_strict: true
初始化完成的,由于非同步节点可用,所以授予执行权限的语句将会一直等待。
在修复了在python3.7上的内存泄露问题
patroni使用ThreadingMixIn
去处理REST API
请求。默认情况下,python3.7生成的线程为每个非守护程序请求生成。
修复异步操作中的竞争条件
执行patronictl reinit --force
可能会发生重写覆盖停止的postgres数据。通常出现在执行basebackup的时候同时尝试使用patroni启动PostgreSQL
在postmaster_start_time()
方法中修复竞争条件
如果该方法是从REST API线程执行的,则需要创建一个单独的游标对象
修改了名称包含大写字母的同步standby节点不能提升的问题
我们把名称转换为小写因为PostgreSQL在比较application_name
和synchronous_standby_name
名称时就是这么做的。
在创建一个新的callback
进程前首先通过杀死所有的子这样就可以在Postgres节点之间使用Kerberos身份验证,而不是在Patroni配置文件中定义密码进程
否则将很难在bash中实现回调,最终可能导致同时运行两个回调的情况
解决了start failed
的问题
在某些情况下,尽管PostgreSQL已经启动并正常运行,PostgreSQL仍然有可能设置为“启动失败”
这个版本增加了对PostgreSQL 12的兼容性。支持在没有超级用户的情况下在PostgreSQL 11和更高版本上执行pg_rewind
,并且支持ipv6
psycopg2从requirements
列表删除,必须独立安装
从python2.8.0开始,psycopg2被分割成两个包:psycopg2和psycopg2-binary,可以同时安装到文件系统上的同一位置。为了减少依赖性问题,用户自主选择如何安装。有几种安装选择,详情请查阅:documentation
与PostgreSQL 12 兼容
从PostgreSQL 12 开始,不再有recovery.conf
,所有以前的恢复参数都转换成GUC。为了免受ALTER SYSTEM SET primary_conninfo
和其他类似内容的破坏,patroni将解析postgresql.auto.conf
并从那里删除所有备用和恢复参数。Patroni配置仍然向下兼容。例如,restore_command
是一个GUC,但是仍然可以在postgresql.recovery_conf.restore_command
部分中指定他,Patroni会将其写入PostgreSQL 12 的postgresql.conf
的文件中
支持在没有超级用户的情况下在PostgreSQL 11和更高版本上执行pg_rewind
如果你想要使用这个特性,需要在postgresql.authentication.rewind
选项中定义username
和password
。对于一个已经存在的集群,你还需要去手动创建一个用户并且在一些函数上授权grant execute
。你可以在 documentation上找到更多内容。
对备库上实际和所需的primary_conninfo
值进行只能比对
将现有的主备用集群转换为由patroni管理的集群时有助于避免备库重新启动
支持IPV6
有两个主要问题。Patroni REST API服务仅仅在0.0.0.0
和在api_url
和conn_url
上未被正确应用的IPV6地址上被监听
支持Kerberos
这样就可以在Postgres节点之间使用Kerberos身份验证,而不是在Patroni配置文件中定义密码
管理pg_ident.conf
这个函数的工作原理和pg_ident.conf
类似:如果postgresql.pg_ident
被配置在配置文件或者DCS中,patroni将把他的值写入到pg_ident.conf
。然而,如果postgresql.parameters.ident_file
文件被定义,patroni将假定pg_ident
是从外部进行管理的,并且不会更新文件。
增加了节点/health
如果PostgreSQL正在运行,他将返回一个HTTP的状态码
添加了/read-only
和/read-write
节点
/ read-only端点启用跨副本和主副本的读取平衡。
/read-write端点是/primary
,/leader
,/master
节点的别名
使用SSLContext
包装REST API
套接字
ssl.wrap_socket()
已经被弃用,并且允许使用如TLS 1.1
这样即将被弃用的协议
两步记录
为GET/OPTIONS API
调试日志记录以及延迟启用debug日志
这将有助于调试由HAProxy,Consul或其他工具(确定哪个节点是主节点/副本节点)执行的运行状况检查。
增强对话以进行计划的切换和重新启动
以前的对话没有考虑到计划采取的行动,因此具有误导性。
检查配置文件是否存在
当给定的文件名不存在时,请详细说明配置文件,而不是默默地忽略(这可能会引起误解)。
为EDITOR
添加后备值
如果未定义EDITOR
环境变量,则patronictl edit-config
会失败,并显示PatroniCtlException
。新策略是尝试使用editor
而不是vi
,这应该在大多数系统中都可用
允许指定Consul一致性模式
你可以从here获取有关一致性的更多信息。
重新加载SIGHUP
上的Consul
配置
当有人更改令牌的值时,它特别有用。
修复切换/故障转移中的极端情况
如果无法访问REST API,并且我们将DCS回退,变量scheduled_at
可能不能被定义。
自定义引导过程中在pg_hba.conf
中打开对localhost的信任
之前仅对unix_socket
开放,这导致了很多错误
FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "replicator"
即使旧主库领先,同步节点也会被认为健康
如果主节点失去对DCS的访问权限,他将以只读的方式重新启动PostgreSQL,但是肯能发生其他节点仍然可以通过REST API访问旧节点的情况。这种情况导致同步备库无法升级,因为旧的主数据库在同步备用数据库之前报告了WAL的位置。
备库错误修正
当standby_leader
无法访问并且存在一些其他的次要修复程序时,可以再备库中引导脚本