建立逻辑复制(单机部署模式)
操作场景
GaussDB 100逻辑复制解析包含逻辑日志信息的REDO日志,获得数据库表数据变更信息,并通过在目标数据源回放数据变更,实现将GaussDB 100的数据变化准实时复制到其它同构或异构数据源的能力。相对于物理复制对日志物理格式的强依赖,逻辑复制更加灵活,可以实现GaussDB 100跨版本复制、GaussDB 100向其它异构数据库(如Oracle)复制,以及在源、目标数据库表结构不一致时的定制支持。逻辑复制可以应用在主备数据库间的增量数据备份、不同业务系统之间的数据同步、系统升级过程中在线数据迁移等场景。
当GaussDB 100数据库和其他商业数据库之间需要同步业务数据时:
- 其他商业数据库同步到GaussDB 100数据库:GaussDB 100提供标准JDBC接口,其它商业数据库的逻辑复制工具可以通过JDBC接口复制业务数据到GaussDB 100。
- GaussDB 100的业务数据复制到其他商业数据库:GaussDB 100提供逻辑复制工具用于将GaussDB 100的业务数据复制到其他商业数据库中,具体请参照建立逻辑复制(单机部署模式)进行操作。
前提条件
- 运行环境需安装JAVA JDK1.8以上版本。
- 已获取逻辑复制工具安装包GaussDB_100_1.0.0-LOGICREP.tar.gz,该包位于GaussDB_100_1.0.0-TOOLS.tar.gz压缩包下。
注意事项
- 当前逻辑复制服务预置支持的目标数据源类型包括:Oracle、GaussDB 100、Kafka。其它类型数据源可通过插件开发方式支持。
- 对于主备复制场景,需要为主机和备机分别安装、配置、启动逻辑复制服务。但是,同一时间,只有主机的逻辑复制处于工作模式。
- 不能复制SYS用户的表数据。
- 逻辑复制需要读取归档及在线日志,因此需要打开GaussDB 100的归档日志,并关闭GaussDB 100的归档日志自动清理功能,防止归档日志被误删除。
- 逻辑复制在单机模式下不具备告警功能,逻辑复制的run日志中出现的“cannot get $DM_AGENT_HOME env or DM_AGENT_HOME path is invalid.”异常信息不用关注,这个是因为没有DM导致的,不影响逻辑复制功能。
- 逻辑复制服务只会复制全局逻辑复制开关和表逻辑复制开关打开后更新的数据,逻辑复制服务开启之前的源表数据无法复制到目标数据库。
- 目标数据库是GaussDB 100时,如果zlogcatcher.rlog中记录“errMsg=the connecting IP is invalid according to IP white list”,则说明目标数据库配置了客户端接入认证,此时,请参见配置客户端接入认证将源数据库所在服务器的IP设置在目标数据库的用户白名单或IP白名单中,且不能配置在IP黑名单中,以确保逻辑复制工具有权访问目标数据库。
- 需要为逻辑复制服务创建数据库用户、并在该用户下面创建复制过程中需要使用的逻辑复制进度表、并授予该用户所需权限。逻辑复制用户所需的最小权限请参见表1。此逻辑复制用户仅用于查询需要复制数据的表的元数据信息,并记录逻辑复制进度,尤其要注意的是:此用户与repconf_db.xml文件中配置的需要复制数据的表中的用户是没有关系的。
表1 逻辑复制用户所需的最小权限 源数据库中逻辑复制用户所需的最小权限
目标数据库中逻辑复制用户所需的最小权限
CONNECT
RESOURCE
SELECT ON SYS.SYS_TABLES
SELECT ON SYS.SYS_COLUMNS
SELECT ON SYS.SYS_USERS
SELECT ON SYS.SYS_CONSTRAINT_DEFS
SELECT ON SYS.SYS_LOGIC_REPL
SELECT ON SYS.DV_DATABASE
SELECT ON SYS.DV_LOG_FILES
SELECT ON SYS.DV_ARCHIVED_LOGS
CREATE SESSION
UPDATE ON user_name.table_name
INSERT ON user_name.table_name
DELETE ON user_name.table_name
操作流程

