# datatranslator **Repository Path**: dunsk/datatranslator ## Basic Information - **Project Name**: datatranslator - **Description**: 实时数据同步工具 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2024-08-13 - **Last Updated**: 2025-01-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 背景 公司需要把生产的数据从生产库同步至备份库,只同步个别的表,有些表要求同步增删改,有些表只同步增和改,不同步删除;另外针对一些大表还要求按月拆分。 调研了一些开源的同步工具,如canal、debezium、maxwell、bifrost、etlcloud等,发现这些工具并不能满足我们的需求。 bifrost功能比较接近,基本上能够满足我们的需求,但是bifrost的要求用户具有super权限和event等权限,由于生产数据库为腾讯云数据库,无法赋予用户这些权限,因此决定自己开发一个同步工具。 # 产品特点 ## 一、提供的功能特性 1. 一对一库的同步,选择同步表,支持按月拆分。 2. 基于gtid同步,支持mysql和mariadb,已基于mariadb调试通过,并在生产运行。 3. 可以同步表的insert、delete、update操作,以及create、drop、alter等操作。 4. 可以把源库的DDL操作记录到从库的某张表中去,表名支持自定义配置 5. 使用内嵌mq缓存写入数据,即保存了数据不丢失,又解决了写入不同步的问题。内嵌mq将数据缓存到本地,当程序退出时,mq中的数据会自动写入到本地文件中,下次启动时,会自动恢复到mq中,继续程序处理。 6. 支持无主键的表同步 7. 支持正则表达式匹配表名。 7. 支持拆分表,可以根据源表中的数据拆分到不同的目标表中去,比如根据日期拆分数据到不同的表。 ## 二、对比Debezium的优点 1. datatrans项目资源占用更少;Debezium基于Kafka实现的同步工具,因此必须安装debezium、kafka、zookeeper、debezium jdbc等多个套件,占用资源较多,不适合小项目的同步。datatrans为了解决写入速度不一致的问题,也引入了mq,但是那只是一个类mq的java工具,有点像List,只是比List多了磁盘存储和先进先出的功能,而且单个队列最多占用内存50M, 多出来的部分将会存入磁盘中去。 1. 功能更强大,debezium支持同步表和字段;我们的工具除此之外,还支持正则表达式同步、数据拆分同步,另外还可以将DDL的历史操作入库。 1. 配置更为灵活易懂,我们的数据同步配置主要就在tables-config.csv中进行,主要是两个库中的表对照,清晰明了。Debezium的配置分散各处,不易理解。 # 快速开始 1. 下载源码到本地 ``````shell git clone https://gitee.com/dunsk/datatranslator.git cd datatranslator `````` 1. 启动测试数据库 ```shell sudo apt install -y docker.io sudo apt install -y docker-compose cd database bash mkdir.sh # 删除历史文件 sudo rm -rf masterbinlog/* slavebinlog/* masterdata/* slavedata/* # 给予合适的权限,避免权限不足导致无法创建文件夹,cnf权限过大也会导致数据库启动设置失败 sudo chmod 777 masterbinlog/ slavebinlog/ masterdata/ slavedata/ chmod 644 master.cnf slave.cnf # 启动容器 sudo docker-compose -f mariadb-compose.yml up -d # 查看运行状态 sudo docker-compose -f mariadb-compose.yml ps ``` 上面步骤执行完成后,连接数据库,主库和从库的账号位于mariadb-compose.yml;执行 database目录中的init.sql 脚本,注意里面包括了主库和从库的不同脚本。 此脚本主要用于测试验证程序的主从同步功能,项目并不依赖它。 2. 配置配置文件 安装程序依赖环境 * 安装jdk11,设置环境变量JAVA_HOME * 安装maven,配置环境变量MAVEN_HOME,并把bin目录加入到Path变量中去 * 进入项目根目录,执行 mvn -Dmaven.test.skip=true clean package 3. 启动同步程序 ```shell bash start.sh # 如果后台启动,则执行 nohup bash start.sh > logs/log.out 2>&1 & ``` 4. 测试 在主库,插入数据,观察从库的变化 # 工作流程 ![流程图](doc/datatrans_pic.png) # 配置说明 ## 同步表数据 完成下面的4个步骤配置后,就可以部署生产了,或者直接源码启动测试相关情况。生产的部署办法 见最后的小节 “生产环境部署“。 ### <1> 配置源库账号 打开文件datatrans-starter/src/main/resources/application.yml ,修改debezium相关的配置项。主要文件内容如下: ```yml debezium: # 数据库连接器,如果是mariadb使用 io.debezium.connector.mariadb.MariaDbConnector # 如果是mysql数据库,则使用 io.debezium.connector.mysql.MySqlConnector connector.class: io.debezium.connector.mariadb.MariaDbConnector database: server: # 当前程序的id,因为当前程序是做为mysql的一个从库运行的,这里指定的是数据库从库的serverId,不能与源库以及其它库重复。 id: 5744 # 源数据库的IP hostname: localhost # 源数据库的端口号 port: 4306 # 源数据库的账号,要求账号必须有权限 SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT user: root # 源数据库的密码 password: 123456 ``` ### <2> 配置目标库数据源 打开文件datatrans-starter/src/main/resources/application.yml ,修改spring.datasource相关的配置项。主要文件内容如下: ```yml spring: datasource: # 目标数据库驱动,mariadb数据库是org.mariadb.jdbc.Driver # mysql数据库是 com.mysql.cj.jdbc.driver driver-class-name: org.mariadb.jdbc.Driver # 连接数据库的字串 # mariadb: jdbc:mariadb://localhost:5306/testslave?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true # mysql: jdbc:mysql://localhost:5306/testslave?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true url: "jdbc:mariadb://localhost:5306/testslave?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true" # 目标库账号,要求账号至少有insert,delete,update,create权限,是否具有其它DDL权限,则根据自己的同步目标而定。 username: root # 目标库密码 password: 123456 ``` ### <3> 设置数据存储目录 应用程序需要存储同步的位置点数据,以及mq队列的缓存数据,因此需要配置数据的存储目录。 打开文件datatrans-starter/src/main/resources/application.yml ,修改file相关的配置项。主要文件内容如下: ```yml debezium: # ... 忽略中间配置 file: # schema的变动历史记录 schemaHistory: datas/datatrans/schemahistory.dat # 同步位置点数据 offsetPostion: datas/datatrans/offsets.dat # mq队列缓存数据,每个队列内存中存储50M数据,超过之后存放到文件中 # 应用程序使用kill -15 关闭时,会将内存中的数据自动写入到文件中 mqCacheDir: datas/datatrans/mqCacheDir ``` ### <4> 设置同步表格 1. #### 配置格式 ​ 考虑到数据本身带有主从同步的机制,全库同步或者跳过个别表的黑名单同步方式,数据库本身的功能就能实现。本程序主要的应对场景是针对部分表同步的方案,即白名单的同步机制。白名单同步的表配置在datatrans-starter/src/main/resources/tables-config.csv 文件中。csv是一种格式化的文本文件,使用逗号分隔各个字段,可以使用任意的文本编辑器打开编写,编写后之后,可以使用Excel应用程序打开查看。 ​ 本格式文档共有7个字段,每个字段的含义如下: * sourceTable 源库数据表,全名称表示方式,全小写方式配置,例如同步数据库db下面的t_b1表,则定成 db.t_b1。支持正则表达式的配置方式,正则表达式配置见后面相关章节。 * targetTable 目标库数据表,全名称表示方式,全小写方式配置,例如t_b1的表数据同步到 db2下面的 t_b2 表,则配置为 db2.t_b2。 * ddl 同步哪些ddl语句,可选的有truncate,alter,drop,create等,ddl使用小写字母表示,多个ddl选项使用半角分号";"分隔。 * dml 同步哪些dml语句,可选的dml有insert,delete,update,dml使用小写字母表示,多个dml操作使用半角分号";"分隔。 * splitTable 是否拆分源表数据到多个目标表,填写true或false,非空 * splitField 用来拆分数据的源表中的字段,可以配置多个字段,多个字段之间使用半角的分号分隔,取第一个不为空的字段值做为拆分数据。字段的类型支持日期和字符(varchar, char)等多个类型,理论上支持任意类型,但是目前仅对日期和字符串类型做了测试 。 * splitFieldLength 截取的拆分字段数值长度,取得的数据用来拆分表。比如日期类型,自动转化格式得到的数据是20240910231211,如果截取长度为8,得到的数值将是20240910,那么这一行对应的数据,将会插入到表 db2.t_b2_20240910中去。如果该表不存在,则会根据表db2.t_b2的结构自动创建新表。 2. #### 配置样例 注意第一行为表头,必须包括,不能省略。csv格式不支持注释和注释行,请不要在该配置文件中使用注释。 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.test_table,testslave.test_table,alter;create;truncate,update;insert;delete,false,, testmaster.split_table,testslave.split_table,alter;create,update;insert,true,create_time,8 testmaster.test_nokey,testslave.test_nokey,alter;create;truncate,update;insert;delete,false,, testmaster,testslave,create;alter;drop;truncate,insert;update;delete,false,, testmaster."test_table_p\d+",testslave."$0",create;alter;drop;truncate,insert;update;delete,false,, ``` 3. #### 数据拆分表同步 ​ 数据拆分的目标是将源表中的数据拆分到目标库的多张表中去,根据数据库中的某一个几个进行拆分,目前只做了截取取值法一种拆分方式。同步开始前要先在目标库中创建模板表,模板表用来创建拆分表,要求 表结构跟源表相同。例如源库中的表splite_table要同步到目标库中的split_table_20240912、split_table_20240913等多张表中去,这些带有日期的表就是根据表split_table通过 create table split_table_20240912 like split_table; 这种语法创建 的,而这个时候母板表split_table称为创建其它表的模板表,要求跟源库中的表结构相同,里同并无数据。配置同步的时候,则可以如下设置: ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.split_table,testslave.split_table,alter;create,update;insert,true,create_time,8 ``` ​ 拆分字段截取数据时,首先将字段数据转换字符串,然后再按长度截取。如果拆分的字段是datetime类型或者timestamp类型,则将按照 “yyyyMMddHHmmss“ 去格式化数据,截取值时也按照格式化的值进行。例如上面的例子,配置了字段create_time字段做为拆分字段,datetime类型。如果有一条数据,create_time字段数值是"2024-09-12 23:07:14",则格式化后的值将是"20240912230714",按照配置的8位截取,得到的结果则是20240912,和基础模板表名拼接,创建表 create table if not exist split_table_20240912 like split_table; ,那么这条数据将插入到表split_table_20240912中去。 ​ 有一个特殊情况需要说明一下,比如需要 拆分的字段create_time,如果某一行数据,这个字段的数据是null,由于无法算出来目标表,数据又不能丢弃,因此数据将会插入到没有后缀的模板表中去,按照上面的例子,将会插入到表split_table 中去。 ​ 为了避免null值的情况,我们对配置进行了扩展,允许配置多个字段,取第一个不为空的字段值进行截取;多个字段之间使用分号分隔。继续上面的例子,我们可以配置create_time和update_time两个字段,取第一个不为空的字段值做为路由目标表的依据。配置例子如下 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.split_table,testslave.split_table,alter;create,update;insert,true,create_time;update_time,8 ``` ​ 如果配置的长度,超过了字段真实值的总长度,比如配置了截取长度8, 但是数据库中的数据存储的是2024,只有4个长度,这个时候并不会出现越界的错误,而是取2024整个字串做为目标值,不再截取。这样数据将会到目标表split_table_2024 中去。 ## 同步DDL ​ ddl 的操作也配置在文件 tables-config.csv ,但是跟dml不同的是,ddl操作可以同时操作多个表,比如rename处理;也可以作用范围是在整个库上,而不是单张表,所以针对常见的场景我们分别举例说明,针对不常见的操作,如果不知道如何配置,我也有有一张历史表,记录了影响哪些对象以及操作,可以基于那张表配置。 ### <1> 同步alter、truncate、drop等常规操作 ​ alter、truncate等都是针对单张表的操作,一般都能够具体到表,因此配置的时候直接在 tables-config.csv 中配置到表名就行,例如: 如下配置后 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.test_table,testslave.test_table,alter;truncate,update;insert;delete,false,, ``` 语句 ```sql alter table testmaster.test_table modify test_vc VARCHAR(104) default null ; ``` 将变为在目标库上执行如下语句 ```sql alter table testslave.test_table modify test_vc VARCHAR(104) default null ; ``` 前提是你在表同步的配置上面,配置了同步alter操作。 ### <2> 同步rename 虽然sql语句中有rename命令,但是在同步操作时却是使用的alter命令,即在tables-config.csv文件中需要配置同步alter指令。另外,rename操作同时操作两张表,配置过滤表时,需要配置目标表,或者直接配置到库。 比如这个sql语句 ```sql rename table testmaster.test_table to testmaster.test_table_s1 ; ``` 需要配置表test_table_s1的alter操作,如下 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.test_table_s1,testslave.test_table_s1,alter,update;insert;delete,false,, ``` 或是直接配置到库 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster,testslave,alter,update;insert;delete,false,, ``` 配置到库时,可以同步所有针对库testmaster的alter操作,不管是哪张表。但是这样,当表不存在时,会抛出异常。 ### <3> 同步create 由于binlog存储的原因,create执行时,跟你当前所在的位置关系很大。如果你在执行命令时,使用了use切换数据库,或者在jdbc连接时有了默认数据库,如果创建的语句不带库名,则可以很好的根据表名和库名过滤。比如 ```sql -- 切换数据库 use testmaster ; -- 创建表 create table test_table_p1 like test_table; -- 或者带有当前库的名称的创建 create table testmaster.test_table_p1 like testmaster.test_table; ``` 这个时候,可以根据表名过滤create语句,则tables-config.csv可以进行如下配置 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.test_table_p1,testslave.test_table_p1,create;alter,update;insert;delete,false,, ``` 但是如果切换的库跟创建的表不在同一个库,则不能指定表名。例如 ```sql -- 切换数据库 use testmaster; -- 跨库创建表 create table testm2.table_m2 like testmaster.test_table; ``` 由于进行了跨库操作,这个时候将不能根据表名过滤,则只能根据库名过滤且执行create语句。而且这个库名是当前命令所在的库名不是创建目标 的库名。 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster,testslave,create;alter,update;insert;delete,false,, ``` 注意上面的配置,并不是配置库testm2哟,一定要注意。 还有一种特殊场景,就是无当前所在库执行的命令。比如使用客户端刚登录进来系统时,这时没有使用use 命令切换到任何数据库,如果执行了create命令。这个时候数据库名需要配置成default,否则无法在目标库执行同样的操作。举例如下: ```sql mysql -u root -h 127.0.0.1 --password=123456 -- 这时未指定默认数据库,也未使用use 语句切换数据库 create table test_d1.table_t1 like testmaster.test_table; ``` 由于当前执行命令时,未指定任何库,所以需要配置default库的create语句,如下 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength default,testslave,create;alter;create,,false,, ``` 源库指定为了default,目标库则根据需要指定即可。 ### <4> 同步analyze和optimize ​ 本工具也支持analyze和optimize的同步,同步这些命令的配置方式类似create,需要区分当前命令执行时,所在的库,根据不同场景进行不同的配置。如果不清楚具体的执行场景,则可把相关场景都配置即可,或者根据ddl历史表(后面会讲到)的记录,进行不同的配置。 ​ 由于跟create的配置类似,在此不再赘述。 ### <5> 如何知晓我的同步类型以及源库配置方式 ​ mysql数据库中的操作关键字很多,怎样才能知道我要过滤的表使用哪个ddl关键字过滤呢?过滤的时候放在库上面还是表上面书写呢?为了方便用户掌握处理,我们在同步的时候 ,将所有从主库同步过来的ddl操作都存到了目标库的表datatrans_ddl_record中,不管该ddl语句是否在目标库执行,都会记录到这张表中。当然如果你已经在库中有这张表了,或者不喜欢这个表名,可以配置修改它。例如可以在application.yml中可以这样配置它. ```yml config: sink: # 插入到目标库时,运行的线程数,一般等于主机内核数最佳,不超过内存的2倍比较适宜。 threadCount: 4 # 目标库的类型,目前仅支持mysql,配置mysql是数据库也可以是mariadb consumeType: mysql # 是否记录ddl操作到表,建议开启 recordDDL: true # ddl操作记录到目标库的表名 ddl_tablename: datatrans_ddl_history ``` 配置完成,运行一段时间后,将会有下面的数据生成。 ![ddl_history.png](doc/ddl_history.png) 表中的各个字段解析如下: * id 表格主键,自增 * table_name 源库中的表名,对应配置文件tables-config.csv中的sourceTable字段,可以根据这里的内容对tables-config.csv配置。 * vc_operation 源表的ddl操作名字,对应配置文件tables-config.csv中的ddl字段,可以根据这里的内容对tables-config.csv配置。 * operate_time 源表事件发生时间 * is_executed 该ddl语句是否在目标库执行,通过他检验配置是否生效。 * ddl_sql 源库执行的具体ddl操作,相关的sql语句。 * create_time 目标库同步过来的时间 # 高级篇 ## 正则表达式同步 当需要同步的表比较多时,一个个配置会比较麻烦;另外有些表是随着应用程序运行动态新增的,无法提前使用固定的表名表达出来,这个时候就可以考虑使用正则表达式配置同步。为了区分正常的表名配置,要求配置的正则表达式表名使用双引号插起来;数据库名不支持正则表达式。使用步骤如下: 1. 开启正则表达式匹配开关 在开始使用正则表达式前,需要把配置开关打开,在application.yml文件中,配置内容如下: ```yml config: tableMappingConfig: classpath:tables-config.csv debeziumConfig: classpath:debezium-config.yml source: enabled: true # 可选项:tableName,threadNum queueNameBy: threadNum # 是否表名启动正则表达式匹配,默认false; # 启用后,正则表达式需用双引号括起来,目标表支持占位符$0代表匹配到的源表名,$1代表匹配到的正则表达式中的第一个分组,依此类推。 regTableName: true ``` config.source.regTableName就是需要设置的开关,这个值必须是true才行; 当然config.source.enable的值也必须是true,否则不能消息源数据库的binlog。 2. 配置正则表达式 正则表达式的语法比较复杂,网上资料比较多,再此不再赘述了,想要了解的,可以看下这里介绍的内容[正则表达式](https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215)。这里举例配置下,比如想匹配出所有开头是split_table_,结尾是年月日的表; 数据迁移到表开头是target_table,结尾是年月日的表,则可以进行如下配置。 ```txt sourceTable,targetTable,ddl,dml,splitTable,splitField,splitFieldLength testmaster.test_table,testslave.test_table,alter;create;truncate,update;insert;delete,false,, testmaster."(split_table_)(\d{8})",testslave."target_table_$2",create;alter;drop;truncate,insert;update;delete,false,, ``` 表达式必须用双引号插起来,目标表的规则也必须使用双引号括起来。源表的表达式(split_table_)(\d{8})首先使用小括号把匹配分成了两部分,如果匹配成功,第一个插号中的内容在目标表上可以使用$1代替,第二个括号匹配成功的可以使用$2代表,依此类推。因为我们想把匹配成功的年月日用在目标表上面,所以目标表就使用了表达式target_table\_$2,前面的“target_table” 是固定不变的字符,$2代表前面第二个小插号匹配成功的内容,即年月日,比如有表名是split_table_20240913,则$2的值就是20240913。除了$1, $2代表各个小插号匹配到的内容外,还有个特殊的$0,他代表整个匹配成功的串,举刚才的例子,$1是split_table\_ 、$2是20240913,那么$0就是整个匹配成功的表名split_table_20240913 。如果刚才的例子,同步到目标 库的同名表中,则可以使用表达式 testslave."$0" 代表 。匹配成功后,对表进行增删改时,会自动去掉表名称外面的双引号。 3. 常见问题解答 * 正则表达式模糊匹配和表名的精确匹配可以同时使用吗? 答案是肯定的,是允许同时存在的。两种方式配置的只要一种能匹配成功,就可以同步里面的数据。 * 正则表达式开关启用,但是未配置正则匹配,只配置了按表名的精确匹配,可以吗? 这也是允许的,如果没有配置正则的模糊匹配,则只同步配置的精确表名。 * 正则匹配的开关关闭后,正则表达式的内容必须删除吗? 不需要删除的,如果想保留历史,以备后面需要的时候启用,也是允许的。也就是说,即使配置了正则表达式匹配,如果开关未启用也是不生效的,同时它也不影响正常的按表名精确匹配的运行。 ## 生产环境部署 项目由java代码编写,因此可以运行在几乎任何平台上。但是linux上面运行更稳定,推荐linux部署方式。本例讲解也主要以linux部署方式为主。为了避免应用程序宕机挂掉,生产环境部署时,deamon启动使用supervisor工具运行。具体步骤如下: 1. 在服务器安装supervisor工具 ```sh # 安装过程第一步:安装python工具 yum install -y python-pip #安装过程第二步:安装supervisor程序 pip3 install supervisor # 安装过程第三步:核心确认supervisor是否安装成功 supervisorctl --help ``` 2. 在服务器安装java环境 ```sh # 查看可用java版本 yum search java-11 # 安装java-11 yum install -y java-11-openjdk.x86_64 # 检查安装是否成功 java -version ``` 3. 打包项目 ```sh # 下载源码到服务器中 git clone https://gitee.com/dunsk/datatranslator.git # 进入项目目录编译项目并打包 cd datatranslator mvn clean package -Dmaven.test.skip=true # 将doc中的文件复制到安装路径,比如我们想安装到 /data/datatrans/目录下面,则 cp doc/datatrans.zip /data/ cd /data/mysql unzip datatrans.zip # 退回源码目录,将打包好的文件复制到 部署目录下面 cd - cp datatrans-starter/target/datatrans-starter.jar /data/datatrans/apps/ ``` 4. 配置项目 ```sh # 切换到生产部署目录 cd /data/datatrans # 修改supervisor配置文件 supervisor/supervisord.conf # 需要修改 [unix_http_server] 下面的file配置项,修改socket文件到合适存储位置 # 需要修改 [supervisord] 下面的 logfile 和 pidfile 指定到合适的位置去 # 修改 [supervisord] 下面的 directory 配置项目根目录 # 如果后面发布项目和重启项目并不是root用户操作,同需要修改[supervisord] 下面的 user 配置 vim supervisor/supervisord.conf # 修改启动项目的环境变量 # 修改文件中的 environment 和 directory 配置项,在environment中指定java_home环境变量和项目运行目录;directory指定jar文件所在目录。 vim supervisor/app-conf/app.ini # 修改目标数据库和binlog主库的配置 # 修改配置项 tableMappingConfig 和 debeziumConfig 文件存储目录。 # 修改中件间数据存储位置,配置项:schemaHistory、offsetPostion和mqCacheDir vim apps/config/application.yml # 修改表同步规则, 直接可以使用text编辑器修改 vim apps/config/tables-config.csv # 修改日志存放位置 # 修改存放位置 vim apps/config/logback.xml # 修改重启脚本中,superconfd.conf文件位置 vim apps/restart.sh ``` 5. 启动项目 ```sh # 切换到生产部署目录 cd /data/datatrans # 进入到supervisor配置目录 cd supervisor supervisord -c supervisord.conf ``` 6. 重启项目 ```sh # 切换到生产部署目录 cd /data/datatrans # 方法一,通过项目目录中的restart脚本重启项目 cd apps/ bash restart.sh # 方法二,通过supervisorctl重启 cd /data/datatrans/supervisor supervisorctl restart all ``` 7. 迁移项目 有时有些特殊原因,需要迁移部署;迁移部署时,使用如下步骤,避免数据丢失。 ```sh # 进入项目配置目录,关闭binlog消费 cd /data/datatrans/apps # 将 config.source.enabled=false vim conf/application.yml # 重启项目 ,重启成功后,使用ctrl + c ,关闭日志输出,启动成功 bash restart.sh # 观察消息日志,直到没有新增为止 tail -f logs/sink.log # 按照上面描述的1~5步,在新机器部署项目 # 在新机器启动没有问题后,关闭本地项目。 # 进入supervisor目录,关闭项目 cd /data/datatrans/supervisor supervisorctl stop all ``` # 附录 ## application.yml配置说明 待补充 ## debezium-config.yml 配置说明 待补充