本文将会为您介绍如何订阅Hologres Binlog。
注意事项
在Hologres中订阅Hologres Binlog需要注意如下事项:
- 仅Hologres V0.9及以上版本支持订阅Hologres Binlog,如果您的实例是V0.9以下版本,请您提交工单或加入在线支持钉钉群申请升级实例,加入在线支持钉钉群请参见如何获取更多的在线支持?。
- Hologres支持单表级别的Binlog功能,支持行存表和列存表。当前订阅Hologres Binlog支持的情况如下表。
Flink分类 Hologres行存表Binlog Hologres列存表Binlog Hologres行列共存表Binlog(从Hologres V1.1版本开始支持) 实时计算Blink 支持 支持 支持 全托管Flink VVP-2.4支持 VVP-2.4支持 VVP-2.4支持 开源Flink 不支持 不支持 不支持 JDBC Hologres V1.1版本开始支持 Hologres V1.1版本开始支持 Hologres V1.1版本开始支持
开启Binlog
- 功能简介
Hologres中,Binlog功能默认关闭,您可以通过设置表属性binlog.level和binlog.ttl开启该功能。如果您对表格的更新比较频繁,理论上列存表开启Binlog功能的成本要大于行存表。因此,建议您使用行存表开启Binlog功能。
- 使用限制
- Hologres V0.9以及V0.10版本,已存在的表无法修改表属性开启Binlog,需重新建表。从V1.1版本开始,可以按需开启Binlog。
- Blink消费Hologres Binlog暂不支持Hologres的TIMESTAMP类型,在Hologres建表时,请使用TIMESTAMPTZ类型。同时也不支持SMALLINT等特殊类型。
- 不支持消费分区表父表的Binlog,请使用普通表(非分区表)。
- 对于更新频繁的场景,理论上列存表开启Binlog的开销要大于行存表的开销,所以建议使用行存表开启Binlog。
- 使用示例
您可以在创建表的时候设置表属性binlog.level和binlog.ttl开启Binlog功能。更多关于创建表的参数说明,请参见CREATE TABLE。
begin; create table test_message_src( id int primary key, title text not null, body text); call set_table_property('test_message_src', 'orientation', 'row');--创建行存表test_message_src call set_table_property('test_message_src', 'clustering_key', 'id');--在id列建立聚簇索引 call set_table_property('test_message_src', 'binlog.level', 'replica');--设置表属性开启Binlog功能 call set_table_property('test_message_src', 'binlog.ttl', '86400');--binlog.ttl,Binlog的TTL,单位为秒 commit;
参数 说明 binlog.level 是否开启Binlog,可选择: - replica:开启。
- none:关闭。
binlog.ttl Binlog的TTL,单位秒。默认为30天,即默认值为2592000。
按需开启Binlog
从Hologres V1.1版本开始,可以根据业务需要选择开启/关闭Binlog能力,同时支持配置TTL满足不同业务场景对Binlog保留时间的诉求。
说明 以下功能仅针对Hologres V1.1及以上版本,如果您的实例是V1.1以下版本,请您提交工单或加入在线支持钉钉群申请升级实例。
- 开启Binlog
可以使用以下语句对已有表开启Binlog并设置Binlog TTL时间。
table_name为开启Binlog的表名称。-- 设置表属性开启Binlog功能 begin; call set_table_property('<table_name>', 'binlog.level', 'replica'); commit; -- 设置表属性,配置Binlog TTL时间,单位秒 begin; call set_table_property('<table_name>', 'binlog.ttl', '2592000'); commit;
- 关闭Binlog
可以使用以下语句对已开启Binlog的表关闭Binlog。
table_name为需要关闭Binlog的表名称。-- 设置表属性关闭Binlog功能 begin; call set_table_property('<table_name>', 'binlog.level', 'none'); commit;
- 修改Binlog的TTL
通过以下语句可以对已开启Binlog的表修改TTL,满足业务对Binlog不同保留时间的诉求。
table_name为修改Binlog TTL的表名称。begin; call set_table_property('<table_name>', 'binlog.ttl', '8640000'); --单位秒 commit;
Binlog格式说明
Binlog字段由Binlog系统字段和用户Table字段组成,具体字段定义如下表。
字段名称 | 字段类型 | 说明 |
---|---|---|
hg_binlog_lsn | BIGINT | Binlog的系统字段,表示Binlog序号。Shard内部单调递增不保证连续,不同Shard之间不保证唯一和有序。 |
hg_binlog_event_type | BIGINT | Binlog的系统字段,表示当前Record所表示的修改类型。 |
hg_binlog_timestamp_us | BIGINT | Binlog的系统字段,系统时间戳,单位为us。 |
user_table_column_1 | 用户自定义 | 用户Table字段。 |
... | ... | ... |
user_table_column_n | 用户自定义 | 用户Table字段。 |
- hg_binlog_event_type有如下五种可能的取值:
- INSERT=5,表示当前Binlog为插入一条新的记录。
- DELETE=2,表示当前Binlog为删除一条已有的记录。
- BEFORE_UPDATE=3,表示当前Binlog为一条已有记录其更新前的记录。
- AFTER_UPDATE=7,表示当前Binlog为一条已有记录其更新后的记录。
- HEARTBEAT_LOG_EVENT= 27,表示当前Shard截止到hg_binlog_timestamp_us的Binlog均已消费完毕(仅当JDBC和Holo-Client消费Binlog,且设置GUC:
hg_experimental_enable_binlog_heartbeat_record=on
时有效),详情请参见通过JDBC消费Hologres Binlog(Beta)。
- UPDATE操作会产生两条Binlog记录,分别为更新前和更新后的记录。订阅Binlog功能会保证这两条记录是连续的且更新前的Binlog记录在前,更新后的Binlog记录在后。
- 用户字段的顺序与DDL定义的顺序一致。
查询Binlog
Hologres表的Binlog是一种强Schema格式的数据,如果要查询某个表的Binlog,可以使用Binlog内置额外字段与表原有字段组合的方式查询Binlog。查询test_message_src表Binlog的示例如下。
select hg_binlog_lsn,hg_binlog_event_type,hg_binlog_timestamp_us,* from test_message_src;
查询结果示例如下。
实时消费Hologres Binlog
当前支持通过Flink、Blink以及JDBC(包括Holo Client)消费Hologres Binlog,详情请参见文档:
- Flink和Blink实时消费Binlog,请参见Flink/Blink实时消费Hologres Binlog。
- 有关JDBC如何实时消费Binlog,请参见通过JDBC消费Hologres Binlog(Beta)。