canal+mysql+kafka安装配置

概述

简介

canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

基于日志增量订阅和消费的业务包括

数据库镜像

数据库实时备份

索引构建和实时维护(拆分异构索引、倒排索引等)

业务 cache 刷新

带业务逻辑的增量数据处理

当前的 canal(1.1.5) 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x


工作原理

MySQL主备复制原理

  1. MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
  2. MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  3. MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
canal 工作原理
  1. canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  2. MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  3. canal 解析 binary log 对象(原始为 byte 流)

安装canal

版本信息

由于最近需要做mysql数据实时分析,经过比较决定选择canal作为同步工具。

安装过程步骤很简单,但是在具体使用过程中确存在一些问题,官网对此也没过多的解释,于是记录下安装过程。

软件 版本 备注
canal 1.1.5 建议1.1.4+,
引入了WebUI能力,
引入canal-admin工程,
支持面向WebUI的canal动态管理能力,
支持配置、任务、日志等在线白屏运维能力,
mysql 5.6+ 注意,此处mysql为admin的元数据库,并不是我们的数据源

下载canal

  1. # 选定安装路径
  2. cd /home
  3. # 下载canal.admin
  4. wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.admin-1.1.5.tar.gz
  5. # 解压canal-admin
  6. mkdir canal-admin
  7. tar -zxvf canal.admin-1.1.5.tar.gz -C canal-admin/
  8. # 下载canal.deployer
  9. wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
  10. # 解压canal-deployer
  11. mkdir canal-deployer
  12. tar -zxvf canal.deployer-1.1.5.tar.gz -C canal-deployer/

配置canal-admin

  1. # 进入配置文件目录
  2. cd canal-admin/conf/
  1. # 修改配置文件
  2. vim application.yml
  3. # 加入以下内容
  4. server:
  5. port: 8189 # web端口,默认8089,但是我的端口已经被占用改为8189
  6. spring:
  7. jackson:
  8. date-format: yyyy-MM-dd HH:mm:ss
  9. time-zone: GMT+8
  10. spring.datasource:
  11. address: 10.0.x.x:3306 # 数据库ip、端口
  12. database: canal_manager # 数据库名称,默认
  13. username: canal #用户,默认
  14. password: canal #密码,默认
  15. driver-class-name: com.mysql.jdbc.Driver
  16. url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
  17. hikari:
  18. maximum-pool-size: 30
  19. minimum-idle: 1
  20. canal:
  21. adminUser: admin #登陆webui 用户名
  22. adminPasswd: 123456 #登陆密码,注意要1.1.5版本需要六位数以上密码,默认密码设置成admin登陆的时候会提示长度错误,默认的canal_manager.sql md5解密出来也是123456

生成admin元数据表

配置完application.yml,我们需要在元数据库生成元数据信息。

有两种方法:
canal-admin/conf/canal_manager.sql的语句

  1. 在数据库中逐条执行canal-admin/conf/canal_manager.sql的语句
  2. 在数据库中source canal_manager.sql
  1. mysql> source /home/canal-admin/conf/canal_manager.sql

启动canal-admin

  1. cd /home/canal-admin/bin
  2. # 启动canal-admin
  3. sh startup.sh
  4. # 进入日志目录
  5. cd /home/canal-admin/logs
  6. # 查看日志
  7. cat admin.log

日志如下即启动成功


登陆canal-admin

  1. http://10.0.x.x:8189 # 账号密码为application.yml配置的admin 123456

  • 登陆后页面如下


