alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.5k stars 7.62k forks source link

canal-adapter srcDataSources 配置多个源数据 ES无法同步第二个数据源数据 #4465

Open 1150549059 opened 2 years ago

1150549059 commented 2 years ago

问题:canal-adapter 中 srcDataSources 配置了2个数据源,canalAdapters 也配置了2个实例,但是只有一个ES同步成功,另一个日志打印正常,没有任何错误提示。

canal-adapter 中 application.yml

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp # 客户端的模式,可选tcp kafka rocketMQ
  flatMessage: true # 扁平message开关, 是否以json字符串形式投递数据, 仅在kafka/rocketMQ模式下有效
  zookeeperHosts:    # 对应集群模式下的zk地址
  syncBatchSize: 3000 # 每次同步的批数量
  retries: 0 # 重试次数, -1为无限重试
  timeout: # 同步超时时间, 单位毫秒
  accessKey:
  secretKey:
  consumerProperties:
    canal.tcp.server.host: 127.0.0.1:11111 #设置canal-server的地址
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://192.168.0.111:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: canal
      password: canal
    secondDS:
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: canal
      password: canal
  canalAdapters:
  - instance: example1 # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es7
        key: exampleKey1
        hosts:  http://127.0.0.1:9200 # 127.0.0.1:9200 for rest mode
        properties:
          mode: rest # or rest
          #security.auth: elastic:Hna1rcom #  only used for rest mode
          cluster.name: elasticsearch
  - instance: example2 # canal instance Name or mq topic name
    groups:
    - groupId: g2
      outerAdapters:
      - name: logger
      - name: es7
        key: exampleKey2
        hosts:  http://127.0.0.1:9200 # 127.0.0.1:9200 for rest mode
        properties:
          mode: rest # or rest
          #security.auth: elastic:Hna1rcom #  only used for rest mode
          cluster.name: elasticsearch

配置文件 a.yml

dataSourceKey: defaultDS
outerAdapterKey: exampleKey1
destination: example1
groupId: g1
concurrent: true
esMapping:
_index: a
_id: id
sql: "select
id,
name,
create_date,
update_date
from
a"
commitBatch: 3000

配置文件 b.yml

dataSourceKey: secondDS
outerAdapterKey: exampleKey2
destination: example2
groupId: g2
concurrent: true
esMapping:
_index: b
_id: id
sql: "select
id,
name,
create_date,
update_date
from
b"
commitBatch: 3000
1150549059 commented 2 years ago

日志是正常的

1150549059 commented 2 years ago

a.yml 能同步到ES b.yml 同步不进去,2个日志是一样的

zhang-yuanfu commented 2 years ago

手动同步后看下错误日志呢

1150549059 commented 2 years ago

手动同步后看下错误日志呢

没有错误日志

zhang-yuanfu commented 2 years ago

手动同步提示什么,手动可以成功吗,同步不进去。是手动自动都不行吗

1150549059 commented 2 years ago

手动同步提示什么,手动可以成功吗,同步不进去。是手动自动都不行吗

post http://127.0.0.1:8081/etl/es7/xxxx.yml { "succeeded": false, "errorMessage": "Task not found" }

第二个显示这样,全量同步不行

1150549059 commented 2 years ago

http://127.0.0.1:8081/etl/es7/exampleKey2/xxxx.yml 是我配置那边加了key

- instance: example2 # canal instance Name or mq topic name
    groups:
    - groupId: g2
      outerAdapters:
      - name: logger
      - name: es7
        key: exampleKey2
        hosts:  http://127.0.0.1:9200 # 127.0.0.1:9200 for rest mode
        properties:
          mode: rest # or rest
          #security.auth: elastic:Hna1rcom #  only used for rest mode
          cluster.name: elasticsearch
1150549059 commented 2 years ago

手动同步提示什么,手动可以成功吗,同步不进去。是手动自动都不行吗

上面的 a.yml 是正常的,b.yml全量是可以,增量没同步成

zhang-yuanfu commented 2 years ago

手动同步提示什么,手动可以成功吗,同步不进去。是手动自动都不行吗

post http://127.0.0.1:8081/etl/es7/xxxx.yml { "succeeded": false, "errorMessage": "Task not found" }

第二个显示这样,全量同步不行

这不是同步失败了,这个是哪个yml

1150549059 commented 2 years ago

配置文件 b.yml

配置文件 b.yml

1150549059 commented 2 years ago

手动同步提示什么,手动可以成功吗,同步不进去。是手动自动都不行吗

post http://127.0.0.1:8081/etl/es7/xxxx.yml { "succeeded": false, "errorMessage": "Task not found" } 第二个显示这样,全量同步不行

