建立逻辑复制(主备/分布式部署模式)
操作场景
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表示本地登录CN/DN,如果远程登录请输入要登录的CN/DN所在主机的IP。
- 8000为CN端口号。
- 40000为使用逻辑复制服务的DN的端口号。
- 在所有DN节点上,解压安装逻辑复制工具。
该步骤下的1 - 7需要在所有DN节点上并行进行。
- 以数据库安装用户身份登录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:启动参数配置文件
- 在源分布式数据库中任意部署有DN的节点上,配置逻辑复制服务进程的启动参数。
- 进入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以分布式部署时。
- 登录每个CN所在服务器。
- 以clsmgr身份登录每个CN上的数据库。
zsql / as clsmgr -D cn_data_dir
- 在每个CN上的数据库里执行如下SQL语句。
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;
- 以sysdba身份登录每个主DN所在服务器。
zsql / as sysdba -D dn_data_dir
- 在每个主DN上的数据库里执行如下SQL语句。
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
- 源数据库以主备模式部署时。
- 登录每个主DN所在服务器。
- 以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。
- 分布式部署时:
假设使用的CN端口号是8000。
zsql omm@127.0.0.1:8000 Please enter password: ***********
- 主备部署时:
假设使用浮动IP为192.168.5.6,DN端口号是40000。zsql omm@192.168.5.6: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时。
- GaussDB 100以分布式部署。
- 以omm用户身份登录GaussDB 100任意CN所在服务器。
- 通过CN端口连接数据库,创建用户。
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: ***********
- GaussDB 100以主备模式部署。
- 以omm用户身份登录GaussDB 100所在的任意服务器。
- 通过端口连接数据库,创建用户。
假设使用浮动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: ***********
- 目标数据库是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上使用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。
- 在源分布式数据库中配置启动参数(init.properties文件)的节点上,在conf/datasource.properties配置文件中定义逻辑复制服务相关的源数据库、目标数据库信息。
- 进入conf目录。
cd /opt/software/tools/GaussDB_100_1.0.0-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.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=*.*
- 在配置conf/datasource.properties配置文件的节点上,在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目录下。一个复制关系对应一个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>
其中,相关标签解释如下:- 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
- 将修改后的conf文件夹和lib文件夹复制到源分布式数据库所有部署DN的节点上。
- 以omm身份登录除了已配置datasource.properties和repconf_db.xml文件之外的部署GaussDB 100的所有服务器上。
- 复制conf文件夹和lib文件夹到上述服务器。
假设已配置datasource.properties和repconf_db.xml文件的服务器IP为192.168.0.1。
scp -r root@192.168.0.1:/opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/conf /opt/software/tools/GaussDB_100_1.0.0-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.0.0-LOGICREP/logicrep/lib /opt/software/tools/GaussDB_100_1.0.0-LOGICREP/logicrep/
- 打开表逻辑复制开关和全局逻辑复制开关。
- 打开全局逻辑复制开关。
全局逻辑复制开关需要在源分布式数据库的每个主备DN上分别打开。
--在主备DN上执行如下命令,分别打开主备DN的全局逻辑复制开关。 zsql omm@127.0.0.1:40000 -c "ALTER DATABASE ENABLE_LOGIC_REPLICATION ON;" Please enter password: ***********
omm为安装后创建的系统管理员,其默认密码是gaussdb_123。
- 打开表逻辑复制开关。表逻辑复制开关则只需要在主DN上打开即可,备DN上的表逻辑复制开关会和主DN上的表逻辑复制开关同步打开。
- 源数据库以分布式模式部署时,通过CN端口打开表逻辑复制开关。
- 源数据库以分布式模式部署时,通过CN端口打开表逻辑复制开关。
- 打开表逻辑复制开关。表逻辑复制开关则只需要在主DN上打开即可,备DN上的表逻辑复制开关会和主DN上的表逻辑复制开关同步打开。
- 打开表逻辑复制开关和全局逻辑复制开关。
- 将修改后的conf文件夹和lib文件夹复制到源分布式数据库所有部署DN的节点上。
- 打开repconf_db.xml文件,并按i进入编辑模式。
- 打开topic_table.properties文件,并按i进入编辑模式。
- 进入topicconf目录。
- 打开datasource.properties文件,并按i进入编辑模式。
- 进入conf目录。
- 进入逻辑复制的密钥配置文件目录。
- 在源分布式数据库的任一节点上,为源数据库和目标数据库中逻辑复制服务使用的用户生成密码密文。
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
- 创建用户。
- 目标数据库是Oracle时。
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
- GaussDB 100以主备模式部署。
- 赋予该用户对所有逻辑复制的目的表的增、删、改权限。
- GaussDB 100以分布式部署。
- 目标数据库是GaussDB 100时。
- 主备部署时:
- 使用数据库管理员登录数据库。
- 执行以下命令。
- 在每个主DN上的数据库里执行如下SQL语句。
- 在每个CN上的数据库里执行如下SQL语句。
- 源数据库GaussDB 100以分布式部署时。
- 赋予数据库管理员读取相关系统表和视图的权限。
- 为源数据库GaussDB 100逻辑复制服务创建配置用户。
- 打开init.properties文件,并按i进入编辑模式。
- (可选)如果目标数据库是Oracle,请在Oracle官网上下载对应版本的ojdbc驱动,并将其上传至logicrep/lib目录下。
- 进入GaussDB_100_1.0.0-LOGICREP目录。