新建集群

  • 新建集群

  • 配置集群信息

  • 载入模板

    配置集群信息的时候我们可以通过载入模板,然后进行配置

  • 修改内容

    修改过的或建议修改的配置用中文标记,其余的默认
  1. #################################################
  2. ######### common argument #############
  3. #################################################
  4. # tcp bind ip
  5. canal.ip = 1 #每个canal server实例的唯一标识
  6. # register ip to zookeeper
  7. canal.register.ip =
  8. canal.port = 11111 #canal server提供socket tcp服务的端口
  9. canal.metrics.pull.port = 11112
  10. # canal instance user/passwd
  11. canal.user = canal
  12. canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458
  13. # canal admin config
  14. canal.admin.manager = x-x-DATACENTER04:8189 #admin中配置的10.0.x.x:8189 因为我配置hosts 此处写x-x-DATACENTER04也可以
  15. canal.admin.port = 11110
  16. canal.admin.user = admin
  17. canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
  18. # admin auto register
  19. #canal.admin.register.auto = true
  20. #canal.admin.register.cluster =
  21. #canal.admin.register.name =
  22. canal.zkServers = x-x-datacenter08,x-x-datacenter09,x-x-datacenter10 #canal server链接zookeeper集群的链接信息
  23. # flush data to zk
  24. canal.zookeeper.flush.period = 1000 #canal持久化数据到zookeeper上的更新频率,单位毫秒
  25. canal.withoutNetty = false
  26. # tcp, kafka, rocketMQ, rabbitMQ
  27. canal.serverMode = kafka
  28. # flush meta cursor/parse position to file
  29. canal.file.data.dir = ${canal.conf.dir} #canal持久化数据到file上的目录
  30. canal.file.flush.period = 1000
  31. ## memory store RingBuffer size, should be Math.pow(2,n)
  32. canal.instance.memory.buffer.size = 16384 #canal内存store中可缓存buffer记录数,需要为2的指数
  33. ## memory store RingBuffer used memory unit size , default 1kb
  34. canal.instance.memory.buffer.memunit = 1024
  35. ## meory store gets mode used MEMSIZE or ITEMSIZE
  36. #canal内存store中数据缓存模式
  37. # 1. ITEMSIZE : 根据buffer.size进行限制,只限制记录的数量
  38. # 2. MEMSIZE : 根据buffer.size * buffer.memunit的大小,限制缓存记录的大小
  39. canal.instance.memory.batch.mode = MEMSIZE
  40. canal.instance.memory.rawEntry = true
  41. ## detecing config
  42. canal.instance.detecting.enable = false #是否开启心跳检查
  43. #canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
  44. canal.instance.detecting.sql = select 1 #心跳检查sql
  45. canal.instance.detecting.interval.time = 3 #心跳检查频率,单位秒
  46. canal.instance.detecting.retry.threshold = 3 #心跳检查失败重试次数
  47. #非常注意:interval.time * retry.threshold值,应该参考既往DBA同学对数据库的故障恢复时间,
  48. #“太短”会导致集群运行态角色“多跳”;“太长”失去了活性检测的意义,导致集群的敏感度降低,Consumer断路可能性增加。
  49. canal.instance.detecting.heartbeatHaEnable = false #心跳检查失败后,是否开启自动mysql自动切换
  50. #说明:比如心跳检查失败超过阀值后,如果该配置为true,canal就会自动链到mysql备库获取binlog数据
  51. # support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
  52. canal.instance.transaction.size = 1024 #支持最大事务大小,将超过事务大小的事务切成多个事务交付
  53. # mysql fallback connected to new master should fallback times
  54. canal.instance.fallbackIntervalInSeconds = 60 #canal发生mysql切换时,在新的mysql库上查找 binlog时需要往前查找的时间,单位秒
  55. # 说明:mysql主备库可能存在解析延迟或者时钟不统一,需要回退一段时间,保证数据不丢
  56. # network config
  57. canal.instance.network.receiveBufferSize = 16384 #网络链接参数,SocketOptions.SO_RCVBUF
  58. canal.instance.network.sendBufferSize = 16384 #网络链接参数,SocketOptions.SO_SNDBUF
  59. canal.instance.network.soTimeout = 30 #网络链接参数,SocketOptions.SO_TIMEOUT
  60. # binlog filter config
  61. canal.instance.filter.druid.ddl = true
  62. canal.instance.filter.query.dcl = true #ddl语句是否隔离发送,开启隔离可保证每次只返回发送一条ddl数据,不和其他dml语句混合返回.(otter ddl同步使用)
  63. canal.instance.filter.query.dml = true #是否忽略DML的query语句,比如insert/update/delete table.(mysql5.6的ROW模式可以包含statement模式的query记录)
  64. canal.instance.filter.query.ddl = true #是否忽略DDL的query语句,比如create table/alater table/drop table/rename table/create index/drop index. (目前支持的ddl类型主要为table级别的操作,create databases/trigger/procedure暂时划分为dcl类型)
  65. # 注意:上面三个参数默认都是false 如无必要建议设置为true,否则后面你过滤表的时候可能会出现不生效的情况
  66. anal.instance.filter.table.error = true
  67. canal.instance.filter.rows = false
  68. canal.instance.filter.transaction.entry = true # 把事务头尾过滤
  69. canal.instance.filter.dml.insert = false
  70. canal.instance.filter.dml.update = false
  71. canal.instance.filter.dml.delete = false
  72. # binlog format/image check
  73. #canal.instance.binlog.format = ROW,STATEMENT,MIXED
  74. canal.instance.binlog.format = ROW,STATEMENT,MIXED
  75. canal.instance.binlog.image = FULL,MINIMAL,NOBLOB
  76. # binlog ddl isolation
  77. canal.instance.get.ddl.isolation = false
  78. # parallel parser config
  79. canal.instance.parser.parallel = true
  80. ## concurrent thread number, default 60% available processors, suggest not to exceed Runtime.getRuntime().availableProcessors()
  81. #canal.instance.parser.parallelThreadSize = 16
  82. ## disruptor ringbuffer size, must be power of 2
  83. canal.instance.parser.parallelBufferSize = 256
  84. # table meta tsdb info #关于时间序列版本
  85. canal.instance.tsdb.enable = true
  86. canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
  87. canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
  88. canal.instance.tsdb.dbUsername = canal
  89. canal.instance.tsdb.dbPassword = canal
  90. # dump snapshot interval, default 24 hour
  91. canal.instance.tsdb.snapshot.interval = 24
  92. # purge snapshot expire , default 360 hour(15 days)
  93. canal.instance.tsdb.snapshot.expire = 360
  94. #################################################
  95. ######### destinations #############
  96. #################################################
  97. canal.destinations =
  98. # conf root dir
  99. canal.conf.dir = ../conf
  100. # auto scan instance dir add/remove and start/stop instance
  101. # 如果配置为true,canal.conf.dir目录下的instance配置变化会自动触发
  102. # a. instance目录新增: 触发instance配置载入,lazy为true时则自动启动
  103. # b. instance目录删除:卸载对应instance配置,如已启动则进行关闭
  104. # c. instance.properties文件变化:reload instance配置,如已启动自动进行重启操作
  105. canal.auto.scan = true #开启instance自动扫描
  106. canal.auto.scan.interval = 5 #instance自动扫描的间隔时间,单位秒
  107. # set this value to 'true' means that when binlog pos not found, skip to latest.
  108. # WARN: pls keep 'false' in production env, or if you know what you want.
  109. canal.auto.reset.latest.pos.mode = false
  110. canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
  111. #canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml
  112. canal.instance.global.mode = manager
  113. canal.instance.global.lazy = false #全局lazy模式
  114. canal.instance.global.manager.address = ${canal.admin.manager}
  115. #canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
  116. #canal.instance.global.spring.xml = classpath:spring/file-instance.xml
  117. canal.instance.global.spring.xml = classpath:spring/default-instance.xml #此处建议设置为classpath:spring/default-instance.xml
  118. ##################################################
  119. ######### MQ Properties #############
  120. ##################################################
  121. # aliyun ak/sk , support rds/mq
  122. canal.aliyun.accessKey =
  123. canal.aliyun.secretKey =
  124. canal.aliyun.uid=
  125. canal.mq.flatMessage = true
  126. canal.mq.canalBatchSize = 50
  127. canal.mq.canalGetTimeout = 100
  128. # Set this value to "cloud", if you want open message trace feature in aliyun.
  129. canal.mq.accessChannel = local
  130. canal.mq.database.hash = true
  131. canal.mq.send.thread.size = 30
  132. canal.mq.build.thread.size = 8
  133. ##################################################
  134. ######### Kafka #############
  135. ##################################################
  136. kafka.bootstrap.servers = x-x-datacenter03:6667,x-x-datacenter04:6667,x-x-datacenter05:6667 # kafka bootstrap 信息,可以不填所有的
  137. kafka.acks = all
  138. kafka.compression.type = none
  139. kafka.batch.size = 16384
  140. kafka.linger.ms = 50 #建议设为50
  141. kafka.max.request.size = 1048576
  142. kafka.buffer.memory = 33554432
  143. kafka.max.in.flight.requests.per.connection = 1
  144. kafka.retries = 0
  145. kafka.kerberos.enable = false
  146. kafka.kerberos.krb5.file = "../conf/kerberos/krb5.conf"
  147. kafka.kerberos.jaas.file = "../conf/kerberos/jaas.conf"
  148. ##################################################
  149. ######### RocketMQ #############
  150. ##################################################
  151. rocketmq.producer.group = test
  152. rocketmq.enable.message.trace = false
  153. rocketmq.customized.trace.topic =
  154. rocketmq.namespace =
  155. rocketmq.namesrv.addr = 127.0.0.1:9876
  156. rocketmq.retry.times.when.send.failed = 0
  157. rocketmq.vip.channel.enabled = false
  158. rocketmq.tag =
  159. ##################################################
  160. ######### RabbitMQ #############
  161. ##################################################
  162. rabbitmq.host =
  163. rabbitmq.virtual.host =
  164. rabbitmq.exchange =
  165. rabbitmq.username =
  166. rabbitmq.password =
  167. rabbitmq.deliveryMode =

