订阅Hologres Binlog

本文将会为您介绍如何订阅Hologres Binlog。

使用限制

在Hologres中订阅Hologres Binlog需要注意如下事项:

  • 仅Hologres V0.9及以上版本支持订阅Hologres Binlog,如果您的实例是V0.9以下版本,请您使用自助升级或加入实时数仓Hologres交流群(钉钉群号:32314975)申请升级实例。加入在线支持钉钉群请参见如何获取更多的在线支持?

  • Hologres V0.9以及V0.10版本,已存在的表无法修改表属性开启Binlog,需重新建表。从V1.1版本开始,可以按需开启Binlog。

  • Hologres V1.3.14和V1.1.82之前的版本仅支持Superuser消费Binlog,如果使用其他低权限账号消费Binlog会出现没有权限的报错:permission denied for table hg_replication_slot_properties。从Hologres V1.3.14和V1.1.82版本开始,若使用Flink消费Binlog,仅需账号具备查询表的权限即可。对于使用JDBC消费Hologres Binlog需要账号在Replication Role中。

  • Hologres支持单表级别的Binlog功能,支持行存表和列存表。当前订阅Hologres Binlog支持的情况如下表。

    Flink分类

    Hologres行存表Binlog

    Hologres列存表Binlog

    Hologres行列共存表Binlog(从Hologres V1.1版本开始支持)

    实时计算Blink

    支持

    支持

    支持

    全托管Flink

    支持

    支持

    支持

    开源Flink

    不支持

    不支持

    不支持

    JDBC

    Hologres V1.1版本开始支持

    Hologres V1.1版本开始支持

    Hologres V1.1版本开始支持

  • Blink消费Hologres Binlog暂不支持Hologres的TIMESTAMP类型,在Hologres建表时,请使用TIMESTAMPTZ类型。同时也不支持SMALLINT等特殊类型。

  • 不支持消费分区表父表的Binlog,请使用分区子表或者普通表(非分区表)。Hologres从 V1.3.24版本开始,支持按需修改分区子表的Binlog TTL,若是没有显示指定分区子表的Binlog TTL,则与父表的Binlog TTL保持一致。同时需要注意Binlog TTL不是精准的时间,系统不会强保证Binlog到期后立马删除Binlog,将会在过期后的某个时间删除。

  • 对于更新频繁的场景,理论上列存表开启Binlog的开销要大于行存表的开销,所以建议使用行存表开启Binlog。

  • 仅Hologres内部表支持开启Binlog,外部表不支持开启Binlog。

开启Binlog

Hologres中,Binlog功能默认关闭,您可以通过设置表属性binlog.levelbinlog.ttl开启该功能。如下示例开启Binlog,更多关于创建表的参数说明,请参见建表概述

说明

理论上列存表开启Binlog功能的成本要大于行存表。如果您对表格的更新比较频繁,建议您使用行存表开启Binlog功能。

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保留时间的诉求,已有表无需重新建表就能开启Binlog,操作方便快捷。

说明

以下功能仅针对Hologres V1.1及以上版本,如果您的实例是V1.1以下版本,请您使用自助升级或加入实时数仓Hologres交流群(钉钉群号:32314975)申请升级实例。

  • 开启Binlog

    可以使用以下语句对已有表开启Binlog并设置Binlog TTL时间。

    -- 设置表属性开启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;

    table_name为开启Binlog的表名称。

  • 关闭Binlog

    可以使用以下语句对已开启Binlog的表关闭Binlog。

    -- 设置表属性关闭Binlog功能
    begin; 
    call set_table_property('<table_name>', 'binlog.level', 'none'); 
    commit; 

    table_name为需要关闭Binlog的表名称。

  • 修改Binlog的TTL

    通过以下语句可以对已开启Binlog的表修改TTL,满足业务对Binlog不同保留时间的诉求。

    说明

    Hologres从 V1.3.24版本开始,支持按需开启分区子表的Binlog TTL。如果没有显示修改子表的Binlog TTL,则默认与父表的Binlog TTL保持一致。

    begin; 
    call set_table_property('<table_name>', 'binlog.ttl', '8640000'); --单位秒
    commit;

    table_name为修改Binlog TTL的表名称。

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

  • 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,详情请参见文档:

查看开启了Binlog的表

您可以使用如下SQL查看哪些表开启了Binlog。

SELECT
    *
FROM
    hologres.hg_table_properties
WHERE
    property_key = 'binlog.level'
    AND property_value = 'replica';

返回结果示例如下。开启了binlog的表

阿里云首页 实时数仓 Hologres 相关技术圈