canal的分库分表使用group-instance.xml

1、背景前提

  1. 公司的MySQL数据库是分库分表的,若要是按照一个库(IP)对应一个实例的话,就须要建立10个实例,并且改动还很不方便,一次须要改10个配置文件。因此查到canal自带这种功能;
  2. 对于分库分表的MySQL配置的port,username,password,database,table都是同样的,这个是前提条件;
  3. 最好是用过配置过单实例的。

2、配置

  1. 修改canal.properties文件

    开启group-instance.xml,注释其余的

     
  2. 修改实例配置文件
    # position info
    canal.instance.master1.address=192.168.88.130:3306 #源库1的ip地址
    canal.instance.master1.journal.name=
    canal.instance.master1.position=
    canal.instance.master1.timestamp=
    canal.instance.master1.gtid=
     
    canal.instance.master2.address=192.168.88.129:3306 #源库2的ip地址
    canal.instance.master2.journal.name=
    canal.instance.master2.position=
    canal.instance.master2.timestamp=
    canal.instance.master2.gtid=
    
    canal.instance.master3.address=192.168.88.128:3306 #源库3的ip地址
    canal.instance.master3.journal.name=
    canal.instance.master3.position=
    canal.instance.master3.timestamp=
    canal.instance.master3.gtid=
    此处只列举三个,有多个就一直往下写,其余的配置保持不变。


     
  3. 修改spring/group-instance.xml
    <!-- 多个实例就添加 ,须要添加<ref bean="eventParser3" /> -->
    <bean id="eventParser" class="com.alibaba.otter.canal.parse.inbound.group.GroupEventParser">
                    <property name="eventParsers">
                            <list>
                                    <ref bean="eventParser1" />
                                    <ref bean="eventParser2" />
                                    <ref bean="eventParser3" />
                            </list>
                    </property>
            </bean>
    
    
    
    
    
    <!-- 多个实例就添加 ,须要修改eventParser3,master3,standby3-->
    <bean id="eventParser3" parent="baseEventParser">
                    <property name="destination" value="${canal.instance.destination}" />
                    <property name="slaveId" value="${canal.instance.mysql.slaveId:0}" />
                    <!-- 心跳配置 -->
                    <property name="detectingEnable" value="${canal.instance.detecting.enable:false}" />
                    <property name="detectingSQL" value="${canal.instance.detecting.sql}" />
                    <property name="detectingIntervalInSeconds" value="${canal.instance.detecting.interval.time:5}" />
                    <property name="haController">
                            <bean class="com.alibaba.otter.canal.parse.ha.HeartBeatHAController">
                                    <property name="detectingRetryTimes" value="${canal.instance.detecting.retry.threshold:3}" />
                                    <property name="switchEnable" value="${canal.instance.detecting.heartbeatHaEnable:false}" />
                            </bean>
                    </property>
    
                    <property name="alarmHandler" ref="alarmHandler" />
    
                    <!-- 解析过滤处理 -->
                    <property name="eventFilter">
                            <bean class="com.alibaba.otter.canal.filter.aviater.AviaterRegexFilter" >
                                    <constructor-arg index="0" value="${canal.instance.filter.regex:.*\..*}" />
                            </bean>
                    </property>
    
                    <property name="eventBlackFilter">
                            <bean class="com.alibaba.otter.canal.filter.aviater.AviaterRegexFilter" >
                                    <constructor-arg index="0" value="${canal.instance.filter.black.regex:}" />
                                    <constructor-arg index="1" value="false" />
                            </bean>
                    </property>
    
                    <property name="fieldFilter" value="${canal.instance.filter.field}" />
                    <property name="fieldBlackFilter" value="${canal.instance.filter.black.field}" />
    
                    <!-- 最大事务解析大小,超过该大小后事务将被切分为多个事务投递 -->
                    <property name="transactionSize" value="${canal.instance.transaction.size:1024}" />
    
                    <!-- 网络连接参数 -->
                    <property name="receiveBufferSize" value="${canal.instance.network.receiveBufferSize:16384}" />
                    <property name="sendBufferSize" value="${canal.instance.network.sendBufferSize:16384}" />
                    <property name="defaultConnectionTimeoutInSeconds" value="${canal.instance.network.soTimeout:30}" />
    
                    <!-- 解析编码 -->
                    <!-- property name="connectionCharsetNumber" value="${canal.instance.connectionCharsetNumber:33}" /-->
                    <property name="connectionCharset" value="${canal.instance.connectionCharset:UTF-8}" />
    
                    <!-- 解析位点记录 -->
                    <property name="logPositionManager">
                            <bean class="com.alibaba.otter.canal.parse.index.MemoryLogPositionManager" />
                    </property>
    
                    <!-- failover切换时回退的时间 -->
                    <property name="fallbackIntervalInSeconds" value="${canal.instance.fallbackIntervalInSeconds:60}" />
    
                    <!-- 解析数据库信息 -->
                    <property name="masterInfo">
                            <bean class="com.alibaba.otter.canal.parse.support.AuthenticationInfo" init-method="initPwd">
                                    <property name="address" value="${canal.instance.master3.address}" />
                                    <property name="username" value="${canal.instance.dbUsername:retl}" />
                                    <property name="password" value="${canal.instance.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>
                    <property name="standbyInfo">
                            <bean class="com.alibaba.otter.canal.parse.support.AuthenticationInfo" init-method="initPwd">
                                    <property name="address" value="${canal.instance.standby3.address}" />
                                    <property name="username" value="${canal.instance.dbUsername:retl}" />
                                    <property name="password" value="${canal.instance.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>
    
                    <!-- 解析起始位点 -->
                    <property name="masterPosition">
                            <bean class="com.alibaba.otter.canal.protocol.position.EntryPosition">
                                    <property name="journalName" value="${canal.instance.master3.journal.name}" />
                                    <property name="position" value="${canal.instance.master3.position}" />
                                    <property name="timestamp" value="${canal.instance.master3.timestamp}" />
                                    <property name="gtid" value="${canal.instance.master3.gtid}" />
                            </bean>
                    </property>
                    <property name="standbyPosition">
                            <bean class="com.alibaba.otter.canal.protocol.position.EntryPosition">
                                    <property name="journalName" value="${canal.instance.standby3.journal.name}" />
                                    <property name="position" value="${canal.instance.standby3.position}" />
                                    <property name="timestamp" value="${canal.instance.standby3.timestamp}" />
                                    <property name="gtid" value="${canal.instance.standby3.gtid}" />
                            </bean>
                    </property>
                    <property name="filterQueryDml" value="${canal.instance.filter.query.dml:false}" />
                    <property name="filterQueryDcl" value="${canal.instance.filter.query.dcl:false}" />
                    <property name="filterQueryDdl" value="${canal.instance.filter.query.ddl:false}" />
                    <property name="useDruidDdlFilter" value="${canal.instance.filter.druid.ddl:true}" />
                    <property name="filterTableError" value="${canal.instance.filter.table.error:false}" />
                    <property name="supportBinlogFormats" value="${canal.instance.binlog.format}" />
                    <property name="supportBinlogImages" value="${canal.instance.binlog.image}" />
    
                    <!-- parallel parser -->
                    <property name="parallel" value="${canal.instance.parser.parallel:true}" />
                    <property name="parallelThreadSize" value="${canal.instance.parser.parallelThreadSize}" />
                    <property name="parallelBufferSize" value="${canal.instance.parser.parallelBufferSize:256}" />
            </bean>
    须要修改的:添加<ref bean="eventParser3" /> 、eventParser三、master三、standby3

3、启动

./bin/starthtml

4、查看日志

tail -f logs/group/group.logmysql