完成后点击保存配置


配置canal.deployer

在 x-x-DATACENTER04、x-x-DATACENTER07安装canal.deployer-1.1.5

这里我们准备使用集群模式,只需要关注canal_local.properties。

  1. cd /home/canal-deployer/conf
  • 修改配置
  1. vim canal_local.properties
  • 配置内容
  1. ########################加入以下内容#######################
  2. # register ip
  3. canal.register.ip = xx-xx-DATACENTER04 # 你主机的ip,避免多网卡带来的问题
  4. # canal admin config
  5. # canal admin的ip:port
  6. canal.admin.manager = xx-xx-DATACENTER04:8189 # 与admin安装信息保持一致
  7. canal.admin.port = 11110
  8. canal.admin.user = admin
  9. canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
  10. # admin auto register
  11. canal.admin.register.auto = true
  12. # 填入之前在admin中创建集群的集群名
  13. canal.admin.register.cluster = wt_test # 填我们刚刚在web ui中新建的集群
  14. canal.admin.register.name =
  15. ############################################################

启动canal.deployer

  1. /home/canal-deployer/bin
  2. sh startup.sh local
  3. # 查看日志
  4. cd /home/canal-deployer/logs/canal
  5. cat canal.log

上述步骤在部署canal.deployer的服务器上执行(x-x-DATACENTER04、x-x-DATACENTER07)

