配置 Wal2json
IBM Cloud® Databases for PostgreSQL 部署支持 wal2json 插件,可在部署上启用 逻辑解码。 该插件在 PostgreSQL 版本 9.6 和 10 上已被弃用,仅在 PostgreSQL 版本 11 和 12 上受支持。 该插件已经安装,但您必须配置部署和数据库才能使用它。
-
首先,您需要 配置
wal_level
、max_replication_slots
和max_wal_senders
设置。 将wal_level
改为logical
。max_replication_slots
和max_wal_senders
都需要设置为大于 20 的值。Databases for PostgreSQL为当前和未来的运行目的保留 20 个复制插槽和 WAL 发送器。curl -X PATCH https://api.{region}.databases.cloud.ibm.com/v4/ibm/deployments/{id}/configuration -H 'Authorization: Bearer <>' -H 'Content-Type: application/json' -d '{"configuration": { "wal_level": "logical", "max_replication_slots": 21, "max_wal_senders": 21 } }'
-
为
repl
用户 设置密码。 可以使用 Cloud Databases CLI 插件cdb deployment-user-password
命令或 Cloud Databases API/deployments/{id}/users/{username}
端点更改任何用户的密码。repl
用户拥有 REPLICATION 权限,您为其设置密码后,wal2json
插件就会使用该用户。 -
通过 Cloud Databases API 在数据库上创建复制插槽。 向
/deployments/{id}/postgresql/logical_replication_slots
端点发送 POST 请求。curl -X POST https://api.{region}.databases.cloud.ibm.com/v4/ibm/deployments/{id}/postgresql/logical_replication_slots -H 'Authorization: Bearer <>' -H 'Content-Type: application/json' -d '{"logical_replication_slot": { "name": "<slot_name>", "database_name": "<database_name>", "plugin_type": "wal2json" } }'
插件类型必须是
wal2json
。 数据库必须是现有的数据库。 插槽名称只能包含小写字母、数字和下划线字符。 您可以通过连接任何数据库并运行SELECT * FROM pg_replication_slots WHERE slot_name = '<slot_name>';
-
要测试插件,请从命令行运行
pg_recvlogical
。 该命令在安装 PostgreSQL 时可用。 使用部署中的主机和端口,以及通过 API 创建的数据库和插槽名称、PGSSLMODE=require pg_recvlogical -d <DATABASE NAME> -U repl -h <HOST> -p <PORT> --slot <SLOT NAME> --start -o pretty-print=1 -f -
-
在
ibmclouddb
上创建一个表格,并插入一些数据。 确保在运行pg_recvlogical
的命令行中进行插入。不显示创建表格。
Wal2json 注意事项和提示
-
将
wal_level
设置为logical
会增加 WAL 文件的大小,因为 PostgreSQL 需要更多数据来完成逻辑解码。 如果您不使用wal2json
,请将wal_level
保留为默认值。 较大的 WAL 文件可能意味着需要更多的磁盘空间。 写入吞吐量会降低,复制滞后会影响高可用性和只读复制,从备份恢复的时间也会延长。 -
逻辑解码对复制的内容有一系列限制。 其中包括模式/DDL、序列、TRUNCATE 和大型对象。
-
当发生受控 HA 切换时,复制事件可能会交付不止一次。 下游应用程序必须能够处理多次传送的事件。
-
如果您创建了一个逻辑复制槽,而消费者没有连接并消费更改,那么您的部署就有可能耗尽磁盘空间。 复制槽会告诉 PostgreSQL 保存所有包含用户所需的更改的事务日志。 如果没有任何东西在消耗这些更改,PostgreSQL 将继续收集这些更改,直到磁盘空间耗尽为止。 您可以使用 IBM Cloud® Monitoring 集成来监控磁盘空间。 如果空间用完,可以 升级磁盘,这样就可以启动数据库。 然后,您就可以开始消费更改或放弃插槽了。
-
您可以检查特定复制插槽使用了多少磁盘空间,以及该复制插槽是否有活动用户。 使用
admin
用户运行以下命令之一:PostgreSQL 10.x和更新版本
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS lag, active from pg_replication_slots WHERE slot_type='logical';
PostgreSQL 9.x
SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS lag, active FROM pg_replication_slots WHERE slot_type='logical';
如果发现部署的磁盘使用率高于预期,请检查复制插槽是否有消费者,以及部署的磁盘空间是否用完,以排除故障。