canal springboot客户端监控多个数据库

项目场景:

项目中遇到了需要用canal监控多个数据库的场景,刚开始使用canal,防止忘了,特此备注一下。


问题描述:

尝试了canal.properties中的canal.destinations配置多个实例,然后在java项目中通过两个类分别监控,但是在通过CanalConnectors.newSingleConnector创建链接的时候,只能创建一次。因为项目进度比较赶,先通过如下方式实现,等有空学习一下canal之后,下一版本再进行优化。
初步搭建,为了效率和节省开支,使用了单例模式,暂时不搭建canal和zookeeper集群。


解决方案:

通过一个CanalConnector监控一个实例“example”,然后将实例改为分组模式,通过在一个配置文件中配置多个数据库信息,来实现同时监控多个数据库。

  1. 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
    
  2. 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.*
    
    
  3. 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>
    
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一个Channel的客户端可以连接多个Channel服务端的不同destination。当一个Channel的客户端与服务端建立连接后,它可以通过指定不同的destination来与服务端的不同资源进行通信。 在这种情况下,客户端可以使用同一个Channel来发送数据给不同的服务端目的地。客户端可以通过在发送的消息中包含目的地的标识符来告知服务端要将该消息发送到哪个具体的destination上。这样一来,客户端可以通过同一个Channel与多个服务端的不同destination进行通信。 使用一个Channel连接多个服务端destination有助于简化整体的系统架构,减少资源的消耗,并提高系统的灵活性和可扩展性。客户端只需维护一个Channel的连接,并通过指定不同的destination来与不同的服务端资源进行交互,不需要为每个destination创建单独的连接。 例如,一个企业的消息发布系统可以使用一个Channel的客户端连接多个消息消费者的服务端destination。当企业需要发布消息时,客户端可以选择将消息发送到特定的消息消费者destination,而不需要为每个消费者创建独立的Channel连接。 总的来说,一个Channel的客户端可以连接多个服务端的不同destination,从而使得客户端与服务端之间的通信更加灵活和高效。这种架构设计可以根据具体的需求来灵活配置和管理系统资源,提供更好的性能和扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值