一、TimescaleDB
- TimescaleDB 是一个开源的数据库,专门设计用于高效地处理时间序列数据。它是基于 PostgreSQL 构建的,添加了时间序列特定的功能和优化。TimescaleDB 的设计目标是处理大量的时间戳数据,因此适用于物联网、实时分析和监控系统等应用场景。它提供自动分区、压缩和原生支持时间序列函数等功能,以实现对时间序列数据的快速和高效查询。
二、采集TimescaleDB
- Debezium PostgreSQL 连接器可以捕获来自 TimescaleDB 的数据更改。标准 PostgreSQL 连接器从数据库读取原始数据。然后,您可以使用 io.debezium.connector.postgresql.transforms.timescaledb.TimescaleDb 转换来处理原始数据、执行逻辑路由并添加相关元数据。
Debezium 可以从以下 TimescaleDB 函数捕获事件:
- 超级表
- 连续聚集体
- 压缩
这三个功能是内部依赖的。每个函数都是基于 PostgreSQL 功能构建的,用于在表中存储数据。 Debezium 不同程度地支持所有这三个功能。
SMT 需要访问 TimescaleDB 元数据。由于 SMT 无法访问连接器级别的数据库配置,因此必须显式定义转换的配置元数据。
三、超级表
Hypertable是一个用于存储时间序列数据的逻辑表。数据根据定义的时间限制列进行分块(分区)。 TimescaleDB 在其内部模式中创建一个或多个物理表,每个表代表一个块。默认情况下,连接器捕获每个块表中的更改,并将更改流式传输到与每个块对应的各个主题。 Timescaledb 转换重新组合来自单独主题的数据,然后将重新组合的数据流式传输到单个主题。
- 该转换可以访问 TimescaleDB 元数据来获取块/超表映射。
- 该转换将捕获的事件从其特定于块的主题重新路由到根据以下模式命名的单个逻辑主题:..
- 该转换将以下标头添加到事件中: __debezium_timescaledb_chunk_table存储事件数据的物理表的名称。
- __debezium_timescaledb_chunk_schema 物理表所属模式的名称。
示例:从超表流式传输数据 以下示例显示了用于在公共模式中创建条件超表的 SQL 命令:
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 的主题。该转换使用您在配置中定义的标头来丰富事件消息。例如:
bash
__debezium_timescaledb_chunk_table: _hyper_1_1_chunk
__debezium_timescaledb_chunk_schema: _timescaledb_internal
四、连续聚集体
连续聚合对存储在超表中的数据提供自动统计计算。聚合视图由其自己的超表支持,而该超表又由一组 PostgreSQL 表支持。可以自动或手动重新计算聚合。重新计算聚合后,新值将存储在超表中,可以从中捕获和流式传输这些值。来自聚合的数据根据存储的块流式传输到不同的主题。 Timescaledb 转换重新组合流式传输到不同主题的数据并将其路由到单个主题。
- 该转换可以访问 TimescaleDB 元数据来获取块和超表之间以及超表和聚合之间的映射。
- 该转换将捕获的事件从其特定于块的主题重新路由到根据以下模式 .. 命名的单个逻辑主题。
- 该转换将以下标头添加到事件中: __debezium_timescaledb_hypertable_table:存储连续聚合的超表的名称。 __debezium_timescaledb_hypertable_schema:超表所属模式的名称。 __debezium_timescaledb_chunk_table:存储连续聚合的物理表的名称 __debezium_timescaledb_chunk_schema:物理表所属模式的名称。
示例:从连续聚合流式传输数据 以下示例显示了用于在公共架构中创建连续聚合conditions_summary 的SQL 命令。
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 的主题。该转换使用您在配置中定义的标头来丰富事件消息。例如:
makefile
_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 不对压缩函数应用任何特殊处理。压缩块将原样转发到管道中的下一个下游作业,以便根据需要进行进一步处理。通常,带有压缩块的消息会被丢弃,并且不会被管道中的后续作业处理。
六、TimescaleDB配置
Debezium 使用复制槽来捕获来自 TimescaleDB 和 PostgreSQL 的更改。复制槽 数据以多种消息格式存储数据。通常,最好将 Debezium 配置为使用 pgoutput 解码器(TimescaleDB 实例的默认解码器)从槽中读取。
要配置复制槽,请在 postgresql.conf 文件中指定以下内容:
bash
# REPLICATION
wal_level = logical
- 指示服务器对预写日志使用逻辑解码。
要配置表进行复制,您必须创建一个发布,如以下示例所示:
sql
CREATE PUBLICATION dbz_publication FOR ALL TABLES WITH (publish = 'insert, update')
您可以全局创建发布(如前面的示例所示),也可以为每个表创建单独的发布。由于 TimescaleDB 会根据需要自动创建表,因此强烈建议使用全局发布。
七、连接器配置
配置 TimescaleDB SMT 的方式与配置 PostgreSQL 连接器的方式相同。要使连接器能够正确处理来自 TimescaleDB 的事件,请将以下选项添加到连接器配置中:
bash
"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 连接器。
您可以选择为数据库中的架构和表的子集生成事件。或者,您可以忽略、屏蔽或截断包含敏感数据、超出指定大小或不需要的列。
bash
{
"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
}
}
- 注册到 Kafka Connect 服务时连接器的名称。
- 此 PostgreSQL 连接器类的名称。
- TimescaleDB 服务器的地址。
- TimescaleDB 服务器的端口号。
- TimescaleDB 用户的名称。
- TimescaleDB 的密码。
- 要连接到的 TimescaleDB 数据库的名称。
- TimescaleDB 服务器或集群的主题前缀。该前缀形成一个命名空间,当使用 Avro 转换器时,该前缀用于连接器写入的所有 Kafka 主题的名称、Kafka Connect 模式名称以及相应 Avro 模式的命名空间。
- 表示使用pgoutput逻辑解码插件。
- 包含 TimescaleDB 物理表的所有架构的列表。
- 使 SMT 能够处理原始 TimescaleDB 事件。
- 使 SMT 能够处理原始 TimescaleDB 事件。
- 提供 SMT 的 TimescaleDB 连接信息。这些值必须与第 3 - 7 项的值匹配。
九、配置选项
下表列出了您可以为 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 将消息路由到名为".._<hypertable"的主题 |