Debezium与RDS postgres和主-副本故障转移



我有一个RDS多az postgres数据库(主备),我正在研究Debezium将更改流式传输到Kafka。

我正在阅读关于故障转移可能出现的问题的文档:https://debezium.io/documentation/reference/1.1/connectors/postgresql.html#_cluster_failures,它看起来像一个相当可怕的场景。

从我使用故障转移重新启动所做的一些测试中可以看出,当端点从主服务器更改为备用服务器时,Debezium连接器保持工作并自动在备用服务器上创建复制槽。但据我所知,除非您能确保在写入新数据之前创建新主(旧备用)上的复制槽,否则无法保证不会丢失数据。

有人有这种设置的经验吗?在故障转移的情况下,您如何管理事情?

截至2022年,Percona中描述了在该领域使用Patroni的一些新进展博客:Patroni如何解决PostgreSQL集群中逻辑复制槽故障转移的问题

上述方法的要点:

  • 此解决方案需要PostgreSQL 11或以上版本,因为它使用了pg_replication_slot_advance()函数,该函数从PostgreSQL 11开始可用,用于推进槽位。
  • 下游连接可以使用HAProxy,这样连接将自动路由到主服务器(本文不涉及)。不需要修改PostgreSQL代码或创建任何扩展。
  • 槽的复制发生在PostgreSQL协议(libpq)上,而不是任何特定于操作系统的工具/方法。Patroni使用rewindsuperuser凭证。Patroni使用pg_read_binary_file()函数读取槽位信息
  • 在副本端创建逻辑槽后,Patroni使用pg_replication_slot_advance()将该槽向前移动。
  • 永久槽位信息将被添加到DCS中,并由Patroni的主实例持续维护。引入了一个名为"status"的新DCS密钥,并支持所有DCS选项(zookeeper、etcd、consul等)。
  • hot_standby_feedback必须在所有需要维护逻辑复制槽位的备节点上启用。
  • 必须启用Patroni参数postgresql.use_slots,以确保每个备用节点都使用主节点上的一个槽位。

最新更新