无法从 maxscale 拉取binlog,直接报错。

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

  • 【TiDM 版本】:1.0.3
  • 【问题描述】:我最近在试着用 maxscale 建一个binlog 中转服务,maxscale 可以模拟成一个 binlog server,然而问题来了,tidm 连上去发了几个命令后,崩了。

打印 maxscale 服务端的日志,发现是以下命令: SET NAMES utf8mb4’ SHOW GLOBAL VARIABLES LIKE ‘sql_mode’ SHOW GLOBAL VARIABLES LIKE ‘server_uuid’ SHOW GLOBAL VARIABLES LIKE ‘BINLOG_CHECKSUM’

在服务端,这些命令的确不兼容,查询不到数据。 image

于是 dm 就崩了。

怎么办?dm 可不可以兼容一下这种情况呢,还是必须得拿到 ‘BINLOG_CHECKSUM’ 才行?

  1. 麻烦提供一下拓扑和响应的版本,是从 MariaDB 同步到 TiDB ,通过 DM 么 ?
  2. 从现象看 dm-worker 内存溢出,需要提供具体的配置信息和 binlog 的情况介绍 ?
  1. 我这儿要跨外网同步一个库的数据到TiDB,但是运维那边不允许我直接给数据库开外网,所以我找到了 maxscale,想由它来作为binlog代理开外网访问,然后让dm连它同步数据到TiDB。(或者,请问有其他跨网同步的方案不,两边数据库都不允许外网连接) 2.我现在还在尝试dm拉取binlog阶段,一连上maxscale 就报错了。

我大概定位到问题。

我是用maxscale 开一个 binlog 模拟服务。

然后登进去呢, SHOW VARIABLES LIKE ‘sql_mode’ 这个命令拿不到返回值。

所以问题应该是在maxscale这儿,我还在找有没有办法解决。

而tidm这边,根据报错信息,https://github.com/siddontang/go-mysql/blob/master/replication/binlogsyncer.go 的253行这儿,如果没有返回值应该会崩吧。 好像也不是dm能解决的。

所以,我还是得回去找maxscale。

惨。

确认了,dm里用到了 https://github.com/siddontang/go-mysql/blob/master/replication/binlogsyncer.go 250行执行的命令 ”SHOW GLOBAL VARIABLES LIKE ‘BINLOG_CHECKSUM’“ , maxscale 这个工具不支持这个命令。

但是, maxscale 支持 SELECT @master_binlog_checksum 这个命令。 ( https://github.com/mariadb-corporation/MaxScale/blob/9e27e6c002b297d6ddbdbdb34c3de849069a9d7c/server/modules/routing/binlog/blr_slave.c#L276-L331

所以,要么dm重新打个包,要么 maxscale 重新打个包,两者要兼容一下才行。

你可以在 GitHub 提一个 issue ,然后提一个 pr 自己修改一下。如果我们的 committer 确认 pr 可以合进去,那么你就是我们的的 contributor 。https://github.com/pingcap/dm/issues

这个问题是在go-mysql 库里, 所以我把issue提那儿去了。 https://github.com/siddontang/go-mysql/issues/483

不过想要等解决恐怕早呢。

昨天1.0.4dm包也出来了,我今天折腾了一天,看看如何自己打包,第一次正儿八经的整GO语言,配环境过程中各种坑。

最后,我魔改了go-mysql的代码,我也不管逻辑了,反正我直接注释掉了会报错的代码。

重新打包后,果然成功连上了maxscale,更多情况,待我继续观察。

感谢反馈。 期待您更多分享,另外DM工具的疑问,建议可以和DM工具组直接联系即可,多谢https://github.com/pingcap/dm/issues