您正在查看过时的Debezium版本的文档。开云体育官方注册网址
如果您想查看本页最新的稳定版本,请前往在这里

PostgreSQL逻辑解码输出插件安装

本文档描述将数据更改流出所需的数据库设置开云体育电动老虎机PostgreSQL。的安装,以及应用于数据库本身的配置开云体育电动老虎机wal2json逻辑解码输出插件。安装和测试在以下环境/配置中执行:

对于其他Postgres和OS版本以及Debezium也支持的Decoderbufs逻辑解码插件,也需要采取类似的步骤。开云体育官方注册网址

从Debez开云体育官方注册网址ium 0.10开始,连接器支持使用PostgreSQL 10+逻辑复制流pgoutput。这意味着不再需要逻辑解码输出插件,连接器可以直接从复制流发出更改。

逻辑解码插件

逻辑解码是将数据库表的所有持久更改提取为一致的、易于理解的格式的过程,这种格式可以在不了解数据库内部状态的详细信息的情况下进行解释。开云体育电动老虎机

从PostgreSQL 9.4开始,逻辑解码是通过解码预写日志的内容来实现的,预写日志描述了存储级别上的更改,将其转换为特定于应用程序的形式,如元组流或SQL语句。在逻辑复制上下文中,插槽表示一个更改流,这些更改可以按照在源服务器上执行的顺序重播到客户机。每个插槽都从单个数据库传输一系列更改。开云体育电动老虎机输出插件将预写日志的内部表示形式中的数据转换为复制插槽使用者所需的格式。插件是用C语言编写、编译并安装在运行PostgreSQL服务器的机器上的,它们使用许多特定于PostgreSQL的apiPostgreSQL的文档

开云体育官方注册网址Debezium的PostgreSQL连接器与Debezium支持的逻辑解码插件之一一起工作,

对其中的更改进行编码Protobuf格式或JSON格式。

为了简单起见,Debezium还开云体育官方注册网址提供了一个基于vanilla的Docker映像PostgreSQL服务器映像在此基础上编译并安装插件。

Debe开云体育官方注册网址zium逻辑解码插件仅在其上安装和测试Linux机器。对于Windows和其他平台,可能需要不同的安装步骤

插件的区别

插件的行为在所有情况下都不完全相同。到目前为止,这些差异已经被确定

  • Wal2json插件不会对没有主键的表发出事件

  • Wal2json插件不支持特殊值()用于浮点类型

在测试套件中跟踪所有最新的差异Java类

关于逻辑解码和输出插件的更多信息可以在以下位置找到:

安装

在当前安装示例中,wal2json使用输出插件进行逻辑解码。wal2json输出插件为每个事务生成一个JSON对象。所有的新/旧元组都在JSON对象中可用。该插件编译安装是通过执行从开云体育官方注册网址Debezium docker镜像文件

执行命令前,请确保该用户具有写入权限wal2json库在PostgreSQL自由目录(在测试环境中,目录为:/usr/pgsql - 9.6 - / - lib/)。还要注意,安装过程需要使用PostgreSQL实用程序pg_config。验证路径设置环境变量,以便能够找到实用程序。如果没有,请更新路径适当的环境变量。例如,在测试环境中:

导出路径= " $路径:/ usr / pgsql - 9.6 / bin”
wal2json安装命令
$ git克隆https://github.com/eulerto/wal2json -b master——single-branch \ && CD wal2json \ && git checkout d2b7fef021c46e0d429f2c1768de361069e58696 \ && CD ..\ && rm -rf wal2json
wal2json安装输出
克隆到“wal2json”…remote:计数对象:445,完成。remote: Total 445 (delta 0), reuse 0 (delta 0), pack-reuse 445接收对象:100% (445/445),180.70 KiB | 0 bytes/s, done。解析增量:100%(317/317),完成。注意:检查'd2b7fef021c46e0d429f2c1768de361069e58696'。你处于“分离的头部”状态。您可以环顾四周,进行实验性更改并提交它们,您可以放弃在此状态下所做的任何提交,而不会通过执行另一次签出影响任何分支。如果您想创建一个新的分支来保留您创建的提交,您可以(现在或以后)再次使用-b和checkout命令。示例:git checkout -b new_branch_name HEAD is now at d2b7fef…改进样式gcc -Wall - wmiss -prototypes -Wpointer-arith -Wdeclaration-after-statement - wdif -labels - wmiss -format-attribute -Wformat-security - fnostrict -aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protect -strong——param=ssp-buffer-size=4 -grecord-gc -switches -m64 -mtune=generic -fPIC -I。 -I./ -I/usr/pgsql-9.6/include/server -I/usr/pgsql-9.6/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o wal2json.o wal2json.c gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC -L/usr/pgsql-9.6/lib -Wl,--as-needed -L/usr/lib64 -Wl,--as-needed -Wl,-rpath,'/usr/pgsql-9.6/lib',--enable-new-dtags -shared -o wal2json.so wal2json.o /usr/bin/mkdir -p '/usr/pgsql-9.6/lib' /usr/bin/install -c -m 755 wal2json.so '/usr/pgsql-9.6/lib/'

