首页 > 数据库 > > 数据库系统管理-建立逻辑复制(主备/分布式部署模式)
GaussDB 100逻辑复制解析包含逻辑日志信息的REDO日志,获得数据库表数据变更信息,并通过在目标数据源回放数据变更,实现将GaussDB 100的数据变化准实时复制到其它同构或异构数据源的能力。相对于物理复制对日志物理格式的强依赖,逻辑复制更加灵活,可以实现GaussDB 100跨版本复制、GaussDB 100向其它异构数据库(如Oracle)复制,以及在源、目标数据库表结构不一致时的定制支持。逻辑复制可以应用在主备数据库间的增量数据备份、不同业务系统之间的数据同步、系统升级过程中在线数据迁移等场景。
当GaussDB 100数据库和其他商业数据库之间需要同步业务数据时:
源数据库中逻辑复制用户所需的最小权限 | 目标数据库中逻辑复制用户所需的最小权限 |
|---|---|
CONNECT CREATE TABLE 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 |

在以下操作步骤中:
mkdir -p /opt/software/tools将逻辑复制工具安装包GaussDB_100_1.0.1-LOGICREP.tar.gz上传至规划目录/opt/software/tools下。
cd /opt/software/tools
安装包解压后生成文件夹GaussDB_100_1.0.1-LOGICREP。
tar -zxvf GaussDB_100_1..1-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..1-LOGICREP
-rw-r--r--. 1 omm dbgrp 8113682 Apr 29 16:24 GaussDB_100_1..1-LOGICREP.tar.gz
cd GaussDB_100_1.0.1-LOGICREP
[omm@plat GaussDB_100_1..1-LOGICREP]$ ll
total 4
drwx------. 5 omm dbgrp 4096 Apr 26 15:13 logicrep

