patroni release notes
version 1.6.5
New features
-
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
依赖它们。
Improvements in patronictl
-
显示成员标签
标签是为每个节点分别配置的,没有简单的方法可以对其进行概述
-
增加成员输出
多余的集群名称将不在显示在每一行上,仅显示在表格标题中
$ 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
将报错主版本不匹配并因错误而终止。
Bugfixes
-
必要时为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进行多处理时,兼容性被破坏了。
version 1.6.4
新特性
-
为
patronictl reinit
实现了--wait
选项如果
patronictl
使用了--wait
选项,那么他将等待reinit
完成 -
Windows支持的进一步改进
- 用于集成测试的所有shell脚本都用python重写
pg_ctl kill
将用于在非posix系统上停止postgres- 不要尝试使用Unix域套接字
稳定性提升
-
确保
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
更改为一些安全值。
bugfixes
-
在级联副本上使用
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,则可能会引发异常。缺少异常处理阻止了记录器线程停止
version 1.6.3
bug修复
-
在运行
pg_rewind
时不再暴露密码详见#1301的说明。
-
使用
postgresql.authentication
中指定的连接参数去执行pg_basebackup
和 自定义流复制的创建方法他们依靠类似url的连接字符串,因此从未应用过参数
version 1.6.2
新特性
-
增加
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堆栈跟踪中找出问题所在。
bug修复
-
修改了
wal_buffers
的计算在PostgreSQL 11中,这个基本单元已经从8KB修改为bytes
-
在PostgreSQL 10+支持在
primary_conninfo
使用passfile
在旧版本不支持使用
passfile
,除非安装了最新版本的libpq
Version 1.6.1
新特性
-
添加
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配置文件中定义密码通过运行不同的外部数据包装器,它将解决很多问题。
稳定性提升
- 使用K8s API时使用LIST + WATCH
支持有效的对象更改(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的增加
-
支持使用REST API检查客户端认证证书
如果
verify_client
被设置为required
,那么Patroni将检查所有REST API调用的客户端证书。当他被设置成
optional
,将检查客户端证书中所有不安全的REST API端点。 -
如果PostgreSQL未运行,则返回
get/reolica
运行状况检查请求的相应代码503Postgres在开始接受客户端连接之前可能会花费大量时间进行恢复
-
添加了
/history
和/cluster
端点/history
端点显示DCS中历史记录秘钥的内容。/cluster
节点展示了所有的集群成员和所有服务信息,例如暂挂和计划的重新启动和切换。
增加了etcd的支持
-
Etcd RAFT内部错误重试
当etcd节点被关闭,他会发出
response code=300, data='etcdserver: server stopped'
的异常,这会导致prtroni的主节点降级 -
不要放弃etcd请求重试
当出现一些网络问题时,Patroni很快耗尽了Etcd节点列表,并且在不使用整个
retry_timeout
的情况下放弃了该操作,从而有可能导致主节点降级。
bug修复
-
向
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仍然有可能设置为“启动失败”
Version 1.6.0
这个版本增加了对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
是从外部进行管理的,并且不会更新文件。
REST API的增加
-
增加了节点
/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的支持
-
允许指定Consul一致性模式
你可以从here获取有关一致性的更多信息。
-
重新加载
SIGHUP
上的Consul
配置当有人更改令牌的值时,它特别有用。
bug修复
-
修复切换/故障转移中的极端情况
如果无法访问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
无法访问并且存在一些其他的次要修复程序时,可以再备库中引导脚本