/ / / / / 逻辑解码概述
更新时间:2025-03-08 gmt 08:00

逻辑解码概述-九游平台

gaussdb对数据复制能力的支持情况如下:

  • 支持通过数据迁移工具定期向异构数据库(如oracle等)进行数据同步,不具备实时数据复制能力。不足以支撑与异构数据库间并网运行实时数据同步的诉求。
  • 备集群不支持异形部署,即不支持cn、dn数量和实例部署形态与原集群不一致。备集群恢复期间不支持读写操作,且复制时延相对较高。

基于上述两点,gaussdb提供了逻辑解码功能,通过反解xlog的方式生成逻辑日志。目标数据库解析逻辑日志以实时进行数据复制。具体如图1所示。逻辑复制降低了对目标数据库的形态限制,支持异构数据库、同构异形数据库对数据的同步,支持目标库进行数据同步期间的数据可读写,数据同步时延低。

图1 逻辑复制

逻辑复制由两部分组成:逻辑解码和数据复制。逻辑解码会输出以事务为单位组织的逻辑日志。业务或数据库中间件将会对逻辑日志进行解析并最终实现数据复制。gaussdb当前只提供逻辑解码功能,因此本章节只涉及逻辑解码的说明。

功能描述

逻辑解码为逻辑复制提供事务解码的基础能力,gaussdb使用sql函数接口进行逻辑解码。此方法调用方便,不需使用工具,对接外部工具接口也比较清晰,不需要额外适配。

由于逻辑日志是以事务为单位的,在事务提交后才能输出,且逻辑解码是由用户驱动的;因此为了防止事务开始时的xlog被系统回收,或所需的事务信息被vacuum回收,gaussdb新增了逻辑复制槽,用于阻塞xlog的回收。

一个逻辑复制槽表示一个更改流,这些更改可以在其它集群上以它们在原集群上产生的顺序重新执行。每个逻辑复制槽都由其对应逻辑日志的获取者维护。

前提条件

  • 逻辑日志目前从dn中抽取,如果进行逻辑复制,应使用ssl连接,需要保证相应dn上的guc参数ssl设置为on。

    为避免安全风险,请保证启用ssl连接。

  • 设置guc参数wal_level=logical。
  • 设置guc参数max_replication_slots>=每个dn所需的物理流复制槽数、备份槽数、逻辑复制槽数之和。

    关于逻辑复制槽数,请按如下规则考虑。

    • 一个逻辑复制槽只能解码一个database的修改,如果需要解码多个database,则需要创建多个逻辑复制槽。
    • 如果需要多路逻辑复制同步给多个目标数据库,在源端数据库需要创建多个逻辑复制槽,每个逻辑复制槽对应一条逻辑复制链路。
  • 用户需要通过dn端口连接数据库,才可以直接使用sql函数接口进行逻辑解码操作。如果使用cn端口连接数据库,则需要通过execute direct on (datanode_name) 'statement'语句来执行sql函数。
  • 仅限初始用户和拥有replication权限的用户进行操作。三权分立关闭时数据库管理员可进行逻辑复制操作,三权分立开启时不允许数据库管理员进行逻辑复制操作。
  • 并行解码需要配置充足的内存资源,内存占用主要分为如下四部分:
    • toast元组拼接哈希表:并发事务数量 * 元组平均大小,当前版本不受落盘逻辑管控,处理toast元组时可能占用大量内存。
    • 队列内存:队列长度 * 解码并行度 * 元组平均大小 * 2 (有读取日志队列和解码结果队列两种),通过队列长度、解码并行度控制。
    • 并行解码日志发送重排:并发事务数量 * 事务修改元组数量 * 元组平均大小,可通过解码配置选项max-txn-in-memory及max-reorderbuffer-in-memory管控上限。
    • 事务元信息内存:并发事务数量 * 每个事务元信息大小(约300字节)。

注意事项

  • 逻辑解码不支持ddl。
  • 在执行特定的ddl语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。
  • 不支持数据页复制的dml解码。
  • 不支持解码分布式事务,当前机制为从dn解码,无法保证分布式事务一致性解码。
  • 当执行ddl语句(如alter table)后,该ddl语句前尚未解码的物理日志可能会丢失。
  • 使用逻辑解码功能时,禁止进行集群在线扩容。
  • 单条元组大小不超过1gb,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500mb。
  • gaussdb支持解码的数据类型为:integer、bigint、smallint、tinyint、serial、smallserial、bigserial、float、double precision、date、time[without time zone]、timestamp[without time zone]、char(n)、varchar(n)、text。
  • 如果需要ssl连接需要保证前置条件guc参数ssl设置为on。
  • 逻辑复制槽名称必须小于64个字符,仅支持小写字母、数字以及_?-.字符,且不支持“.”或“..”单独作为复制槽名称。
  • 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。
  • 不支持interval partition表复制。
  • 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。
  • 不支持强切,强切后需要重新全量导出数据。
  • 在事务中执行ddl语句后,该ddl语句与之后的语句不会被解码。
  • 如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。
  • 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。
  • 不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。
  • 只支持主机创建删除复制槽。
  • 数据库故障重启或逻辑复制进程重启后,解码数据可能存在重复,用户需自己过滤。
  • 计算机内核故障后,解码可能存在乱码,需手动或自动过滤。
  • 当前备机逻辑解码,不支持开启极致rto。
  • 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。
  • 为解析某个astore表的update和delete语句,需为此表配置replica identity属性,在此表无主键时需要配置为full,配置方式参照字段。
  • 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。
  • 基于目标库可能需要源库的系统状态信息考虑,逻辑解码仅自动过滤模式'pg_catalog'和'pg_toast'下oid小于16384的系统表的逻辑日志。若目标库不需要复制其他相关系统表的内容,逻辑日志回放过程中需要对相关系统表进行过滤。
  • 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的replica identity属性设置为full或是使用using index指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为not null的列的索引。
  • 在逻辑复制槽使用完毕后,需及时删除,否则会阻塞xlog日志回收。
  • 若一个事务的子事务过多导致落盘文件过多,退出解码时需执行sql函数pg_terminate_backend(逻辑解码的walsender线程id)来手动停止解码,而且退出时延增加约为1分钟/30万个子事务。因此在开启逻辑解码时,若一个事务的子事务数量达到5万时,会打印一条warning日志。
  • 当同一事务产生大量需要落盘的子事务时,同时打开的文件句柄可能会超限,需将guc参数max_files_per_process配置成大于子事务数量上限的两倍。

sql函数解码性能

在benchmarksql-5.0的100warehouse场景下,采用pg_logical_slot_get_changes时:
  • 单次解码数据量4k行(对应约5mb~10mb日志),解码性能0.3mb/s~0.5 mb/s。
  • 单次解码数据量32k行(对应约40mb~80mb日志),解码性能3mb/s~5mb/s。
  • 单次解码数据量256k行(对应约320mb~640mb日志),解码性能3mb/s~5mb/s。
  • 单次解码数据量再增大,解码性能无明显提升。

如果采用pg_logical_slot_peek_changes pg_replication_slot_advance方式,解码性能相比采用pg_logical_slot_get_changes时要下降30%~50%。

相关文档

网站地图