chmod 500 文件名cd /opt/software/tools/GaussDB_100_1.0.1-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.1SPC200B128.jar
-r-x------ 1 omm dbgrp 6899687 May 14 09:24 com.huawei.gauss.logicrep-1.0.1SPC200B128.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.shcd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/confvi 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=回放线程个数。根据可并发事务大小评估,在性能要求不高的场景下,使用默认配置,即单线程回放。
所使用的回放类。当用户基于逻辑复制的SDK实现自定义插件时,需配置为实现的回放类类名。
工作队列大小。根据可并发事务大小评估,在性能要求不高的场景下,使用默认配置即可。
事务缓存最大存放事务个数。当缓存满时,将等待回放线程处理。初始时使用默认配置。后续可以通过观察性能日志的缓存高水位进行调整。
每个事务占用的最大内存空间,当某个事务超过默认配置值的时候,会导致逻辑复制失败,这个时候可以调大该参数值,确保占用大内存的事务可以正确地进行逻辑复制。
logentry缓存大小。初始时使用默认配置。后续可以通过观察性能日志的缓存高水位进行调整。
保存回放进度的时间间隔。建议使用默认配置。设置过小可能导致频繁保存进度、影响性能。
物理日志解析及回放进度存放位置。用于存放逻辑复制服务当前解析到的物理日志的位置、和最新提交到目标数据库的事务SCN。仅支持配置为sourcedb,表示逻辑复制服务的进度信息保存在源数据库中创建的逻辑复制服务用户的逻辑复制进度表,即LOGICREP_PROGRESS表中。
指定存放在源数据库中逻辑复制进度表的版本。老版本逻辑复制进度表的字段包括:ID、COMMITTED_SCN、LOGPOINT、UPDATE_TIME。升级后的逻辑复制进度表增加COMMITTED_TX_TIME字段,用v2版本号标识。
对于已上线运行的逻辑复制服务,可不指定该参数、或指定该参数为“v1”,表示源数据库中逻辑复制进度表为老版本。
对于新上线的逻辑复制服务,逻辑复制安装包的参数文件中该参数缺省已指定为“v2”,源数据库中的逻辑复制进度表将按新版本的表结构创建。
指定数据存储在内存中时采用大端模式还是小端模式,此处的大小端配置是指产生逻辑复制工具需要使用的日志文件的机器的大小端。采用大端模式存放数据时,数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;采用小端模式存放数据时,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
指定keyStore文件路径,该路径中包括文件名。仅在配置“useSSL=true”时且需要认证客户端时使用该参数。
指定keyStore密码的密文。仅在配置“useSSL=true”时且需要认证客户端时使用该参数。该密文的生成方式请参见步骤4。
指定trustStore文件路径,该路径中包括文件名。仅在Oracle配置SSL时使用该参数。
指定trustStore密码的密文。仅在Oracle配置SSL时使用该参数。该密文的生成方式请参见步骤4。
zsql / as clsmgr
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;zsql / as sysdba -D dn_data_dirGRANT 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;EXITzsql / 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。
假设使用的CN端口号是8000。
zsql omm@127.0.0.1:8000
Please enter password:
***********zsql omm@192.168.5.6:40000
Please enter password:
***********CREATE USER LREP IDENTIFIED BY database_234;
GRANT CONNECT, CREATE TABLE 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);zsql omm@127.0.0.1:8000 -c "CREATE USER logicuser IDENTIFIED BY database_123;"
Please enter password:
***********omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
zsql omm@127.0.0.1:8000 -c "GRANT UPDATE ON user_name.table_name TO logicuser;"
Please enter password:
***********zsql omm@127.0.0.1:8000 -c "GRANT INSERT ON user_name.table_name TO logicuser;"
Please enter password:
***********
zsql omm@127.0.0.1:8000 -c "GRANT DELETE ON user_name.table_name TO logicuser;"
Please enter password:
***********假设使用浮动IP为192.168.5.6,DN端口号是40000。
zsql omm@192.168.5.6:40000 -c "CREATE USER logicuser IDENTIFIED BY database_123;"
Please enter password:
***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
zsql omm@192.168.5.6:40000 -c "GRANT UPDATE ON user_name.table_name TO logicuser;"
Please enter password:
***********zsql omm@192.168.5.6:40000 -c "GRANT INSERT ON user_name.table_name TO logicuser;"
Please enter password:
***********zsql omm@192.168.5.6:40000 -c "GRANT DELETE ON user_name.table_name TO logicuser;"
Please enter password:
***********sqlplus / as sysdbaCREATE 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上使用zencrypt工具完成的。
cd /opt/software/tools/GaussDB_100_1.0.1-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.propertieskey1.properties文件用于保存随机密钥因子,key2.properties文件用于保存工作密钥。
看到提示信息“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=cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf打开datasource.properties文件,并按i进入编辑模式。
vi datasource.properties
需要将源分布式数据库的所有主备DN上数据库信息和目标数据库信息配置在datasource.properties文件中,每个DN上数据库对应一个[srcdb]或[dstdb]小节,同时,由于主备DN的端口号可能不一致,建议将ip配置为DN所在服务器的实际ip,不使用回环地址127.0.0.1表示该DN部署在本地服务器上。斜体表示需要替换为实际值。其中,用户密码密文的生成请参考步骤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.StringSerializercd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf/topicconfvi topic_table.properties以下配置仅为示例,示例中的*为通配符。其中,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=*.*
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf/repconfvi repconf_db.xml
源数据库到目标数据库逻辑复制相关的所有信息均通过复制关系定义文件描述,并以xml格式存放在conf/repconf目录下。一个复制关系对应一个DN的逻辑复制服务,因此,如果为多个DN配置逻辑复制服务,则需要分别为每个DN配置复制关系定义文件。
<?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>复制关系的名称,作为复制关系的唯一标识和复制进程启动时的命令行参数,以指定需要进行复制的内容。
当conf/repconf目录下存在多个定义文件时,要求名称必须唯一。
指定复制的源数据库名称和目标数据库名称,该名称需在datasource.properties中存在定义。
指定需要被过滤信息的用户。进行逻辑复制时,由该用户产生的数据不会被复制。支持配置多个被过滤的用户信息。
被过滤的用户需要在源数据库中定义,如果用户不存在,会产生Warn日志,但逻辑复制将继续进行。
建议将源端数据库中为逻辑复制服务创建的LREP用户配置在过滤用户列表中,这样可过滤掉LREP操作表产生的日志,因此可提高逻辑复制性能。
定义该复制关系中的模型映射,由多个tableMapping组成。如果源数据库中的源表和目的数据库中的目标表的表结构一样、表的所有者名称一样、表名一样,则无需为该表配置表映射关系,只需要打开这个表的逻辑复制开关即可复制该表数据。如果源数据库中的源表和目的数据库中的目标表的所有者名称或者表名不一样,则为该表配置表映射关系时,只配置“<tableMapping dstTable="orders2018" dstSchema="zuser" srcTable="orders" srcSchema="zuser">”即可,无需配置字段映射关系。
定义模型映射中的一个表映射关系,包括源表名、源schema名、目标表名、目标schema名,并由多个字段映射关系组成。
如果一个表中的字段不需要全部复制,那么用户可以只为需要复制字段定义字段映射关系。如果一张表的字段数量较大,并且只有个别字段无需复制,那么用户只需在模型映射中将需要忽略的字段映射关系配置在<ignoreUpdatecolumns></ignoreUpdatecolumns>标签或<ignoreInsertcolumns></ignoreInsertcolumns>标签中即可。
<ignoreUpdatecolumns></ignoreUpdatecolumns>标签、<ignoreInsertcolumns></ignoreInsertcolumns>标签和<column>标签之中,<ignoreInsertcolumns></ignoreInsertcolumns>标签的优先级最高。
定义一个源表和其目标表的字段映射关系,包括源字段名、源字段类型、目标字段名、目标字段类型。建议源字段名和目标字段名相同,源字段类型和目标字段类型相同。
对于主键字段,需要同时定义isKey="true" ,当没有isKey定义时,缺省为false。
:wq假设已配置datasource.properties和repconf_db.xml文件的服务器IP为192.168.0.1。
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/conf /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/
root@192.168.0.1's password:
datasource.xml 100% 667 0.7KB/s 00:00
init.properties 100% 760 0.7KB/s 00:00
key2.properties 100% 100 0.1KB/s 00:00
key1.properties 100% 38 0.0KB/s 00:00
repconf_db.xml 100% 850 0.8KB/s 00:00
log4j.xml 100% 3449 3.4KB/s 00:00scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/lib /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/打开表逻辑复制开关和全局逻辑复制开关。
全局逻辑复制开关需要在源分布式数据库的每个主备DN上分别打开。
--在主备DN上执行如下命令,分别打开主备DN的全局逻辑复制开关。
zsql omm@127...1:40000 -c "ALTER DATABASE ENABLE_LOGIC_REPLICATION ON;"
Please enter password:
***********omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
zsql omm@127.0.0.1:8000 -c "ALTER TABLE [schema_name.]table_name ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;"
Please enter password:
***********omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
假设使用浮动IP为192.168.5.6,DN端口号是40000。
zsql omm@192.168.5.6:40000 -c "ALTER TABLE [schema_name.]table_name ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;"
Please enter password:
***********omm为安装后创建的系统管理员,其默认密码是gaussdb_123。