出现下面的日志即表示启动成功

admin界面查看会发现多了两个服务

说明:

server: 代表一个canal运行实例,对应于一个jvm

instance: 对应于一个数据队列 (1个server对应1..n个instance)

instance模块:

eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)

eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)

eventStore (数据存储)

metaManager (增量订阅&消费信息管理器)

安装到这一步,安装的部分已经完成,下面就是如何通过web ui 配置一个同步任务。


创建实例

数据源mysql配置

前面的原理介绍说过,canal同步的原理是伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议

MySQL master 收到 dump 请求,开始推送 binary log 给 slave

canal 再解析 binary log 对象(原始为 byte 流)

所以我们的数据源也必须开启了binlog并设置为主库才行。

数据源库开启binlog

mysql binlog参数配置应该如下

  1. mysql> show variables like 'binlog_format';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | binlog_format | ROW |
  6. +---------------+-------+
  7. mysql> show variables like 'log_bin';
  8. +---------------+-------+
  9. | Variable_name | Value |
  10. +---------------+-------+
  11. | log_bin | ON |
  12. +---------------+-------+

若不是该配置则需要开启binlog

  1. # 编辑/etc/my.cnf
  2. vim /etc/my.cnf
  3. # 加入下面三行
  4. log-bin=mysql-bin # 开启 binlog
  5. binlog-format=ROW # 选择 ROW 模式
  6. server_id=1
  7. # 重启mysql
  8. /usr/mysql/support-files/mysql.server stop
  9. /usr/mysql/support-files/mysql.server start
  10. # 查看binlog开启情况
  11. mysql> show variables like 'binlog_format';
  12. +---------------+-------+
  13. | Variable_name | Value |
  14. +---------------+-------+
  15. | binlog_format | ROW |
  16. +---------------+-------+
  17. mysql> show variables like 'log_bin';
  18. +---------------+-------+
  19. | Variable_name | Value |
  20. +---------------+-------+
  21. | log_bin | ON |
  22. +---------------+-------+