安装在Fedora 30+上

开云体育官方注册网址Debezium提供RPM包也适用于Fedora操作系统。这个包总是在最终的Debezium发行版完成后更新。开云体育官方注册网址要使用上述RPM,只需发出标准的Fedora安装命令:

$ sudo DNF -y安装postgres-decoderbufs

配置的其余部分与下面描述的相同wal2json插件。

PostgreSQL服务器配置

一旦wal2json已安装插件,需要配置数据库服务器。开云体育电动老虎机

设置库、WAL和复制参数

的末尾添加以下行postgresql.confPostgreSQL配置文件,以便在共享库中包含插件并进行一些调整细胞膜流复制设置。从中提取配置postgresql.conf.sample。您可能需要修改它,例如,如果您已经额外安装shared_preload_libraries

postgresql.conf ,配置文件参数设置
############ 复制  ############## # 模块shared_preload_libraries = ' wal2json '(1)#复制wal_level = logical(2)Max_wal_senders = 4(3)Max_replication_slots = 4(4)
1 告诉服务器它应该在启动时加载wal2json(使用decoderbufsprotobuf)逻辑解码插件(插件的名称设置在protobufwal2jsonmakefile)
2 告诉服务器它应该对预写日志使用逻辑解码
3. 告诉服务器它应该使用的最大值4处理WAL变更的独立进程
4 告诉服务器它应该允许的最大值4为流化WAL更改而创建的复制插槽

开云体育官方注册网址Debezium使用PostgreSQL的逻辑解码,它使用复制插槽。即使在Debezium中断期间,复制插槽也保证保留Debezium所需的所有WAL。开云体育官方注册网址因此,密切监视复制插槽非常重要,以避免过多的磁盘消耗和其他可能发生的情况,如Debezium插槽长时间未使用时的目录膨胀。开云体育官方注册网址有关更多信息,请参阅官方Postgres文档这个主题

我们强烈建议阅读和理解官方文件关于PostgreSQL预写日志的机制和配置。

设置复制权限

复制只能由具有相应权限的数据库用户执行,且只能对配置的主机数量进行复制。开云体育电动老虎机为了赋予用户复制权限,定义一个PostgreSQL角色至少复制登录权限。例如:

创建角色名

超级用户默认拥有上述两种角色。

的末尾添加以下行pg_hba.confPostgreSQL配置文件,以便配置客户端身份验证用于数据库复制。开云体育电动老虎机PostgreSQL服务器应该允许在服务器机器和运行Debezium PostgreSQL连接器的主机之间进行复制。开云体育官方注册网址

注意,身份验证指的是数据库超级用户开云体育电动老虎机postgres。如果其他用户使用复制登录已创建权限。

pg_hba.conf ,配置文件参数设置
############ 复制  ############## 本地复制postgres信任(1)主机复制启动127.0.0.1/32 trust(2)主机复制postgres::1/128 trust(3)
1 告诉服务器允许复制postgres本地(即在服务器机器上)
2 告诉服务器允许postgres本地主机接收复制更改使用IPV4
3. 告诉服务器允许postgres本地主机接收复制更改使用IPV6

看到PostgreSQL文档有关网络掩码的更多信息。

开云体育电动老虎机数据库测试环境设置

出于测试目的,一个名为开云体育电动老虎机测试使用一个名为test_table使用以下DDL命令创建:

