我有一个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使用rewind
或superuser
凭证。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
,以确保每个备用节点都使用主节点上的一个槽位。