热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Patroni如何解决PostgreSQL集群中的逻辑复制插槽故障切换问题

Patroni如何解决PostgreSQL集群中的逻辑

在PostgreSQL中使用逻辑复制时,逻辑复制插槽的故障切换一直是难点。这种功能的缺乏破坏了逻辑复制的使用,并成为最大的威慑因素之一。其利害关系和影响如此之大,以至于许多组织不得不放弃围绕逻辑复制的计划,这影响了许多迁移到PostgreSQL的计划。看到许多人不得不选择专有/特定于供应商的解决方案,这让人感到痛苦。

在Percona,我们过去曾写过这方面的文章:缺少的部分:逻辑复制插槽的故障切换.在那篇文章中,我们讨论了解决此问题的一种可能方法,但没有可靠的机制将插槽信息复制到物理备份并对其进行维护。

简而言之:复制插槽将始终保持在主节点上。如果有一个switchover/failover升级了其中一个备用节点,那么新的主节点将不知道前一个主节点维护的复制插槽。这会中断下游系统的逻辑复制,或者如果创建了一个新插槽,则使用起来就不安全。

好消息是,Patenti开发人员和维护人员从2.1.0版开始解决了这个问题,并提供了一个有效的解决方案,没有任何侵入性的方法/扩展。对我来说,这是一部值得Patroni社区热烈鼓掌的作品,这也是这篇博文的意图,也是为了确保更多的人知道这一点。

如何设置

Percona repository提供现成的Patroni包。但你可以从任何渠道自由使用Patroni。

基本配置

如果您对此感到兴奋并想尝试,以下步骤可能会有所帮助。

整个讨论都是关于逻辑复制的。因此,最低要求是将wal_level 设置为“logical”。如果现有的用户配置将wal_level 设置为“replica”,并且如果您想使用此功能,您可以只编辑Patroni配置。

但是,此更改需要重新启动PostgreSQL:

最后一列状态栏 Pending restart
里面都是 *
号,表示配置已经修改,需要重启生效。

您可以使用Patroni的switchover
功能重新启动节点,使更改生效,因为降级的节点需要重新启动。

如果还有剩余的节点,可以稍后重新启动。


创建逻辑槽

现在我们可以为PostgreSQL添加一个永久的逻辑复制槽,该槽将由Patroni维护。

编辑Patroni配置:

    $ patronictl -c etc/patroni/patroni.yml edit-config

    可以按如下方式添加槽:


      slots:
      logicreplia:
      database: postgres
      plugin: pgoutput
      type: logical

      slots:”部分定义了永久复制槽。这些槽将在switchover/failover切换期间保留。pgoutput
      是PostgreSQL逻辑复制的解码插件。

      一旦应用了更改,将在主节点上创建逻辑复制槽。可以通过查询来验证:

        select * from pg_replication_slots;

        以下是一个示例输出:

        同样的复制槽也将在备节点上创建。Patroni 在内部将复制槽信息从主节点复制到所有符合条件的备节点。

        我们可以在备节点的pg_replication_slot上使用相同的查询,并查看类似信息

        下面是一个示例,显示了同一复制槽在备节点端的反馈:

        通过在创建订阅端时显式指定插槽名称,订阅端可以使用此插槽。

          CREATE SUBSCRIPTION sub2 CONNECTION ' PUBLICATION WITH (copy_data = true, create_slot=false, enabled=true, slot_name=logicreplia);

          或者,可以修改现有订阅端指定新复制槽。

          例如:

            ALTER SUBSCRIPTION name SET (slot_name=logicreplia);

            相应的PostgreSQL日志条目可以确认复制槽名称的更改:

              2021-12-27 15:56:58.294 UTC [20319] LOG: logical replication apply worker for subscription "sub2" will restart because the replication slot name was changed
              2021-12-27 15:56:58.304 UTC [20353] LOG: logical replication apply worker for subscription "sub2" has started

              在发布端,我们可以通过检查active_pid和推进插槽的LSN来确认插槽使用情况。

              随着逻辑复制从主节点进行,Patroni集群的所有备节点中的复制槽信息也会更新

              在更高的层次上,这正是这个特性所做的:

              1. 自动创建/复制 槽信息,将其从Patroni集群中的主节点复制到所有符合条件的备用节点。

              2. 随着LSN在主节点上相应槽上的前进,备节点槽上的LSN也自动前进。


              Switchover/Failover 后

              在switchover/Failover的情况下,我们不会丢失任何槽信息,因为它们已经在备节点上维护。

              切换后,拓扑结构如下所示:

              现在,任何下游逻辑副本都可以重新指向新的主节点。

                postgres=# ALTER SUBSCRIPTION sub2 CONNECTION 'host=192.168.50.10 port=5432 dbname=postgres user=postgres password=vagrant'; ALTER SUBSCRIPTION

                复制将继续,pg_replication_slot信息可以证实这一点。


                总结+要点

                逻辑复制槽在概念上只能在主实例上使用,因为逻辑解码发生在主实例上。现在,有了这一改进,Patroni可以确保槽信息在standby状态下也可用,并且可以从订阅端那里接管连接。

                • 此解决方案需要PostgreSQL 11或更高版本,因为它使用pg_replication_slot_advance()函数来推进槽,该函数从PostgreSQL 11开始提供。

                • 下游连接可以使用HAProxy,这样连接将自动路由到主节点(本文未涉及)。不需要修改PostgreSQL代码或创建任何扩展。

                • 槽的复制是通过PostgreSQL协议(libpq)进行的,而不是任何特定于操作系统的工具/方法。Patroni 使用rewind
                  superuser
                  凭证。Patroni 使用pg_read_binary_file()函数读取槽信息。源代码参考

                • 在备节点创建逻辑槽后,Patroni使用pg_replication_slot_advance()向前更新槽。

                • 永久槽信息将添加到DCS,并由Patroni的主实例持续维护。引入了一个名为“status”的新DCS密钥,并支持所有DCS选项 (zookeeper, etcd, consul, etc.)。

                • 必须在需要维护逻辑复制槽的所有备节点上启用hot_standby_feedback

                • 必须启用Patroni参数postgresql.use_slots,以确保每个备节点使用主节点上的槽。





                推荐阅读
                • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
                • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
                • Linux如何安装Mongodb的详细步骤和注意事项
                  本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
                • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
                • 基于PgpoolII的PostgreSQL集群安装与配置教程
                  本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
                • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
                • Nginx使用(server参数配置)
                  本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
                • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
                • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
                  本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
                • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
                  转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
                • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
                • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
                • Oracle优化新常态的五大禁止及其性能隐患
                  本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
                • mac php错误日志配置方法及错误级别修改
                  本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
                • PDO MySQL
                  PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
                author-avatar
                九天0307_963
                这个家伙很懒,什么也没留下!