创建实例

配置完数据源,我们就可以开始实例的配置了

  • instance 管理 -> 新建instance

  • 实例名称->选择集群->载入模板

  • 进行如下配置
  1. #################################################
  2. ## mysql serverId , v1.0.26+ will autoGen
  3. canal.instance.mysql.slaveId=1 #slaveId 注意不要与数据源库的id 一样
  4. # enable gtid use true/false
  5. canal.instance.gtidon=false
  6. # position info
  7. canal.instance.master.address=172.x.x.x:3306 # 数据源mysql的ip:port
  8. canal.instance.master.journal.name=
  9. canal.instance.master.position=
  10. canal.instance.master.timestamp=
  11. canal.instance.master.gtid=
  12. # rds oss binlog
  13. canal.instance.rds.accesskey=
  14. canal.instance.rds.secretkey=
  15. canal.instance.rds.instanceId=
  16. # table meta tsdb info
  17. canal.instance.tsdb.enable=true
  18. #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/wt_pre
  19. #canal.instance.tsdb.dbUsername=canal
  20. #canal.instance.tsdb.dbPassword=canal
  21. #canal.instance.standby.address =
  22. #canal.instance.standby.journal.name =
  23. #canal.instance.standby.position =
  24. #canal.instance.standby.timestamp =
  25. #canal.instance.standby.gtid=
  26. # username/password
  27. canal.instance.dbUsername=canal # 数据源mysql的用户,根据实际设置
  28. canal.instance.dbPassword=canal # 数据源mysql的密码,根据实际设置
  29. canal.instance.connectionCharset = UTF-8
  30. canal.instance.defaultDatabaseName = test_db # 默认数据库,但是好像设置了没啥用
  31. # enable druid Decrypt database password
  32. canal.instance.enableDruid=false
  33. #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
  34. # table regex
  35. canal.instance.filter.regex = test_db\\..* # 需要同步的表,这里配置的意思是test_db下的所有表。
  36. # 但是如果之前配置canal.instance.filter.query.dcl、canal.instance.filter.query.dml、canal.instance.filter.query.ddl 三个参数不设置为true 这个过滤可能失效
  37. # 关于这点后面再稍微解释下
  38. # table black regex
  39. canal.instance.filter.black.regex= # 同上,只不过这里是黑名单,不同步的表
  40. # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
  41. #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch # 需要同步的字段
  42. # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
  43. #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch # 不需要同步的字段
  44. # mq config
  45. canal.mq.topic=tpc_all # 默认数据同步的主题,所有未被canal.instance.filter.regex匹配的表都会同步到主题tpc_all中
  46. # dynamic topic route by schema or table regex
  47. canal.mq.dynamicTopic=tpc_test:test_db\\..* #自己指定主题,test_db库中的所有表都会同步到tpc_test中
  48. canal.mq.partition=0
  49. # hash partition config
  50. canal.mq.partitionsNum=3
  51. #canal.mq.partitionHash=test.table:id^name,.*\\..*
  52. #################################################

保存配置,返回上一页面

启动实例

返回instance管理页面可以看到新建的实例。

  • 操作->启动

  • 查看日志

此时消费tpc_test即可看到test_db库各个表的变化情况

至此配置instance完成


遇到的问题

其实按照上面的步骤应该不会有什么问题了,毕竟该踩的坑我都踩了。