这不是同步失败了,这个是哪个yml

全量可以,增量不行

zhang-yuanfu commented 2 years ago

这就不知道了,不过大概思路就是找binlog看了吧,好像别的issue有这种情况,你可以找找看

zhang-yuanfu commented 2 years ago

还有一个数据同步开关看下是否开启了

zhang-yuanfu commented 2 years ago
image
1150549059 commented 2 years ago
image

还是不行,同步不上ES,日志这边都没有报错,同步开启,也是已开启

1150549059 commented 2 years ago
image

已经开启,但是还是不行,2个数据源第一个可以同步 第二个就不行

zhang-yuanfu commented 2 years ago

问题解决了吗

1150549059 commented 2 years ago

问题解决了吗

没有

zhang-yuanfu commented 2 years ago

解决后,说一下原因吧,我也想知道原因

zhang-yuanfu commented 2 years ago

你更新数据后,log日志里有监听到你对应的groupid的内容吗(b.yml)

1150549059 commented 2 years ago

解决后,说一下原因吧,我也想知道原因

已经摆烂了,目前没时间研究

1150549059 commented 2 years ago

你更新数据后,log日志里有监听到你对应的groupid的内容吗(b.yml)

日志是正常的

1150549059 commented 2 years ago

你更新数据后,log日志里有监听到你对应的groupid的内容吗(b.yml)

没有任何错误信息,就是第二个数据源ES不同步

1150549059 commented 2 years ago

你更新数据后,log日志里有监听到你对应的groupid的内容吗(b.yml)

binlog 也有接收到

1150549059 commented 2 years ago

可能要研究源代码了

zhang-yuanfu commented 2 years ago

发下看看呢,确定是你b配置的吗 groupId: g2

1150549059 commented 2 years ago

发下看看呢,确定是你b配置的吗 groupId: g2

就是上面那个

zhang-yuanfu commented 2 years ago

log日志

zhang-yuanfu commented 2 years ago

我有碰到日志不打印的情况,也是两个数据源,两个实例

1150549059 commented 2 years ago

2022-10-21 16:15:51.522 [pool-4-thread-1] INFO c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":null,"database":"库名","destination":"example2","es":1666340151000,"groupId":"g2","isDdl":false,"old":null,"pkNames":[],"sql":"INSERT INTO 库名.表名(对应字段) VALUES (11, '11111111111', 111, 111111111111, 111111111, '11111111111111', '1111111111111111111', '111111111', '1111111', '11111111', '1111111111', '111111111', '111111111', '1111111', '1111111111', '1111', '1111111', '1111111', '111111', 1, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', 0, NULL, NULL, NULL, '2022-10-21 09:58:38', '2022-10-21 09:58:38')","table":"节点名/表名","ts":1666340151521,"type":"INSERT"} Affected indexes: 节点名

1150549059 commented 2 years ago

我有碰到日志不打印的情况,也是两个数据源,两个实例

上面那段,节点名和库名一致

1150549059 commented 2 years ago

我有碰到日志不打印的情况,也是两个数据源,两个实例

是你server那边没有配置吧

zhang-yuanfu commented 2 years ago

server 需要配置什么

1150549059 commented 2 years ago

server 那边我配置了 example1 和 example2 canal.properties 里面添加 canal.destinations = example1,example2

zhang-yuanfu commented 2 years ago

我试试之后再和你说吧,可别是跟你一样的情况

1150549059 commented 2 years ago

server 需要配置什么

然后把 example 复制改成 example1 和 example2 然后里面是不同的库地址和密码

1150549059 commented 2 years ago

应该是会和我一样,因为我搞了好几天

我试试之后再和你说吧,可别是跟你一样的情况

zhang-yuanfu commented 2 years ago

我这个server好像不用再配置了,因为是用的canal的admin管理后台添加的实例和配置

image
zhang-yuanfu commented 2 years ago

你有弄这个平台吗,你看下你的实例的日志,我的实例日志是提示没有权限,我去弄账号权限了,

zhang-yuanfu commented 2 years ago

有可能你adapter 没有报错监听到了,但是你的实例处理有报错

zhang-yuanfu commented 2 years ago

我知道是什么问题了,是yml里sql的问题,canal会对sql格式有要求,sql有问题全量可以单条更新是不可以

image image

修改之前和之后可以成功的sql

zhang-yuanfu commented 2 years ago

第一个图片是可以监听成功的,第二个是之前的

1150549059 commented 2 years ago

我知道是什么问题了,是yml里sql的问题,canal会对sql格式有要求,sql有问题全量可以单条更新是不可以 image image 修改之前和之后可以成功的sql

你成功了,2个数据源?