zsql omm@127.0.0.1:40000
Please enter password:
***********SELECT lrep_point, lrep_mode FROM sys.DV_DATABASE;
--主机上全局逻辑复制开关状态查询结果如下:
LREP_POINT LREP_MODE
-------------------- --------------------
-2-7545-5d62 ON
1 rows fetched.
--备机上全局逻辑复制开关状态查询结果如下:
LREP_POINT LREP_MODE
-------------------- --------------------
-2-422-50b ON
1 rows fetched.
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
zsql omm@192.168.5.6:40000
Please enter password:
***********假设使用的CN端口号是8000。
zsql omm@127.0.0.1:8000
Please enter password:
***********
SELECT l.status FROM sys.logic_rep$ l, sys.table$ t WHERE t.name='ORDERS' AND t.id=l.table#;SQL>
STATUS
------------
1
1 rows fetched.
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.

STATUS
------------
0 rows fetched.cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep启动逻辑复制服务。

startup.sh和shutdown.sh脚本需要使用数据库安装帐号运行。
sh startup.sh -n logicrep -a -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视图获得。
zsql omm@127.0.0.1:8000 -c "SELECT id, committed_scn, logpoint, update_time FROM lrep.logicrep_progress;"
Please enter password:
***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
假设使用浮动IP为192.168.5.6,DN端口号是40000。
zsql omm@192.168.5.6:40000 -c "SELECT id, committed_scn, logpoint, update_time FROM lrep.logicrep_progress;"
Please enter password:
***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
用户可定期查看log目录下的日志,以便检查是否有error级别的错误,及时发现问题并解决问题,同时,通过查看性能日志,可确认是否有性能问题,进而通过调整启动参数来提高性能。仅在主DN上根据需要进行逻辑复制的例行性检查即可。
cd /opt/software/tools/GaussDB_100_1.0.1-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 successfullysh startup.sh -n logicrep -a -2-1ddc00-1ddce4-c27 -c
-c参数指定放弃之前的复制进度,从-a参数指定的起始点开始重新复制。使用该方式重启逻辑复制服务时,从起始点开始的所有逻辑日志将重新被解析、复制数据到目标数据库,如果目标数据库中已经存在部分复制数据,会造成冲突。因此该重启逻辑复制服务方式只在某些异常处理场景,如需要强制重新复制的场景中使用,使用前需确认目标数据库中的部分数据已经被清理、或冲突不影响业务流程。
启动参数保存在init.properties文件中。在首次配置逻辑复制服务时,启动参数可使用默认配置,后续可以通过观察性能日志的缓存高水位确定是否修改启动参数。参数修改需要重启逻辑复制服务生效。
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/confvi 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=回放线程个数。根据可并发事务大小评估,在性能要求不高的场景下,使用默认配置,即单线程回放。
所使用的回放类。当用户基于逻辑复制的SDK实现自定义插件时,需配置为实现的回放类类名。
工作队列大小。根据可并发事务大小评估,在性能要求不高的场景下,使用默认配置即可。
事务缓存最大存放事务个数。当缓存满时,将等待回放线程处理。初始时使用默认配置。后续可以通过观察性能日志的缓存高水位进行调整。
每个事务占用的最大内存空间,当某个事务超过默认配置值的时候,会导致逻辑复制失败,这个时候可以调大该参数值,确保占用大内存的事务可以正确地进行逻辑复制。
logentry缓存大小。初始时使用默认配置。后续可以通过观察性能日志的缓存高水位进行调整。
保存回放进度的时间间隔。建议使用默认配置。设置过小可能导致频繁保存进度、影响性能。
物理日志解析及回放进度存放位置。用于存放逻辑复制服务当前解析到的物理日志的位置、和最新提交到目标数据库的事务SCN。仅支持配置为sourcedb,表示逻辑复制服务的进度信息保存在源数据库中创建的逻辑复制服务用户的逻辑复制进度表,即LOGICREP_PROGRESS表中。
指定存放在源数据库中逻辑复制进度表的版本。老版本逻辑复制进度表的字段包括:ID、COMMITTED_SCN、LOGPOINT、UPDATE_TIME。升级后的逻辑复制进度表增加COMMITTED_TX_TIME字段,用v2版本号标识。
对于已上线运行的逻辑复制服务,可不指定该参数、或指定该参数为“v1”,表示源数据库中逻辑复制进度表为老版本。
对于新上线的逻辑复制服务,逻辑复制安装包的参数文件中该参数缺省已指定为“v2”,源数据库中的逻辑复制进度表将按新版本的表结构创建。
指定数据存储在内存中时采用大端模式还是小端模式,此处的大小端配置是指产生逻辑复制工具需要使用的日志文件的机器的大小端。采用大端模式存放数据时,数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;采用小端模式存放数据时,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
指定keyStore文件路径,该路径中包括文件名。仅在配置“useSSL=true”时且需要认证客户端时使用该参数。
指定keyStore密码的密文。仅在配置“useSSL=true”时且需要认证客户端时使用该参数。该密文的生成方式请参见操作步骤-配置并启动逻辑复制的步骤4。
指定trustStore文件路径,该路径中包括文件名。仅在Oracle配置SSL时使用该参数。
指定trustStore密码的密文。仅在Oracle配置SSL时使用该参数。该密文的生成方式请参见操作步骤-配置并启动逻辑复制的步骤4。
假设已配置datasource.properties和repconf_db.xml文件的服务器IP为192.168.0.1。
root@192.168..1's password:
datasource.xml 100% 667 0.7KB/s 00:00
init.properties 100% 760 0.7KB/s 00:00
key2.properties 100% 100 0.1KB/s 00:00
key1.properties 100% 38 0.0KB/s 00:00
repconf_db.xml 100% 850 0.8KB/s 00:00
log4j.xml 100% 3449 3.4KB/s 00:00scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/lib /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/conf /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/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 successfullysh startup.sh -n logicrep -a -2-1ddc00-1ddce4-c27 -c
-c参数指定放弃之前的复制进度,从-a参数指定的起始点开始重新复制。使用该方式重启逻辑复制服务时,从起始点开始的所有逻辑日志将重新被解析、复制数据到目标数据库,如果目标数据库中已经存在部分复制数据,会造成冲突。因此该重启逻辑复制服务方式只在某些异常处理场景,如需要强制重新复制的场景中使用,使用前需确认目标数据库中的部分数据已经被清理、或冲突不影响业务流程。
逻辑复制源数据库和目标数据库的环境信息发生变化时,如ds.url发生变化、修改逻辑复制用户的密码,用户需要修改datasource.xml文件。datasource.xml文件的修改需要重启逻辑复制服务生效。
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf
vi datasource.properties
需要将源分布式数据库的所有主备DN上数据库信息和目标数据库信息配置在datasource.properties文件中,每个DN上数据库对应一个[srcdb]或[dstdb]小节,同时,由于主备DN的端口号可能不一致,建议将ip配置为DN所在服务器的实际ip,不使用回环地址127.0.0.1表示该DN部署在本地服务器上。斜体表示需要替换为实际值。其中,用户密码密文的生成请参考操作步骤-配置并启动逻辑复制的步骤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
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf/topicconf打开topic_table.properties文件,并按i进入编辑模式。
vi topic_table.properties以下配置仅为示例,示例中的*为通配符。其中,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=*.*
假设已配置datasource.properties和repconf_db.xml文件的服务器IP为192.168.0.1。
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/conf /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/
root@192.168.0.1's password:
datasource.xml 100% 667 0.7KB/s 00:00
init.properties 100% 760 0.7KB/s 00:00
key2.properties 100% 100 0.1KB/s 00:00
key1.properties 100% 38 0.0KB/s 00:00
repconf_db.xml 100% 850 0.8KB/s 00:00
log4j.xml 100% 3449 3.4KB/s 00:00
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/lib /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/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 successfullysh startup.sh -n logicrep -a -2-1ddc00-1ddce4-c27 -c-c参数指定放弃之前的复制进度,从-a参数指定的起始点开始重新复制。使用该方式重启逻辑复制服务时,从起始点开始的所有逻辑日志将重新被解析、复制数据到目标数据库,如果目标数据库中已经存在部分复制数据,会造成冲突。因此该重启逻辑复制服务方式只在某些异常处理场景,如需要强制重新复制的场景中使用,使用前需确认目标数据库中的部分数据已经被清理、或冲突不影响业务流程。
用户可根据需要在repconf_db.xml文件中修改已配置的表映射关系,也可以为新建的表添加表映射关系。repconf_db.xml文件的修改需要重启逻辑复制服务生效。
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf/repconf
vi repconf_db.xml源数据库到目标数据库逻辑复制相关的所有信息均通过复制关系定义文件描述,并以xml格式存放在conf/repconf目录下。一个复制关系对应一个DN的逻辑复制服务,因此,如果为多个DN配置逻辑复制服务,则需要分别为每个DN配置复制关系定义文件。
<?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>复制关系的名称,作为复制关系的唯一标识和复制进程启动时的命令行参数,以指定需要进行复制的内容。
当conf/repconf目录下存在多个定义文件时,要求名称必须唯一。
指定复制的源数据库名称和目标数据库名称,该名称需在datasource.properties中存在定义。
指定需要被过滤信息的用户。进行逻辑复制时,由该用户产生的数据不会被复制。支持配置多个被过滤的用户信息。
被过滤的用户需要在源数据库中定义,如果用户不存在,会产生Warn日志,但逻辑复制将继续进行。
建议将源端数据库中为逻辑复制服务创建的LREP用户配置在过滤用户列表中,这样可过滤掉LREP操作表产生的日志,因此可提高逻辑复制性能。
定义该复制关系中的模型映射,由多个tableMapping组成。如果源数据库中的源表和目的数据库中的目标表的表结构一样、表的所有者名称一样、表名一样,则无需为该表配置表映射关系,只需要打开这个表的逻辑复制开关即可复制该表数据。如果源数据库中的源表和目的数据库中的目标表的所有者名称或者表名不一样,则为该表配置表映射关系时,只配置“<tableMapping dstTable="orders2018" dstSchema="zuser" srcTable="orders" srcSchema="zuser">”即可,无需配置字段映射关系。
定义模型映射中的一个表映射关系,包括源表名、源schema名、目标表名、目标schema名,并由多个字段映射关系组成。
如果一个表中的字段不需要全部复制,那么用户可以只为需要复制字段定义字段映射关系。如果一张表的字段数量较大,并且只有个别字段无需复制,那么用户只需在模型映射中将需要忽略的字段映射关系配置在<ignoreUpdatecolumns></ignoreUpdatecolumns>标签或<ignoreInsertcolumns></ignoreInsertcolumns>标签中即可。
<ignoreUpdatecolumns></ignoreUpdatecolumns>标签、<ignoreInsertcolumns></ignoreInsertcolumns>标签和<column>标签之中,<ignoreInsertcolumns></ignoreInsertcolumns>标签的优先级最高。
定义一个源表和其目标表的字段映射关系,包括源字段名、源字段类型、目标字段名、目标字段类型。建议源字段名和目标字段名相同,源字段类型和目标字段类型相同。
对于主键字段,需要同时定义isKey="true" ,当没有isKey定义时,缺省为false。
zsql omm@127.0.0.1:8000 -c "ALTER TABLE [schema_name.]table_name ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;"
Please enter password:
***********omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
假设使用浮动IP为192.168.5.6,DN端口号是40000。
zsql omm@192.168.5.6:40000 -c "ALTER TABLE [schema_name.]table_name ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;"
Please enter password:
***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
假设已配置datasource.properties和repconf_db.xml文件的服务器IP为192.168.0.1。
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/conf /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/
root@192.168.0.1's password:
datasource.xml 100% 667 0.7KB/s 00:00
init.properties 100% 760 0.7KB/s 00:00
key2.properties 100% 100 0.1KB/s 00:00
key1.properties 100% 38 0.0KB/s 00:00
repconf_db.xml 100% 850 0.8KB/s 00:00
log4j.xml 100% 3449 3.4KB/s 00:00
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/lib /opt/software/tools/GaussDB_100_1..1-LOGICREP/logicrep/停止修改信息的逻辑复制服务。
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 successfullysh startup.sh -n logicrep -a -2-1ddc00-1ddce4-c27 -c-c参数指定放弃之前的复制进度,从-a参数指定的起始点开始重新复制。使用该方式重启逻辑复制服务时,从起始点开始的所有逻辑日志将重新被解析、复制数据到目标数据库,如果目标数据库中已经存在部分复制数据,会造成冲突。因此该重启逻辑复制服务方式只在某些异常处理场景,如需要强制重新复制的场景中使用,使用前需确认目标数据库中的部分数据已经被清理、或冲突不影响业务流程。
逻辑复制在对当前支持的数据源提供复制能力外,也提供软件开发工具包(SDK),支持用户开发符合其自身需求的复制插件。该复制插件可被逻辑复制服务调用,满足用户的定制化要求。
逻辑复制提供的SDK开发包在逻辑复制安装包GaussDB_100_1.0.0-TOOLS/GaussDB_100_1.0.1-LOGICREP.tar.gz的lib目录下,命名为:com.huawei.gauss.logicrep.sdk-1.0.0SPC100B200.jar,其中的版本号在实际版本打包时决定。用户在开发插件时,需引用该jar包。
SDK包中提供用于回放SQL的回调函数接口以及各类数据获取接口,如下所示。该SDK包与逻辑复制框架完全解耦。
public interface LogicrepPlugin
{
/**
* 插件配置
* @param 插件上下文,可从其中获取各类信息,如:元数据/配置等
* LogicRepContext
*/
public abstract void configure(LogicRepContext context) throws Exception;
/**
* 插件初始化
*
* @throws Exception
* 初始化错误
*/
public abstract void init() throws Exception;
/**
* 插件退出
*/
public abstract void exit() throws Exception;
}
public interface Replayer extends LogicrepPlugin {
/**
* 回放事务
* @param trx
* 包含源端数据库一个完整事务
* @return
* true - 事务被执行成功返回
* false - 事务因为各种原因未被执行,如未获取到连接
* @throws Exception
* 事务发生任何执行错误
*/
boolean replay(Transaction trx) throws Exception;
}相关函数说明如下:
configure():接收由逻辑复制框架提供的插件上下文,以获取各类配置类信息和元数据类信息。
init():实现插件的初始化逻辑,由逻辑复制框架在插件加载时调用。
exit():实现插件的退出逻辑,由逻辑复制框架在插件退出时调用。
replay():插件主体逻辑,实现对数据的定制化处理。
用户可通过实现以上四个函数对事务对象数据进行处理,以完成定制的复制功能,例如,持久化数据到文件、复制数据到逻辑复制服务目前尚不支持的其它目标数据源。
为实现回放插件,用户需要实现SDK包中提供的回放接口,并在实现类中完成每条事务数据的回放逻辑,如:将事务数据写入文本文件、复制数据到特定的第三方数据源等。
实现replayer的样例如下:
public class kafkaReplayerDemo implements Replayer {
@Override
public void configure(LogicRepContext context) throws Exception
{
// TODO Auto-generated method stub
}
@Override
public void init() throws Exception
{
// TODO Auto-generated method stub
}
@Override
public void exit() throws Exception
{
// TODO Auto-generated method stub
}
@Override public boolean replay(Transaction trx) throws Exception
{
int entriesSize = trx.logEntrySize();
long scn = trx.getTrxSCN();
for (int i = 1; i < entriesSize; i++)
{
LogEntry entry = trx.getLogEntry(i);
if (!entry.isDML())
{
continue;
}
LogEntryDML entry1 = (LogEntryDML) entry;
if (entry.getLogEntryType() == LogEntryDML.LOGENTRY_TYPE_INSERT)
{
LogEntryInsert insertEntry = (LogEntryInsert) entry1;
HashMap<Integer, Column> columns = insertEntry.getColumns();
insertEntry.getUserID();
insertEntry.getTableID();
}
}
return true;
}
}在插件代码需要读取数据源的属性值时,可以首先通过LogicRepContext接口提供的getConfigInfo()获得ConfigInfo对象,并进一步获取对应数据源的DataSourceInfo对象,然后通过get接口使用属性名称读取对应的属性值。
plugin路径是/opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/plugin。
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/confvi init.properties
#specify which kind of replayer is used replayer.class=com.huawei.gauss.logicrep.replayer.SampleReplayer
逻辑复制支持对不冲突的多个事务进行并发回放,用户可通过配置replayer.thread.number设置启动的回放线程个数,当逻辑复制解析出一组可并发事务时,会将事务分发给各回放线程。
配置该属性时,需要评估事务并发处理是否满足具体的业务场景以及业务可能的事务并发量。
#unit: number of replayer threads #value range:[1,32] replayer.thread.number=1
cd /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/confvi datasource.properties
# 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
假设已配置datasource.properties和repconf_db.xml文件的服务器IP为192.168.0.1。
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/conf /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/lib /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/plugin /opt/software/tools/GaussDB_100_1.0.1-LOGICREP/logicrep/
cd /opt/software/tools/GaussDB_100_1.0.1-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视图获得。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3120073/ ,如需转载,请注明出处,否则将追究法律责任。