Tidb binlog写入kafka无反应,只有重启drainer才生效

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:最新版
  • 【问题描述】Tidb binlog 通过 Drainer实时写入kafka时出现问题。tidb数据库数据发生改变时,binlog未写入kafka,没有任何错误,没有反应。只有执行 ./bin/drainer -config drainer.toml ,binlog才会写入kafka。以下是drainer的配置,哪里出了问题呢?如有描述不清的地方,请指出来。

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

# Drainer Configuration.

# Drainer 提供服务的地址("192.168.0.13:8249")
addr = "10.0.10.30:8249"

# Drainer 对外提供服务的地址
advertise-addr = "10.0.10.30:8249"

# 向 PD 查询在线 Pump 的时间间隔 (默认 10,单位 秒)
detect-interval = 10

# Drainer 数据存储位置路径 (默认 "data.drainer")
data-dir = "data.drainer"

# PD 集群节点的地址 (英文逗号分割,中间不加空格)
pd-urls = "http://10.0.10.30:2379,http://10.0.10.31:2379,http://10.0.10.32:2379"
log-level = "info"
# log 文件路径
log-file = "./drainer.log"

# Drainer 从 Pump 获取 binlog 时对数据进行压缩,值可以为 "gzip",如果不配置则不进行压缩
# compressor = "gzip"

# [security]
# 如无特殊安全设置需要,该部分一般都注解掉
# 包含与集群连接的受信任 SSL CA 列表的文件路径
# ssl-ca = "/path/to/ca.pem"
# 包含与集群连接的 PEM 形式的 X509 certificate 的路径
# ssl-cert = "/path/to/pump.pem"
# 包含与集群链接的 PEM 形式的 X509 key 的路径
# ssl-key = "/path/to/pump-key.pem"

# Syncer Configuration
[syncer]
# 如果设置了该项,会使用该 sql-mode 解析 DDL 语句,此时如果下游是 MySQL 或 TiDB 则
# 下游的 sql-mode 也会被设置为该值
sql-mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

# 输出到下游数据库一个事务的 SQL 语句数量 (默认 20)
txn-batch = 20

# 同步下游的并发数,该值设置越高同步的吞吐性能越好 (默认 16)
worker-count = 16

# 是否禁用拆分单个 binlog 的 SQL 的功能,如果设置为 true,则按照每个 binlog
# 顺序依次还原成单个事务进行同步(下游服务类型为 MySQL, 该项设置为 False)
#disable-dispatch = false

# safe mode 会使写下游 MySQL/TiDB 可被重复写入
# 会用 replace 替换 insert 语句,用 delete + replace 替换 update 语句
#safe-mode = false

# Drainer 下游服务类型(默认为 mysql)
# 参数有效值为 "mysql","tidb","file","kafka"
db-type = "kafka"

# 事务的 commit ts 若在该列表中,则该事务将被过滤,不会同步至下游,v3.0.2 后支持该功能
ignore-txn-commit-ts = []

# db 过滤列表 (默认 "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql,test"),
# 不支持对 ignore schemas 的 table 进行 rename DDL 操作
ignore-schemas = "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql"

# replicate-do-db 配置的优先级高于 replicate-do-table。如果配置了相同的库名,支持使用正则表达式进行配置。
# 以 '~' 开始声明使用正则表达式

replicate-do-db = ["firstdb"]

# [syncer.relay]
# 保存 relay log 的目录,空值表示不开启。
# 只有下游是 TiDB 或 MySQL 时该配置才生效。
# log-dir = ""
# 每个文件的大小上限
# max-file-size = 10485760

# [[syncer.replicate-do-table]]
# db-name ="test"
# tbl-name = "log"

#[[syncer.replicate-do-table]]
#db-name ="test"
#tbl-name = "*"

# 忽略同步某些表
# [[syncer.ignore-table]]
# db-name = "test"
# tbl-name = "log"

# db-type 设置为 mysql 时,下游数据库服务器参数
#[syncer.to]
#host = "192.168.0.13"
#user = "root"
#password = ""
# 使用 `./binlogctl -cmd encrypt -text string` 加密的密码
# encrypted_password 非空时 password 会被忽略
#encrypted_password = ""
#port = 3306

