IBM Cloud Docs
配置 Wal2json

配置 Wal2json

IBM Cloud® Databases for PostgreSQL 部署支持 wal2json 插件,可在部署上启用 逻辑解码。 该插件在 PostgreSQL 版本 9.6 和 10 上已被弃用,仅在 PostgreSQL 版本 11 和 12 上受支持。 该插件已经安装,但您必须配置部署和数据库才能使用它。

  1. 首先,您需要 配置wal_levelmax_replication_slotsmax_wal_senders 设置。 将 wal_level 改为 logicalmax_replication_slotsmax_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
            }
          }'
    
  2. repl 用户 设置密码。 可以使用 Cloud Databases CLI 插件 cdb deployment-user-password 命令或 Cloud Databases API /deployments/{id}/users/{username} 端点更改任何用户的密码。 repl 用户拥有 REPLICATION 权限,您为其设置密码后,wal2json 插件就会使用该用户。

  3. 通过 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>';
    
  4. 要测试插件,请从命令行运行 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 -
    
  5. 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';
    

如果发现部署的磁盘使用率高于预期,请检查复制插槽是否有消费者,以及部署的磁盘空间是否用完,以排除故障。