但是这里还有一个问题想再做下说明。

关于表过滤失败的问题

按照官网,我们过滤表只需要进行表的黑白名单配置即可

  1. canal.instance.filter.regex = test_db\\..*
  2. canal.instance.filter.black.regex=

但是实际上在测试过程中发现,黑白名单过滤都没有生效。

网上一搜很多都说是API覆盖了这里的配置,但是实际上我们直接通过WEB UI配置压根不存在覆盖的问题。


关于这个问题官方FAQ中有两个问题与此相关

为什么INSERT/UPDATE/DELETE被解析为查询或DDL?

出现这类情况主要原因为收到的binlog就为Query事件,比如:

a. binlog格式为非row模式,通过show variables like 'binlog_format'可以查看. 针对statement/mixed模式,DML语句都会是以SQL语句存在

b. mysql5.6+之后,在binlog为row模式下,针对DML语句通过一个开关(binlog-rows-query-log-events=true, show variables里也可以看到该变量),记录DML的原始SQL,对应binlog事件为RowsQueryLogEvent,同时也有对应的row记录.
ps. canal可以通过properties设置来过滤:canal.instance.filter.query.dml=true

我为表设置了过滤器,但它不起作用。

官方给了四个排查步骤

  1. 首先看文档AdminGuide,了解canal.instance.filter.regex的书写格式
  1. mysql 数据解析关注的表,Perl正则表达式.
  2. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
  3. 常见例子:
  4. 1. 所有表:.* or .*\\..*
  5. 2. canal schema下所有表: canal\\..*
  6. 3. canal下的以canal打头的表:canal\\.canal.*
  7. 4. canal schema下的一张表:canal.test1
  8. 5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
  1. 检查binlog格式,过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
  2. 检查下CanalConnector是否调用subscribe(filter)方法;有的话,filter需要和instance.properties的canal.instance.filter.regex一致,否则subscribe的filter会覆盖instance的配置,如果subscribe的filter是...,那么相当于你消费了所有的更新数据 【特别注意】
  3. canal 1.1.3+版本之后,会在日志里记录最后使用的filter条件,可以对比使用的filter看看是否和自己期望的是一致,如果不一致检查一下第3步
  1. c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$
  2. c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter :
  1. 检查一下历史的issue列表,很有可能你的提问别人已经遇到过并解决了,比如表达式不对,特别是双斜杠的问题

好家伙还真在历史的issue找到解决办法,多久的问题了,官方心真大

按上面的说法走一遍流程,好像也没问题呀,官方拉垮


解决办法

后面看了一个issue才发现问题。

实际上我们过滤过滤生效了。

根据上面第一个问题,我们知道INSERT/UPDATE/DELETE被解析为Query或DDL语句,发生一条变更会发送两个entry过来。

一个entry是query ,一个是具体的更新(insert/update/delete)。

你没过滤的表会发两个entry过来 ,但是你过滤的表只会发一个entrytype是query的信息。

对于query类型好像无法准确提取tableName进行过滤,所以我们配置的黑白名单就失效了

猜测是这样,没深入研究,毕竟我即使何明.\.. 作为黑名单都失效了

最后是在把cannal.properties中的参数修改一下解决:

  1. canal.instance.filter.transaction.entry = true
  2. canal.instance.filter.query.dcl = true
  3. canal.instance.filter.query.dml = true
  4. canal.instance.filter.query.ddl = true
  5. canal.instance.filter.table.error = true

参考资料

Canal配置文件详解

关于canal.instance.filter.regex 设置的问题

FAQ

更多内容请关注【兔八哥杂谈】