开云体育电动老虎机数据库SQL命令用于创建测试数据库/表
创建数据库测试开云体育电动老虎机;CREATE TABLE test_table (id char(10) NOT NULL, code char(10), PRIMARY KEY (id));

解码输出插件测试

测试wal2json通过获取test_table使用pg_recvlogicalPostgreSQL客户端应用程序,控制PostgreSQL逻辑解码流。

在开始之前,请确保您已作为具有数据库复制权限的用户登录(如在开云体育电动老虎机前一步骤。否则,槽位创建和流处理将失败,并返回以下错误消息:

FATAL: no pg_hba.conf entry for replication connection from host "[local]", user "root", SSL off

在测试环境中,具有复制权限的用户为postgres

另外,确保路径环境变量的设置pg_recvlogical可以找到。如果没有,请更新路径适当的环境变量。例如,在测试环境中:

导出路径= " $路径:/ usr / pgsql - 9.6 / bin”
  • 创建插槽命名test_slot对于命名为开云体育电动老虎机测试,使用逻辑输出插件wal2json

$ pg_recvlogical -d test——slot test_slot——create-slot -P wal2json
  • 开始流式更改从逻辑复制插槽test_slot对于数据库开云体育电动老虎机测试

$ pg_recvlogical -d test——slot test_slot——start -o pretty-print=1 -f -
  • 执行一些基本的DML运营test_table触发插入/更新/删除更改事件

交互式PostgreSQL终端,SQL命令
INSERT INTO test_table (id, code) VALUES('id1', 'code1');INSERT 0 1 test=# update test_table set code='code2' where id='id1';delete from test_table where id='id1';删除1

插入更新删除事件,wal2json插件输出所捕获的表更改pg_recvlogical

输出插入事件
{“改变”:[{“类型”:“插入”、“模式”:“公众”,“表”:“test_table”、“columnnames”:“id”、“代码”,“columntypes”:[“字符(10)”、“角色(10)"], "columnvalues": ["id1 ", "code1 "]}]}
输出更新事件
{“改变”:[{“类型”:“更新”、“模式”:“公众”,“表”:“test_table”、“columnnames”:“id”、“代码”,“columntypes”:[“字符(10)”、“角色(10)”,“columnvalues”:“id1”、“code2”,“oldkeys”:{“keynames”:“id”,“keytypes”:[“字符(10)”], "keyvalues": ["id1 "]}}]}
输出删除事件
{“改变”:[{“类型”:“删除”,“模式”:“公众”,“表”:“test_table”、“oldkeys”:{“keynames”:“id”,“keytypes”:["字符(10)"], "keyvalues": ["id1 "]}}]}

注意副本的身份桌子上的test_table设置为默认的

当测试结束时,插槽test_slot对于数据库开云体育电动老虎机测试可通过以下命令删除:

$ pg_recvlogical -d test——slot test_slot——drop-slot

副本的身份,是一个特定于PostgreSQL的表级设置,它决定了在情况下可用于逻辑解码的信息量更新删除事件。

有4个可能的值副本的身份

  • 默认的-更新删除事件将只包含表的主键列的先前值

  • 没有什么-更新删除事件将不包含关于任何表列上一个值的任何信息

  • 完整的-更新删除事件将包含表中所有列的先前值

  • 指数索引名称-更新删除事件将包含命名的索引定义中包含的列的先前值索引名称

您可以对副本进行修改和检查副本的身份对于使用以下命令的表:

ALTER TABLE test_tabletest=# \d+ test_table表“public”。test_table" Column | Type | Modifiers | Storage | Stats target | Description -------+---------------+-----------+----------+--------------+------------ id | character(10) | not null | extended | | code | character(10) | | extended | | Indexes: "test_table_pkey" PRIMARY KEY, btree (id) Replica Identity: FULL

这是的输出wal2json插件更新事件和副本的身份设置为完整的。与…相比各自的输出副本的身份设置为默认的

' UPDATE '的输出
{“改变”:[{“类型”:“更新”、“模式”:“公众”,“表”:“test_table”、“columnnames”:“id”、“代码”,“columntypes”:[“字符(10)”、“角色(10)”,“columnvalues”:“id1”、“code2”,“oldkeys”:{“keynames”:“id”、“代码”,“keytypes”:[“字符(10)”,“性格”(10), "keyvalues": ["id1 ", "code1 "]}}]}