逻辑解码
适用于: Azure Database for PostgreSQL 单一服务器
重要
Azure Database for PostgreSQL - 单一服务器即将停用。 我们强烈建议升级到 Azure Database for PostgreSQL 灵活服务器。 若要详细了解如何迁移到 Azure Database for PostgreSQL 灵活服务器,请参阅 Azure Database for PostgreSQL 单一服务器的最新动态。
使用 PostgreSQL 中的逻辑解码可将数据更改流式传输到外部使用者。 逻辑解码广泛用于事件流和变更数据捕获方案。
逻辑解码使用一个输出插件将 Postgres 的预写日志 (WAL) 转换为可读格式。 Azure Database for PostgreSQL 提供以下输出插件:wal2json、test_decoding 和 pgoutput。 pgoutput 由 PostgreSQL 10 及更高版本中的 PostgreSQL 提供。
有关 Postgres 逻辑解码工作原理的概述,请访问我们的博客。
注意
Azure Database for PostgreSQL 单一服务器不支持使用 PostgreSQL 发布/订阅的逻辑复制。
设置服务器
逻辑解码和只读副本都依赖于 Postgres 预写日志 (WAL) 来获取信息。 这两个功能需要使用来自 Postgres 的不同级别的日志记录。 逻辑解码需要的日志记录的级别比只读副本需要的更高。
若要配置正确的日志记录级别,请使用 Azure 复制支持参数。 Azure 复制支持有三个设置选项:
- 关闭 - 在 WAL 中包含最少的信息。 大多数 Azure Database for PostgreSQL 服务器上都不提供此设置。
- 副本 - 比“关闭”详细。 这是运行只读副本所需的最低日志记录级别。 此设置是大多数服务器上的默认设置。
- 逻辑 - 比“副本”详细。 这是运行逻辑解码所需的最低日志记录级别。 使用此设置时,只读副本也可以运行。
使用 Azure CLI
将 azure.replication_support 设置为
logical
。az postgres server configuration set --resource-group mygroup --server-name myserver --name azure.replication_support --value logical
重启服务器以应用更改。
az postgres server restart --resource-group mygroup --name myserver
如果运行的是 Postgres 9.5 或 9.6,并使用公共网络访问,请添加防火墙规则以包括你将从中运行逻辑复制的客户端的公共 IP 地址。 防火墙规则名称必须包括“_replrule”。 例如,“test_replrule”。 若要在服务器上创建新的防火墙规则,请运行 az postgres server firewall-rule create 命令。
使用 Azure 门户
将 Azure 复制支持设置为“逻辑”。 选择“保存” 。
通过选择“是”,重启服务器以应用更改。
如果运行的是 Postgres 9.5 或 9.6,并使用公共网络访问,请添加防火墙规则以包括你将从中运行逻辑复制的客户端的公共 IP 地址。 防火墙规则名称必须包括“_replrule”。 例如,“test_replrule”。 再选择“保存”。
开始逻辑解码
可以通过流式处理协议或 SQL 接口使用逻辑解码。 这两种方法都使用复制槽。 槽表示来自单一数据库的更改流。
使用复制槽需要 Postgres 的复制特权。 目前,复制特权仅适用于服务器的管理员用户。
流式处理协议
我们通常倾向于通过流式处理协议使用更改。 你可以创建自己的使用者/连接器,或者使用 Debezium 之类的工具。
请访问 wal2json 文档,查看将流式处理协议与 pg_recvlogical 配合使用的示例。
SQL 接口
以下示例将 SQL 接口与 wal2json 插件配合使用。
创建槽。
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
发出 SQL 命令。 例如:
CREATE TABLE a_table ( id varchar(40) NOT NULL, item varchar(40), PRIMARY KEY (id) ); INSERT INTO a_table (id, item) VALUES ('id1', 'item1'); DELETE FROM a_table WHERE id='id1';
使用更改。
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
输出如下所示:
{ "change": [ ] } { "change": [ { "kind": "insert", "schema": "public", "table": "a_table", "columnnames": ["id", "item"], "columntypes": ["character varying(40)", "character varying(40)"], "columnvalues": ["id1", "item1"] } ] } { "change": [ { "kind": "delete", "schema": "public", "table": "a_table", "oldkeys": { "keynames": ["id"], "keytypes": ["character varying(40)"], "keyvalues": ["id1"] } } ] }
用完槽后,请将其删除。
SELECT pg_drop_replication_slot('test_slot');
监视槽
必须监视逻辑解码。 必须删除任何未使用的复制槽。 在使用者读取更改之前,槽会一直保存到 Postgres WAL 日志和相关的系统目录。 如果使用者失败或者未经正确配置,则未使用的日志将不断堆积,直至填满存储。 此外,未使用的日志会增大事务 ID 换行的风险。 这两种情况可能会导致服务器不可用。 因此,逻辑复制槽被持续使用是至关重要的。 如果不再使用某个逻辑复制槽,请立即将其删除。
pg_replication_slots 视图中的“active”列指示是否有使用者连接到某个槽。
SELECT * FROM pg_replication_slots;
请针对“已用存储”和“副本的最大滞后时间”指标设置警报,以便在值超过正常阈值时收到通知。
重要
必须删除未使用的复制槽。 否则可能会导致服务器不可用。
如何删除槽
如果你未积极使用某个复制槽,应将其删除。
若要使用 SQL 删除名为 test_slot
的复制槽:
SELECT pg_drop_replication_slot('test_slot');
重要
如果停止使用逻辑解码,请将 azure.replication_support 改回到 replica
或 off
。 通过 logical
保留的 WAL 详细信息更详尽,应在逻辑解码未在使用时被禁用。