canal+mysql+kafka实时数据同步安装、配置的更多相关文章

  1. Tapdata 在线研讨会:实时数据同步应用场景及实现方案探讨

    数字化时代的到来,企业业务敏捷度的提升,对传统的数据处理和可用性带来更高的要求,实时数据同步技术的发展,给基于数据的业务创新带来了更多的可能性.9月8日晚,Tapdata 联合MongoDB 中文社区 ...

  2. sersync+rsync实时数据同步

    sersync+rsync实时数据同步 1.相关背景介绍 前面有关文章配置实现了rsync增量同步以及配置为定时同步,但是在实际生产环境中需要实时的监控数据从而进行同步(不间断同步),可以采取inot ...

  3. Linux学习系列之Inotify+Rsync实现实时数据同步

    Inotify简介 inotify介绍 inotify是一种强大的.异步的文件系统监控机制,linux内核从2.6.13起,加入了inotify的支持,通过inotify可以监控文件系统中添加.删除. ...

  4. rsync+inotify实时数据同步多目录实战

    rsync+inotify实时数据同步多目录实战       inotify配置是建立在rsync服务基础上的配置过程 操作系统 主机名 网卡eth0 默认网关 用途 root@58server1 1 ...

  5. rsync+inotify实时数据同步单目录实战

    rsync+inotify实时数据同步单目录实战   rsync+inotify实时数据同步单目录实战 inotify是一个强大的.细粒度的.异步的文件系统事件监控机制,linux内核从2.6.13起 ...

  6. Linux系统实时数据同步inotify+rsync

    一.inotify简介 inotify是Linux内核的一个功能,它能监控文件系统的变化,比如删除.读.写和卸载等操作.它监控到这些事件的发生后会默认往标准输出打印事件信息.要使用inotify,Li ...

  7. 【linux运维】rsync+inotify与sersync+rsync实时数据同步笔记

    Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份通过,但rsync自身也有缺陷,同步数据时,rsync采用核心算法对远程服务器的目标文件进行对比,只进 ...

  8. python操作三大主流数据库(3)python操作mysql③python操作mysql的orm工具sqlaichemy安装配置和使用

    python操作mysql③python操作mysql的orm工具sqlaichemy安装配置和使用 手册地址: http://docs.sqlalchemy.org/en/rel_1_1/orm/i ...

  9. MySQL数据库的主从同步复制配置

    一.主从同步机制原理 MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态), ...

随机推荐

  1. spring boot 与 Mybatis整合(*)

    在pom.xml文件中加入数据库.spring-mybatis整合 <!-- spring boot 整合mybatis --> <dependency> <groupI ...

  2. [知识路书]beta设计和计划

    [知识路书]beta设计和计划 一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段的推广情况以 ...

  3. Spring与Springboot

    1.Spring能做什么 1.1.Spring的能力 1.2.Spring的生态 https://spring.io/projects/spring-boot 覆盖了: web开发 数据访问 安全控制 ...

  4. mysql登录框注入绕过单引号匹配

    0x00 原理   网站使用正则匹配对用户名一栏传到服务器的参数进行了匹配,如果匹配到了单引号则报错 0x01 简单例子   当我们输入admin'时,网站直接报错,很有可能就是用了正则,这样我们也不 ...

  5. Envoy:主动健康监测

    实验文件 docker-compose version: '3' services: envoy: image: envoyproxy/envoy-alpine:v1.15-latest enviro ...

  6. [刷题] 447 Number of Boomerangs

    要求 给出平面上n个点,寻找存在多少点构成的三元组(i j k),使得 i j 两点的距离等于 i k 两点的距离 n 最多为500,所有点坐标范围在[-10000, 10000]之间 示例 [[0, ...

  7. [转载]好好好centos7 安装 KVM

    centos7 安装 KVM  2019-04-03 09:58:24     34     0     0 一.基础环境准备 centos7.X 最小环境安装 关闭selinux # vi /etc ...

  8. RHEL sosreport

    RHEL sosreport简介 sosreport对很多RedHat爱好者来说应该并不陌生! 它是一款在RedHat Linux下帮你收集系统信息打成一个tar包的工具,你可以将这个tar包发给供应 ...

  9. centos7.0修改网卡名为ethx

    场景: 由于默认的centos7网卡名对于大多数习惯于原先的命名方式的人而言是一种折磨,因此我们需要让他恢复正常! 编辑/etc/sysconfig/grub文件 vim /etc/sysconfig ...

  10. 028.Python面向对象继承(单继承,多继承,super,菱形继承)

    一 继承的概念 种类 单继承 多继承 至少两个类: 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类) 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 ...