当前位置: 首页 > 工具软件 > Patroni > 使用案例 >

patroni中文手册—发布记录

林夕
2023-12-01

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支持的进一步改进

    1. 用于集成测试的所有shell脚本都用python重写
    2. pg_ctl kill将用于在非posix系统上停止postgres
    3. 不要尝试使用Unix域套接字

稳定性提升

  • 确保unix_socket_directoriesstats_temp_directory文件存在

    在Patroni和Postgres启动时,请确保存在unix_socket_directoriesstats_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_statementlog_min_duration_statementlog_min_error_statement更改为一些安全值。

bugfixes

  • 在级联副本上使用standby_cluster配置中的restore_command

    这个功能存在之初,standby_leader就已经开始这样做了。 在副本服务器上不做同样的事情可能会阻止它们赶上备用领导服务器。

  • standby集群报告的更新时间线

    在时间线切换的情况下,standby群集可以从primaty群集正确复制,但是patronictl正在报告旧的时间线。

  • 允许在custom_conf中定义某些恢复参数

    如果未在patroni配置中定义以及postgresql.auto.confpostgresql.conf以外的文件中未定义恢复参数,则在对Patroni进行恢复参数验证时,Patroni将跳过archive_cleanup_commandpromoting_trigger_filerecovery_end_commandrecovery_min_apply_delayrestore_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_commandpromote_trigger_filerecovery_end_commandrecovery_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运行状况检查请求的相应代码503

    Postgres在开始接受客户端连接之前可能会花费大量时间进行恢复

  • 添加了/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_namesynchronous_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选项中定义usernamepassword。对于一个已经存在的集群,你还需要去手动创建一个用户并且在一些函数上授权grant execute。你可以在 documentation上找到更多内容。

  • 对备库上实际和所需的primary_conninfo值进行只能比对

    将现有的主备用集群转换为由patroni管理的集群时有助于避免备库重新启动

  • 支持IPV6

    有两个主要问题。Patroni REST API服务仅仅在0.0.0.0和在api_urlconn_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无法访问并且存在一些其他的次要修复程序时,可以再备库中引导脚本

 类似资料: