Debezium 可以从以下 TimescaleDB 函数捕获事件:
这三个功能是内部依赖的。每个函数都是基于 PostgreSQL 功能构建的,用于在表中存储数据。 Debezium 不同程度地支持所有这三个功能。
SMT 需要访问 TimescaleDB 元数据。由于 SMT 无法访问连接器级别的数据库配置,因此必须显式定义转换的配置元数据。
Hypertable是一个用于存储时间序列数据的逻辑表。数据根据定义的时间限制列进行分块(分区)。 TimescaleDB 在其内部模式中创建一个或多个物理表,每个表代表一个块。默认情况下,连接器捕获每个块表中的更改,并将更改流式传输到与每个块对应的各个主题。 Timescaledb 转换重新组合来自单独主题的数据,然后将重新组合的数据流式传输到单个主题。
示例:从超表流式传输数据
以下示例显示了用于在公共模式中创建条件超表的 SQL 命令:
CREATE TABLE conditions (time TIMESTAMPTZ NOT NULL, location TEXT NOT NULL, temperature DOUBLE PRECISION NULL, humidity DOUBLE PRECISION NULL);
SELECT create_hypertable('conditions', 'time');
Timescaledb SMT 将超表中捕获的更改事件路由到名为 timescaledb.public.conditions 的主题。该转换使用您在配置中定义的标头来丰富事件消息。例如:
__debezium_timescaledb_chunk_table: _hyper_1_1_chunk
__debezium_timescaledb_chunk_schema: _timescaledb_internal
连续聚合对存储在超表中的数据提供自动统计计算。聚合视图由其自己的超表支持,而该超表又由一组 PostgreSQL 表支持。可以自动或手动重新计算聚合。重新计算聚合后,新值将存储在超表中,可以从中捕获和流式传输这些值。来自聚合的数据根据存储的块流式传输到不同的主题。 Timescaledb 转换重新组合流式传输到不同主题的数据并将其路由到单个主题。
示例:从连续聚合流式传输数据
以下示例显示了用于在公共架构中创建连续聚合conditions_summary 的SQL 命令。
CREATE MATERIALIZED VIEW conditions_summary WITH (timescaledb.continuous) AS
SELECT
location,
time_bucket(INTERVAL '1 hour', time) AS bucket,
AVG(temperature),
MAX(temperature),
MIN(temperature)
FROM conditions
GROUP BY location, bucket;
TimescaleDB SMT 将聚合中捕获的更改事件路由到名为 timescaledb.public.conditions_summary 的主题。该转换使用您在配置中定义的标头来丰富事件消息。例如:
_debezium_timescaledb_chunk_table: _hyper_2_2_chunk
__debezium_timescaledb_chunk_schema: _timescaledb_internal
__debezium_timescaledb_hypertable_table: _materialized_hypertable_2
__debezium_timescaledb_hypertable_schema: _timescaledb_internal
TimescaleDB SMT 不对压缩函数应用任何特殊处理。压缩块将原样转发到管道中的下一个下游作业,以便根据需要进行进一步处理。通常,带有压缩块的消息会被丢弃,并且不会被管道中的后续作业处理。
Debezium 使用复制槽来捕获来自 TimescaleDB 和 PostgreSQL 的更改。复制槽 数据以多种消息格式存储数据。通常,最好将 Debezium 配置为使用 pgoutput 解码器(TimescaleDB 实例的默认解码器)从槽中读取。
要配置复制槽,请在 postgresql.conf 文件中指定以下内容:
# REPLICATION
wal_level = logical
要配置表进行复制,您必须创建一个发布,如以下示例所示:
CREATE PUBLICATION dbz_publication FOR ALL TABLES WITH (publish = 'insert, update')
您可以全局创建发布(如前面的示例所示),也可以为每个表创建单独的发布。由于 TimescaleDB 会根据需要自动创建表,因此强烈建议使用全局发布。
配置 TimescaleDB SMT 的方式与配置 PostgreSQL 连接器的方式相同。要使连接器能够正确处理来自 TimescaleDB 的事件,请将以下选项添加到连接器配置中:
"transforms": "timescaledb",
"transforms.timescaledb.type": "io.debezium.connector.postgresql.transforms.timescaledb.TimescaleDb",
"transforms.timescaledb.database.hostname": "timescaledb",
"transforms.timescaledb.database.port": "...",
"transforms.timescaledb.database.user": "...",
"transforms.timescaledb.database.password": "...",
"transforms.timescaledb.database.dbname": "..."
以下示例显示了用于设置 PostgreSQL 连接器的配置,以连接到端口 5432(192.168.99.100)上逻辑名称为 dbserver1 的 TimescaleDB 服务器。通常,您可以通过设置连接器可用的配置属性在 JSON 文件中配置 Debezium PostgreSQL 连接器。
您可以选择为数据库中的架构和表的子集生成事件。或者,您可以忽略、屏蔽或截断包含敏感数据、超出指定大小或不需要的列。
{
"name": "timescaledb-connector", 1
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector", 2
"database.hostname": "192.168.99.100", 3
"database.port": "5432", 4
"database.user": "postgres", 5
"database.password": "postgres", 6
"database.dbname" : "postgres", 7
"topic.prefix": "dbserver1", 8
"plugin.name": "pgoutput", 9
"schema.include.list": "_timescaledb_internal", 10
"transforms": "timescaledb", 11
"transforms.timescaledb.type": "io.debezium.connector.postgresql.transforms.timescaledb.TimescaleDb", 12
"transforms.timescaledb.database.hostname": "timescaledb", 13
"transforms.timescaledb.database.port": "5432", 14
"transforms.timescaledb.database.user": "postgres", 15
"transforms.timescaledb.database.password": "postgres", 16
"transforms.timescaledb.database.dbname": "postgres" 17
}
}
下表列出了您可以为 TimescaleDB 集成 SMT 设置的配置选项。
表 1. TimescaleDB 集成 SMT (TimescaleDB) 配置选项
属性 | 默认值 | 描述符 |
---|---|---|
database.hostname | No default | TimescaleDB 数据库服务器的 IP 地址或主机名。 |
database.port | 5432 | TimescaleDB 数据库服务器的整数端口号。 |
database.user | No default | 用于连接到 TimescaleDB 数据库服务器的 TimescaleDB 数据库用户的名称。 |
database.password | No default | 连接到 TimescaleDB 数据库服务器时使用的密码。 |
database.dbname | No default | 从中进行流式传输的 TimescaleDB 数据库的名称发生变化。 |
schema.list | _timescaledb_internal | 包含 TimescaleDB 原始(内部)数据表的以逗号分隔的架构名称列表。 SMT 仅处理源自列表中模式之一的那些更改。 |
target.topic.prefix | timescaledb | TimescaleDB 事件路由到的主题的命名空间(前缀)。 SMT 将消息路由到名为“.._ |