项目场景:
项目中遇到了需要用canal监控多个数据库的场景,刚开始使用canal,防止忘了,特此备注一下。
问题描述:
尝试了canal.properties中的canal.destinations配置多个实例,然后在java项目中通过两个类分别监控,但是在通过CanalConnectors.newSingleConnector创建链接的时候,只能创建一次。因为项目进度比较赶,先通过如下方式实现,等有空学习一下canal之后,下一版本再进行优化。
初步搭建,为了效率和节省开支,使用了单例模式,暂时不搭建canal和zookeeper集群。
解决方案:
通过一个CanalConnector监控一个实例“example”,然后将实例改为分组模式,通过在一个配置文件中配置多个数据库信息,来实现同时监控多个数据库。
-
canal.properties修改
#destinations只需要一个 canal.destinations = example #注释掉原来的xml文件,引用分组的xml文件 #canal.instance.global.spring.xml = classpath:spring/file-instance.xml canal.instance.global.spring.xml = classpath:spring/group-instance.xml
-
canal.deployer-1.1.5/conf/example/instance.properties修改
#数据库1地址 canal.instance.master1.address=127.0.0.1:3306 #需要读取的起始binlog文件 canal.instance.master1.journal.name= #需要读取的起始binlog文件的偏移量 canal.instance.master1.position= canal.instance.master1.timestamp= canal.instance.master1.gtid= #数据库2地址 canal.instance.master2.address=127.0.0.1:3306 #需要读取的起始binlog文件 canal.instance.master2.journal.name= #需要读取的起始binlog文件的偏移量 canal.instance.master2.position= canal.instance.master2.timestamp= canal.instance.master2.gtid= #数据库1 账号密码 canal.instance.master1.dbUsername=test canal.instance.master1.dbPassword=test #数据库2 账号密码 canal.instance.master2.dbUsername=test canal.instance.master2.dbPassword=test #每个数据库对应自己的规则 canal.instance.master1.filter.regex=first.* canal.instance.master2.filter.regex=second.*
-
canal.deployer-1.1.5/spring/group-instance.xml修改
<bean id="eventParser1" parent="baseEventParser"> ...... <!-- 解析过滤处理 此处修改成上一步的规则--> <property name="eventFilter"> <bean class="com.alibaba.otter.canal.filter.aviater.AviaterRegexFilter" > <constructor-arg index="0" value="${canal.instance.master1.filter.regex:retl}" /> </bean> </property> <!-- 解析数据库信息( ${}中的值与第一步的保持相同) --> <property name="masterInfo"> <bean class="com.alibaba.otter.canal.parse.support.AuthenticationInfo" init-method="initPwd"> <property name="address" value="${canal.instance.master1.address}" /> <property name="username" value="${canal.instance.master1.dbUsername:retl}" /> <property name="password" value="${canal.instance.master1.dbPassword:retl}" /> <property name="pwdPublicKey" value="${canal.instance.pwdPublicKey:retl}" /> <property name="enableDruid" value="${canal.instance.enableDruid:false}" /> <property name="defaultDatabaseName" value="${canal.instance.defaultDatabaseName:}" /> </bean> </property> ...... </bean> <bean id="eventParser2" parent="baseEventParser"> ...... <!-- 解析过滤处理 --> <property name="eventFilter"> <bean class="com.alibaba.otter.canal.filter.aviater.AviaterRegexFilter" > <constructor-arg index="0" value="${canal.instance.master2.filter.regex:retl}" /> </bean> </property> <!-- 解析数据库信息 --> <property name="masterInfo"> <bean class="com.alibaba.otter.canal.parse.support.AuthenticationInfo" init-method="initPwd"> <property name="address" value="${canal.instance.master2.address}" /> <property name="username" value="${canal.instance.master2.dbUsername:retl}" /> <property name="password" value="${canal.instance.master2.dbPassword:retl}" /> <property name="pwdPublicKey" value="${canal.instance.pwdPublicKey:retl}" /> <property name="enableDruid" value="${canal.instance.enableDruid:false}" /> <property name="defaultDatabaseName" value="${canal.instance.defaultDatabaseName:}" /> </bean> </property> ...... </bean>