操作步骤-配置并启动逻辑复制
在以下操作步骤中:
- omm是集群安装成功后生成的数据库管理员用户,gaussdb_123为其默认密码。为保证信息安全,请在成功安装集群并首次登录时,尽快修改数据库管理员omm的默认密码。
- 127.0.0.1表示本地登录DN,如果远程登录请输入要登录的DN所在主机的IP。
- 40000是DN端口号。
- 在GaussDB 100所在服务器上,解压安装逻辑复制工具。
- 以数据库安装用户身份登录GaussDB 100所在服务器。
- 按规划创建存放逻辑复制工具的目录。
mkdir -p /opt/software/tools
- 将逻辑复制工具安装包GaussDB_100_1.0.0-LOGICREP.tar.gz上传至规划目录/opt/software/tools下。
- 进入逻辑复制工具的存放目录。
cd /opt/software/tools
- 将逻辑复制工具安装包解压到已规划好的/opt/software/tools目录。
安装包解压后生成文件夹GaussDB_100_1.0.0-LOGICREP。
tar -zxvf GaussDB_100_1.0.0-LOGICREP.tar.gz -C /opt/software/tools
[omm@plat tools]$ ll total 7940 drwxr-xr-x. 3 omm dbgrp 4096 Apr 26 15:13 GaussDB_100_1.0.0-LOGICREP -rw-r--r--. 1 omm dbgrp 8113682 Apr 29 16:24 GaussDB_100_1.0.0-LOGICREP.tar.gz
- 进入GaussDB_100_1.0.0-LOGICREP目录。
cd GaussDB_100_1.0.0-LOGICREP
[omm@plat GaussDB_100_1.0.0-LOGICREP]$ ll total 4 drwx------. 5 omm dbgrp 4096 Apr 26 15:13 logicrep
- (可选)如果目标数据库是Oracle,请在Oracle官网上下载对应版本的ojdbc驱动,并将其上传至logicrep/lib目录下。
说明:
需保证该ojdbc驱动的权限为500。如果不是500,可以数据库安装身份使用以下命令更改权限。chmod 500 文件名
- (可选)进入logicrep目录,查看相关目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep
[omm@plat logicrep]$ ll total 6772 lrwxrwxrwx 1 omm dbgrp 51 May 14 09:24 com.huawei.gauss.logicrep.jar -> com.huawei.gauss.logicrep-1.0.0SPC200B128.jar -r-x------ 1 omm dbgrp 6899687 May 14 09:24 com.huawei.gauss.logicrep-1.0.0SPC200B128.jar drwx------ 5 omm dbgrp 4096 May 14 09:24 conf drwx------ 2 omm dbgrp 4096 May 14 09:24 ctrl drwx------ 2 omm dbgrp 4096 May 14 09:24 lib drwx------ 2 omm dbgrp 4096 May 14 09:24 plugin -r-x------ 1 omm dbgrp 1415 May 14 09:24 shutdown.sh -rw------- 1 omm dbgrp 7 May 14 09:24 startup.ini -r-x------ 1 omm dbgrp 5206 May 14 09:24 startup.sh
相关目录说明如下:- com.huawei.gauss.logicrep.jar -> com.huawei.gauss.logicrep-1.0.0.jar:逻辑复制服务jar包的软连接
- com.huawei.gauss.logicrep-1.0.0.jar:逻辑复制服务jar包
- conf:配置文件目录
- repconf:复制关系定义文件目录
- sec:秘钥配置文件目录
- ctrl:日志抽取回放控制文件目录
- lib:依赖第三方库目录
- plugin:插件化目录,用于放置自定义的插件化jar包。
- startup.sh:逻辑复制启动脚本
- shutdown.sh:逻辑复制停止脚本
- startup.ini:启动参数配置文件
- 在GaussDB 100所在服务器上,配置逻辑复制服务进程的启动参数。
- 进入conf目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf
- 打开init.properties文件,并按i进入编辑模式。
vi init.properties
- 修改进程启动参数的取值。
所有改动需要重启逻辑复制服务生效。conf/init.properties文件模版如下,其中斜体表示用户可根据需要替换为实际值。
#unit: number of replayer threads #value range:[1,32] replayer.thread.number=1 #specify which kind of replayer is used replayer.class=com.huawei.gauss.logicrep.replayer.jdbc.JdbcReplayer #replayer.class=com.huawei.gauss.logicrep.replayer.kafka.KafkaReplayer #unit: number of slots #value range:[1024,2048] dispatch.queue.size=1024 #unit: number of transactions #value range:[100,300] transaction.buffer.size=100 #unit: MB #value range:[100,500] transaction.buffer.memory.size=100 #unit: MB #value range:[300,800] logentry.buffer.size=500 #checkpoint interval: millisecond #value range:[3000,30000] checkpoint.interval=3000 #where checkpoint is persisted: #sourcedb - logic_rep_progress table on source db checkpoint.location=sourcedb #logic_rep_progress table version. #it is for compatibility, since some deployments use old table version now. #for new deployment, don't need to change this. #if it is not set, v1 used. #v1 - old version: ID,COMMITTED_SCN,LOGPOINT,UPDATE_TIME #v2 - new columns used: ID,COMMITTED_TX_SCN,COMMITTED_TX_TIME,LOGPOINT,UPDATE_TIME checkpoint.table.version=v2 #byte order of redo logfiles to be extracted #little - logfiles generated on little endian platform #big - logfiles generated on big endian platform logfile.endian.type=little #path_to_keystore_file(for zenith) javax.net.ssl.keyStore= #encrypted keyStorePassword(for zenith) javax.net.ssl.keyStorePassword= #path_to_trustStore_file(for oracle) javax.net.ssl.trustStore= #encrypted trustStorePassword(for oracle) javax.net.ssl.trustStorePassword=
相关参数解释如下:- replayer.thread.number
回放线程个数。根据可并发事务大小评估,在性能要求不高的场景下,使用默认配置,即单线程回放。
- replayer.class
所使用的回放类。当用户基于逻辑复制的SDK实现自定义插件时,需配置为实现的回放类类名。
- dispatch.queue.size
工作队列大小。根据可并发事务大小评估,在性能要求不高的场景下,使用默认配置即可。
- transaction.buffer.size
事务缓存最大存放事务个数。当缓存满时,将等待回放线程处理。初始时使用默认配置。后续可以通过观察性能日志的缓存高水位进行调整。
- transaction.buffer.memory.size
每个事务占用的最大内存空间,当某个事务超过默认配置值的时候,会导致逻辑复制失败,这个时候可以调大该参数值,确保占用大内存的事务可以正确地进行逻辑复制。
- logentry.buffer.size
logentry缓存大小。初始时使用默认配置。后续可以通过观察性能日志的缓存高水位进行调整。
- checkpoint.interval
保存回放进度的时间间隔。建议使用默认配置。设置过小可能导致频繁保存进度、影响性能。
- checkpoint.location
物理日志解析及回放进度存放位置。用于存放逻辑复制服务当前解析到的物理日志的位置、和最新提交到目标数据库的事务SCN。仅支持配置为sourcedb,表示逻辑复制服务的进度信息保存在源数据库中创建的逻辑复制服务用户的逻辑复制进度表,即LOGICREP_PROGRESS表中。
- checkpoint.table.version
指定存放在源数据库中逻辑复制进度表的版本。老版本逻辑复制进度表的字段包括:ID、COMMITTED_SCN、LOGPOINT、UPDATE_TIME。升级后的逻辑复制进度表增加COMMITTED_TX_TIME字段,用v2版本号标识。
对于已上线运行的逻辑复制服务,可不指定该参数、或指定该参数为“v1”,表示源数据库中逻辑复制进度表为老版本。
对于新上线的逻辑复制服务,逻辑复制安装包的参数文件中该参数缺省已指定为“v2”,源数据库中的逻辑复制进度表将按新版本的表结构创建。
- logfile.endian.type
指定数据存储在内存中时采用大端模式还是小端模式,此处的大小端配置是指产生逻辑复制工具需要使用的日志文件的机器的大小端。采用大端模式存放数据时,数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;采用小端模式存放数据时,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
- javax.net.ssl.keyStore
指定keyStore文件路径,该路径中包括文件名。仅在配置“useSSL=true”时且需要认证客户端时使用该参数。
- javax.net.ssl.keyStorePassword
指定keyStore密码的密文。仅在配置“useSSL=true”时且需要认证客户端时使用该参数。该密文的生成方式请参见步骤4。
- javax.net.ssl.trustStore=
指定trustStore文件路径,该路径中包括文件名。仅在Oracle配置SSL时使用该参数。
- javax.net.ssl.trustStorePassword=
指定trustStore密码的密文。仅在Oracle配置SSL时使用该参数。该密文的生成方式请参见步骤4。
- 按Esc键并输入:wq保存退出。
- 在源数据库和目标数据库上创建并配置逻辑复制服务使用的用户,用户名可以相同。
- 为源数据库GaussDB 100逻辑复制服务创建配置用户。
- 赋予数据库管理员读取相关系统表和视图的权限。
- 以数据库安装用户身份登录GaussDB 100所在服务器。
- 以sysdba身份本地登录DN数据库。
zsql / as sysdba -D dn_data_dir
- 执行以下命令。
GRANT SELECT ON SYS.SYS_TABLES TO omm with grant option; GRANT SELECT ON SYS.SYS_COLUMNS TO omm with grant option; GRANT SELECT ON SYS.SYS_USERS TO omm with grant option; GRANT SELECT ON SYS.SYS_CONSTRAINT_DEFS TO omm with grant option; GRANT SELECT ON SYS.SYS_LOGIC_REPL TO omm with grant option; GRANT SELECT ON SYS.DV_DATABASE TO omm with grant option; GRANT SELECT ON SYS.DV_LOG_FILES TO omm with grant option; GRANT SELECT ON SYS.DV_ARCHIVED_LOGS TO omm with grant option;
- 退出当前连接。
EXIT
- 使用数据库管理员登录数据库。
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
假设使用的DN端口号是40000。
zsql omm@127.0.0.1:40000 Please enter password: ***********
- 通过执行以下SQL语句,创建逻辑复制服务用户、逻辑复制进度表LREP.LOGICREP_PROGRESS、并授予该用户CONNECT、RESOURCE角色,以及读取相关系统表和视图的权限。
CREATE USER LREP IDENTIFIED BY database_234; GRANT CONNECT, RESOURCE TO LREP; GRANT SELECT ON SYS.SYS_TABLES TO LREP; GRANT SELECT ON SYS.SYS_COLUMNS TO LREP; GRANT SELECT ON SYS.SYS_USERS TO LREP; GRANT SELECT ON SYS.SYS_CONSTRAINT_DEFS TO LREP; GRANT SELECT ON SYS.SYS_LOGIC_REPL TO LREP; GRANT SELECT ON SYS.DV_DATABASE TO LREP; GRANT SELECT ON SYS.DV_LOG_FILES TO LREP; GRANT SELECT ON SYS.DV_ARCHIVED_LOGS TO LREP; CREATE TABLE LREP.LOGICREP_PROGRESS ( ID VARCHAR(128), COMMITTED_TX_SCN BIGINT, COMMITTED_TX_TIME TIMESTAMP, LOGPOINT VARCHAR(128), UPDATE_TIME TIMESTAMP ) DISTRIBUTE BY REPLICATION; CREATE UNIQUE INDEX IX_LREP_PROGRESS ON LREP.LOGICREP_PROGRESS(ID);
- 在目标数据库上为逻辑复制服务创建用户并赋予权限。
- 目标数据库是GaussDB 100时。
- 以omm用户身份登录GaussDB 100的DN所在服务器。
- 通过DN端口连接数据库,创建用户。
假设使用的DN端口号是40000。
zsql omm@127.0.0.1:40000 -c "CREATE USER logicuser IDENTIFIED BY database_123;" Please enter password: ***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
zsql omm@127.0.0.1:40000 -c "GRANT UPDATE ON user_name.table_name TO logicuser;" Please enter password: ***********
zsql omm@127.0.0.1:40000 -c "GRANT INSERT ON user_name.table_name TO logicuser;" Please enter password: ***********
zsql omm@127.0.0.1:40000 -c "GRANT DELETE ON user_name.table_name TO logicuser;" Please enter password: ***********
- 目标数据库是Oracle时。
- 登录数据库。
sqlplus / as sysdba
- 创建用户。
CREATE USER logicuser IDENTIFIED BY database_123;
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
GRANT CREATE SESSION TO logicuser; GRANT UPDATE ON user_name.table_name TO logicuser; GRANT INSERT ON user_name.table_name TO logicuser; GRANT DELETE ON user_name.table_nameE TO logicuser;
- 在GaussDB 100所在服务器上,为源数据库和目标数据库中逻辑复制服务使用的用户生成密码密文。
该操作是在源数据库GaussDB 100上使用zencrypt工具完成的。
- 进入逻辑复制的密钥配置文件目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf/sec [omm@plat sec]$ ll total 8 -rw-------. 1 omm dbgrp 38 Apr 26 15:13 key1.properties -rw-------. 1 omm dbgrp 100 Apr 26 15:13 key2.properties
key1.properties文件用于保存随机密钥因子,key2.properties文件用于保存工作密钥。
- 使用“vi key1.properties”命令查看保存在key1.properties文件中的随机密钥因子。
- 使用“vi key2.properties”命令查看保存在key2.properties文件中的工作密钥。
- 使用zencrypt工具分别为源数据库和目标数据库中逻辑复制服务使用的用户生成密码密文。
看到提示信息“Please enter password to encrypt:”时,输入源数据库中为逻辑复制创建的用户LREP的密码,则生成的是LREP用户密码的密文,在步骤5中将该密文配置在源数据库的参数ds.passwd中;输入目标数据库中为逻辑复制创建的用户logicuser的密码,则生成的是logicuser用户密码的密文,在步骤5中将该密文配置在目标数据库的参数ds.passwd中。
./zencrypt -e AES256 -f lCHMm1WvDKU97uVQDd8+ew== -k g/FMnXWyHkp+8TKMa8qm5j+Ojvuy5hHV/p3WloMhNl2DoUT6Dl90Tom5DKP+3J2M6s/jI0mMdUknmUYcOHQN+g== Please enter password to encrypt: ********* Please input password again: ********* Cipher: jFB1xNaKybjU5kAD3gdJeJvdvEdjj0c87L1NBsSWZHA=
- -e:指定加密算法。当前支持SCRAM_SHA256算法(用于加密用户密码)和AES256算法(用于加密SSL私钥密码)。
- -f:指定随机密钥因子。仅在使用AES256算法或者生成工作密钥时有效。随机秘钥因子保存在key1.properties文件中,key1.properties文件的存储路径是/opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf/sec/key1.properties。
- -k:指定工作密钥。仅在使用AES256算法时有效。工作秘钥保存在key2.properties文件中,key2.properties文件的存储路径是/opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf/sec/key2.properties。
- 在GaussDB 100所在服务器上,在conf/datasource.properties配置文件中定义逻辑复制服务相关的源数据库、目标数据库信息。
- 进入conf目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf
- 打开datasource.properties文件,并按i进入编辑模式。
vi datasource.properties
- 定义源数据库、目标数据库信息。
斜体表示需要替换为实际值。其中,用户密码密文的生成请参考步骤4,为逻辑复制服务创建用户在步骤3中完成。
#properties of source/destination datasources defined here #note: #1. section name - datasource name #2. mandatory properties: #ds.type - gauss/oracle/kafka, needed for logicrep [srcdb] ds.type=gauss ds.url=jdbc:zenith:@127.0.0.1:1611?useSSL=false ds.username=lrep ds.passwd=8W6qr0rX2PwQR3Uf3g/bLcu++haPqbKWXpW7M9nNlAI= ds.available.query.sql=select 1 initial.size=5 min.idle=1 max.idle=10 max.active=50 max.wait=100000 [dstdb] ds.type=oracle ds.url=jdbc:oracle:thin:@10.185.240.79:1521:ora11g ds.username=usrSample ds.passwd=8W6qr0rX2PwQR3Uf3g/bLcu++haPqbKWXpW7M9nNlAI= ds.available.query.sql=select 1 from dual initial.size=10 max.idle=20 min.idle=5 max.active=50 max.wait=100000 [dstkafka] ds.type=kafka ds.url=10.185.240.79:9092 compression.type=none max.block.ms=60000 retries=3 batch.size=1048576 linger.ms=1 buffer.memory=33554432 max.request.size=33554432 request.timeout.ms=10000 optimize.batch.send.buffer=5242880 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN sasl.jaas.config.username=userxxx #kafka sasl encrypted pwd sasl.jaas.config.password=passxxx ssl.truststore.location=/home/kafka.client.truststore.jks #kafka truststore encrypted pwd ssl.truststore.password=passxxx ssl.keystore.location=/home/kafka.client.keystore.jks #kafka keystore encrypted pwd ssl.keystore.password=passxxx #kafka key encrypted pwd ssl.key.password=passxxx ssl.keystore.type=JKS ssl.truststore.type=JKS ssl.protocol=SSL key.serializer=org.apache.kafka.common.serialization.StringSerializer value.serializer=org.apache.kafka.common.serialization.StringSerializer
以上示例包括逻辑复制当前支持的三种数据源类型的参数,均为必填字段。参数详细说明如下:- [srcdb]/[dstdb]/[dstkafka]:小节名称,即该小节描述的数据源名称,与repconf_db.xml文件中的srcName和dstName对应。其中,srcdb代表源数据源名称,dstdb和dstkafka代表目标数据源名称。
- ds.type:数据源类型。当前逻辑复制服务支持的类型包括:gauss、oracle、kafka。gauss表示目标数据源为GaussDB 100;oracle表示目标数据源为ORACLE;kafka表示目标数据源为kafka消息队列。
- ds.url:数据库的url地址。
- ds.type配置为oracle时,如果不使用ssl,则ds.url的格式为ds.url=jdbc:oracle:thin:@192.168.0.2:1521:ora11g;如果使用ssl,则ds.url的格式为ds.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.0.2)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=orcl))),此时需要在JDBC客户端配置SSL证书。
- ds.type配置为gauss时,ds.url的格式为ds.url=jdbc:zenith:@127.0.0.1:1888?useSSL=false,其中使用“useSSL=false”时,逻辑复制速度较快,但是存在安全风险,“useSSL=true”时,使用SSL进行双向认证,都需要在JDBC客户端配置SSL证书,配置方法请参见《GaussDB 100 1.0.0开发者指南(分布式)》中的“数据库开发指南 > 基于JDBC开发 > 连接数据库”章节下的配置JDBC客户端SSL证书内容,如果使用单向认证(客户端不认证服务端),则无需在JDBC客户端配置SSL证书。
- ds.type配置为kafka时,ds.url的格式为ds.url=192.168.0.2:9092,其中9092是kafka服务器对客户端提供的端口号。
- ds.type配置为oracle或gauss时,配置ds.url之后还需配置的参数说明如下:
- ds.username:逻辑复制服务使用的用户的名称。在源数据库中为逻辑复制服务创建的用户用于读取相关系统表和视图,目的是用于回放SQL语句、查询逻辑复制进度表;在目标数据库中为逻辑复制服务创建的用户用于访问回放SQL所用的表。
- ds.passwd:为逻辑复制服务创建的用户的密文密码。
- ds.available.query.sql:检查连接池中的连接是否可用的查询语句。
- initial.size:连接池初始连接数。
- max.idle:连接池最大空闲连接数。
- min.idle:连接池最小空闲连接数。
- max.active:连接池的最大数据库连接数。
- max.wait:最大建立连接等待时间。
- ds.type配置为kafka时,配置ds.url之后还需配置如下的kafka原生参数,具体含义和取值也可参考kafka相关文档,同时还需要执行步骤7配置topic_table.properties文件。
- compression.type:消息压缩类型。
- max.block.ms:KafkaProducer.send()和KafkaProducer.partitionsFor()的阻塞时间。
- retries:生产者发送消息的尝试次数。
- batch.size:生产者发送消息时一个批次可以使用的内存大小。
- linger.ms:生产者在发送批次之前等待更多消息加入批次的时间。
- buffer.memory:生产者内存缓冲区的大小。
- max.request.size:生产者发送请求消息的最大字节数。
- request.timeout.ms:生产者从发送请求到收到ACK确认等待的最长时间。
- optimize.batch.send.buffer:逻辑复制内部的消息buffer。该参数值需小于buffer.memory。
- security.protocol :生产者和server使用的认证方式。支持SASL_PLAINTEXT和SSL两种方式。
- sasl.mechanism : 取值为PLAIN。该参数在kafka采用SASL_PLAINTEXT认证方式时需要配置。
- sasl.jaas.config.username:认证使用的用户名。该参数在kafka采用SASL_PLAINTEXT认证方式时需要配置。
- sasl.jaas.config.password:认证使用的密码,此处是加密后的密码,加密方法请参考步骤4中的4。该参数在kafka采用SASL_PLAINTEXT认证方式时候需要配置。
- ssl.truststore.location:ssl truststore证书位置。该参数在kafka采用SSL认证方式时需要配置。
- ssl.truststore.password:ssl truststore 密码(加密后的密码)。该参数在kafka采用SSL认证方式时需要配置。
- ssl.keystore.location:ssl keystore证书位置。该参数在kafka采用SSL认证方式时需要配置。
- ssl.keystore.password:ssl keystore 密码(加密后的密码)。该参数在kafka采用SSL认证方式时需要配置。
- ssl.key.password:ssl key密码(加密后的密码)。该参数在kafka采用SSL认证方式时需要配置。
- key.serializer:用来序列化key的Serializer接口的实现类。
- value.serializer:用来序列化value的Serializer接口的实现类。
- 按Esc键并输入:wq保存退出。
- (可选)ds.type配置为kafka时,到kafka官网上下载kafka2.0版本包,复制其中的kafka-clients-2.0.0.jar、slf4j-api-1.7.25.jar、slf4j-log4j12-1.7.25.jar这三个jar包至逻辑复制安装包的lib目录(/opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/lib)下。
- (可选)ds.type配置为kafka时,在topic_table.properties文件中定义topic和table之间的关系,以及使用的partitioner类名称。
- 进入topicconf目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf/topicconf
- 打开topic_table.properties文件,并按i进入编辑模式。
vi topic_table.properties
- 定义topic和table的关系,以及使用的partitioner类名称。
以下配置仅为示例,示例中的*为通配符。其中,partitioner这一小节是配置使用的partitioner类型,此处示例中使用的是逻辑复制默认的partitioner,用户也可以使用自定义的partitioner;topic1、topic2和topic3是topic小节的topic名称,在每个topic小节中还需要配置分区数以及有哪些表的数据会发送到该topic下。
#topic name and table name mapping relation [partitioner] class.name=com.huawei.gauss.logicrep.replayer.kafka.TopicPartitioner [topic1] partition.num=3 table.name=user1.t1,usr2.t2,user1.t3 [topic2] partition.num=5 table.name=user2.t2,user1.t3,user3.t4,use4.* [topic3] partition.num=5 table.name=*.*
- 在GaussDB 100所在服务器上,在repconf_db.xml文件中为DN定义复制关系。
- 进入repconf目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf/repconf
- 打开repconf_db.xml文件,并按i进入编辑模式。
vi repconf_db.xml
- 定义复制关系。
源数据库到目标数据库逻辑复制相关的所有信息均通过复制关系定义文件描述,并以xml格式存放在conf/repconf目录下。
<?xml version="1.0" encoding="UTF-8" ?> <replicationConfig> <repName> <repNameInfo name="logicrep"/> </repName> <datasource> <datasourceInfo srcName="srcdb" dstName="dstdb"/> </datasource> <filteredUser> <userInfo userName="sample"/> <userInfo userName="lrep"/> </filteredUser> <modelMapping> <tableMapping srcTable="t1" srcSchema="usrSample" dstTable="t1" dstSchema="usrSample"> <!-- columns not to be updated --> <ignoreUpdatecolumns> </ignoreUpdatecolumns> <!--columns not to be inserted,if configure this, update also will ignore these columns --> <ignoreInsertcolumns> </ignoreInsertcolumns> <column srcColumn="f_varchar1" dstColumn="f_varchar1" isKey="true" /> <column srcColumn="f_varchar2" dstColumn="f_varchar2" /> <column srcColumn="f_varchar3" dstColumn="f_varchar3" /> <column srcColumn="f_varchar4" dstColumn="f_varchar4" /> <column srcColumn="f_date1" dstColumn="f_date1" /> <column srcColumn="f_date2" dstColumn="f_date2" /> <column srcColumn="f_varchar5" dstColumn="f_varchar5" /> <column srcColumn="f_number1" dstColumn="f_number1" /> <column srcColumn="f_varchar6" dstColumn="f_varchar6" /> </tableMapping> </modelMapping> </replicationConfig>
其中,相关标签解释如下:- repName
复制关系的名称,作为复制关系的唯一标识和复制进程启动时的命令行参数,以指定需要进行复制的内容。
当conf/repconf目录下存在多个定义文件时,要求名称必须唯一。
- datasource
指定复制的源数据库名称和目标数据库名称,该名称需在datasource.properties中存在定义。
- filteredUser
指定需要被过滤信息的用户。进行逻辑复制时,由该用户产生的数据不会被复制。支持配置多个被过滤的用户信息。
被过滤的用户需要在源数据库中定义,如果用户不存在,会产生Warn日志,但逻辑复制将继续进行。
建议将源端数据库中为逻辑复制服务创建的LREP用户配置在过滤用户列表中,这样可过滤掉LREP操作表产生的日志,因此可提高逻辑复制性能。
- modelMapping
定义该复制关系中的模型映射,由多个tableMapping组成。如果源数据库中的源表和目的数据库中的目标表的表结构一样、表的所有者名称一样、表名一样,则无需为该表配置表映射关系,只需要打开这个表的逻辑复制开关即可复制该表数据。如果源数据库中的源表和目的数据库中的目标表的所有者名称或者表名不一样,则为该表配置表映射关系时,只配置“<tableMapping dstTable="orders2018" dstSchema="zuser" srcTable="orders" srcSchema="zuser">”即可,无需配置字段映射关系。
- tableMapping
定义模型映射中的一个表映射关系,包括源表名、源schema名、目标表名、目标schema名,并由多个字段映射关系组成。
如果一个表中的字段不需要全部复制,那么用户可以只为需要复制字段定义字段映射关系。如果一张表的字段数量较大,并且只有个别字段无需复制,那么用户只需在模型映射中将需要忽略的字段映射关系配置在<ignoreUpdatecolumns></ignoreUpdatecolumns>标签或<ignoreInsertcolumns></ignoreInsertcolumns>标签中即可。
<ignoreUpdatecolumns></ignoreUpdatecolumns>标签、<ignoreInsertcolumns></ignoreInsertcolumns>标签和<column>标签之中,<ignoreInsertcolumns></ignoreInsertcolumns>标签的优先级最高。
- column
定义一个源表和其目标表的字段映射关系,包括源字段名、源字段类型、目标字段名、目标字段类型。建议源字段名和目标字段名相同,源字段类型和目标字段类型相同。
对于主键字段,需要同时定义isKey="true" ,当没有isKey定义时,缺省为false。
- 保存退出。
:wq
- 在GaussDB 100所在服务器上,打开表逻辑复制开关和全局逻辑复制开关。
- 打开全局逻辑复制开关。
zsql omm@127.0.0.1:40000 -c "ALTER DATABASE ENABLE_LOGIC_REPLICATION ON;" Please enter password: ***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
- 打开表逻辑复制开关。
zsql omm@127.0.0.1:40000 -c "ALTER TABLE [schema_name.]table_name ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;" Please enter password: ***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
说明:
- 要复制的表必须有主键,否则,打开表的逻辑复制开关时会报错“GS-01213, error message = 'object index on table TRAINING does not exist'”。
- 为保证源表和目的表中数据一致性,需要对源表主键字段在目的表中的对应字段设置主键属性。
- 当前逻辑复制服务只支持基于主键复制,因此打开表逻辑复制开关时,COLUMNS只支持定义为PRIMARY KEY。
- 只有当表逻辑复制开关和全局逻辑复制开关同时打开时,该表的数据才会被逻辑复制。
用户可以使用数据库管理员账户登录源数据库查询全局逻辑复制开关的状态,操作步骤如下:- 登录数据库。
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
假设使用的DN端口号是40000。
zsql omm@127.0.0.1:40000 Please enter password: ***********
- 查询全局逻辑复制开关的状态
SELECT lrep_point, lrep_mode FROM sys.DV_DATABASE; LREP_POINT LREP_MODE -------------------- -------------------- 0-2-7545-5d62 ON 1 rows fetched.
用户可以使用数据库管理员账户登录源数据库,通过以下命令查询某张表的逻辑复制开关状态。omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
zsql omm@127.0.0.1:8000 -c "SELECT l.status FROM sys.logic_rep$ l, sys.table$ t WHERE t.name='ORDERS' AND t.id=l.table#;" Please enter password: *********** SQL> STATUS ------------ 1 1 rows fetched.
说明:
- 当前逻辑复制服务只支持基于主键复制,因此打开表复制开关时,COLUMNS只支持定义为PRIMARY KEY
- 只有当表复制开关和全局复制开关同时打开时,该表的数据才会被逻辑复制。
- 使用zsql omm@127.0.0.1:40000 -c "SELECT l.status FROM sys.logic_rep$ l, sys.table$ t WHERE t.name='ORDERS' AND t.id=l.table#;"查询某张表的逻辑复制开关时,表名必须使用大写,否则查询结果为空。
STATUS ------------ 0 rows fetched.
- 在GaussDB 100所在服务器上,启动逻辑复制服务。
- 进入logicrep目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep
- 启动逻辑复制服务。
说明:
startup.sh和shutdown.sh脚本需要使用数据库安装帐号运行。
sh startup.sh -n logicrep -a 0-2-422-50b program start successfully
其中,-n rep_name为必选参数,指定需要启动的逻辑复制关系,rep_name在复制关系定义文件中定义。该名称将作为后续重启该逻辑复制服务、查询复制进度等一系列操作的唯一标识,因此需保证其唯一性、不要在使用过程中对其进行修改。逻辑复制服务启动时,会检查conf/repconf目录下的所有复制关系定义文件,如果该逻辑复制服务的复制关系定义文件中的rep_name的取值和已启动逻辑复制服务的rep_name相同,将强行退出。
-a lrep_point为可选参数,指定逻辑复制开始的日志起始点。在当打开源数据库的表逻辑复制开关和全局逻辑复制开关、首次启动逻辑复制时,必须使用该选项指定复制的起始点。lrep_point具体值可以在打开源数据库全局逻辑复制开关后,通过zsql omm@127.0.0.1:1888 -c "SELECT lrep_point, lrep_mode FROM sys.DV_DATABASE;”查询DV_DATABASE视图获得。
- (可选)逻辑复制过程中,可以在GaussDB 100所在服务器上查询逻辑复制服务的复制进度。
zsql omm@127.0.0.1:40000 -c "SELECT id, committed_scn, logpoint, update_time FROM lrep.logicrep_progress;" Please enter password: ***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
操作步骤-逻辑复制的例行性检查
用户可定期查看log目录下的日志,以便检查是否有error级别的错误,及时发现问题并解决问题,同时,通过查看性能日志,可确认是否有性能问题,进而通过调整启动参数来提高性能。
- 以omm用户身份登录GaussDB 100所在服务器。
- 进入日志目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/logicrep/logicrep/logicrep
- 查看日志目录下的日志,确定逻辑复制服务是否运行正常。
逻辑复制服务的日志包括告警日志、运行日志、审计日志和性能日志。
检查alarm目录下的日志,确认是否有线程/进程退出等严重错误。如果有,参考其它日志信息解决问题后重启服务。
检查run目录下的运行日志,确认是否有运行期错误。
检查audit目录下的审计日志,确认是否有SQL执行错误。
检查perf目录下的性能日志,查看各统计项信息,确认是否有性能问题、需要调整各项启动参数。
如果逻辑复制服务运行正常,则例行性检查结束。如果逻辑复制服务运行不正常,则跳转步骤4。
- 停止逻辑复制服务并查看进行修复。
shutdown.sh脚本需要使用数据库安装帐号运行。
sh shutdown.sh -n logicrep Process is stopping, please wait...... Close logicRepName=logicrep logic process successfully.
当逻辑复制服务不能正常停止时,可以通过以下命令强制停止。
sh shutdown.sh -n logicrep -f Close logicRepName=logicrep logic process successfully with -f.
- 重启逻辑复制服务。
startup.sh和shutdown.sh脚本需要使用数据库安装帐号运行。
重启逻辑复制服务时,根据该逻辑复制服务上次停止时保存的进度继续复制。sh startup.sh -n logicrep program start successfully
重启逻辑复制服务时,也可以强制忽略之前的复制进度。sh startup.sh -n logicrep -a 0-2-1ddc00-1ddce4-c27 -c
-c参数指定放弃之前的复制进度,从-a参数指定的起始点开始重新复制。使用该方式重启逻辑复制服务时,从起始点开始的所有逻辑日志将重新被解析、复制数据到目标数据库,如果目标数据库中已经存在部分复制数据,会造成冲突。因此该重启逻辑复制服务方式只在某些异常处理场景,如需要强制重新复制的场景中使用,使用前需确认目标数据库中的部分数据已经被清理、或冲突不影响业务流程。
操作步骤-修改逻辑复制的启动参数
启动参数保存在init.properties文件中。在首次配置逻辑复制服务时,启动参数可使用默认配置,后续可以通过观察性能日志的缓存高水位确定是否修改启动参数。参数修改需要重启逻辑复制服务生效。
- 以omm用户身份登录GaussDB 100所在服务器。
- 修改逻辑复制服务进程的启动参数。
- 进入conf目录。
cd /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf
- 打开init.properties文件,并按i进入编辑模式。
vi init.properties
- 修改进程启动参数的取值。
- 打开init.properties文件,并按i进入编辑模式。
- 进入conf目录。
- 重启逻辑复制服务。
- 查看日志目录下的日志,确定逻辑复制服务是否运行正常。
- 启动逻辑复制服务。
- 查询全局逻辑复制开关的状态
- 打开表逻辑复制开关。
- 打开全局逻辑复制开关。
- 在GaussDB 100所在服务器上,打开表逻辑复制开关和全局逻辑复制开关。
- 打开repconf_db.xml文件,并按i进入编辑模式。
- 打开topic_table.properties文件,并按i进入编辑模式。
- 进入topicconf目录。
- 打开datasource.properties文件,并按i进入编辑模式。
- 进入conf目录。
- 进入逻辑复制的密钥配置文件目录。
- 在GaussDB 100所在服务器上,为源数据库和目标数据库中逻辑复制服务使用的用户生成密码密文。
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
- 创建用户。
- 目标数据库是Oracle时。
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
- 目标数据库是GaussDB 100时。
- 使用数据库管理员登录数据库。
- 执行以下命令。
- 赋予数据库管理员读取相关系统表和视图的权限。
- 为源数据库GaussDB 100逻辑复制服务创建配置用户。
- 打开init.properties文件,并按i进入编辑模式。
- (可选)如果目标数据库是Oracle,请在Oracle官网上下载对应版本的ojdbc驱动,并将其上传至logicrep/lib目录下。
- 进入GaussDB_100_1.0.0-LOGICREP目录。