[syncer.to.checkpoint]
# 当 checkpoint type 是 mysql 或 tidb 时可以开启该选项,以改变保存 checkpoint 的数据库
# schema = "tidb_binlog"
# v3.0.6 开始支持配置 checkpoint 的保存类型。
# 目前只支持 mysql 或者 tidb 类型。可以去掉注释来控制 checkpoint 保存的位置。
# db-type 默认的 checkpoint 保存方式是:
# mysql/tidb -> 对应的下游 mysql/tidb
# file/kafka -> file in `data-dir`
# type = "mysql"
# host = "10.0.100.91"
# user = "root"
# password = "mima"
# 使用 `./binlogctl -cmd encrypt -text string` 加密的密码
# encrypted_password 非空时 password 会被忽略
# encrypted_password = ""
port = 3306

# db-type 设置为 file 时,存放 binlog 文件的目录
# [syncer.to]
# dir = "data.drainer"

# db-type 设置为 kafka 时,Kafka 相关配置
[syncer.to]
# kafka-addrs 和 zookeeper-addrs 只需要一个,两者都有时程序会优先用 zookeeper 中的 kafka 地址
# type = "kafka"
zookeeper-addrs = "10.0.100.94"
kafka-addrs = "10.0.100.94"
kafka-version = "0.10.2.0"
kafka-max-messages = 1024

# 保存 binlog 数据的 Kafka 集群的 topic 名称,默认值为 <cluster-id>_obinlog
# 如果运行多个 Drainer 同步数据到同一个 Kafka 集群,每个 Drainer 的 topic-name 需要设置不同的名称
topic-name = "topic-firstdb"

你好,

  1. 请问 tidb数据库发生改变 的时候,drainer 的运行状况
  2. 最开始你是如何启动 drainer
  3. 请提供出问题前后的 drainer 日志

刚才看了下日志,发现启动时报了个错误,这是什么原因呀?有影响吗?

您好,

先提供下以上信息,这个可能是衍生出的问题。

在帮忙确认下 tidbbinglog 和 tidb 的版本

1、数据库发生改变时,drainer运行正常,后来换了个库名做binlog增量写入kafka,重启drainer后,发现不能实时写入
2、启动方式 bin/drainer -config kkk.toml kkk.toml为文中配置
3、出现问题前后日志找不到了,上一条截图是目前启动 drainer时报的错误
这是截取部分日志,你看看有没有用

请问这个是什么意思,具体是什么操作?

请问下 tidb binlog 的部署方式是什么
binary 部署启动方式为:

./bin/drainer -config drainer.toml -initial-commit-ts {initial-commit-ts}

ansible 部署,启动方式为:

ansible-playbook start_drainer.yml
  1. binlog部署方式是binary方式,启动方式没问题。
  2. 一个tidb实例中,之前binlog监听是数据库A,没问题,binlog可以同步写入到kafka,后来停止drainer,改了drainer配置文件中replicate-do-db,换成数据库B了,换了kafka的topic, 然后重启drainer后,就出现问

稍等,我们看下~~

好的,多谢

pump create pull binlogs client 这个报错是说 Drainer 尝试链接一个 Pump 失败,无法从这个 Pump 获取到 binlog,这样就会导致同步中断。 可以使用 binlogctl 查看下各个 Pump 状态,或者在 TiDB 执行 show pump status; 看下 Pump 状态。也需要看下连不上的 Pump 的日志是否有异常

怎么卸载最新版本tidb

您好,

请问 drainer 的问题是否已经解决?

获取不到的那个是主机地址,没有pump是正常的啊,不知道为啥要获取主机的pump

能否提供远程支持,搞不定

没有 pump 是正常的是指? 能否提供下 show pump status 的结果,还有各个 Pump 的日志?

现在问题解决了,不过drainer向kafka数据延时有点高,大约17s左右,改什么配置可以秒发

  1. 请问,问题是如何解决的?
  2. 是指drainer同步到kafka就需要17s吗? 能否先检查drainer发出的消息kafka接收到的时间是多少? kafka是否有记录? 是不是kafka消费的较慢, 或者是从drainer 发送消息到kafka在不同机架,网络较慢,麻烦先帮忙判断下,问题主要发生的阶段。