在公司里,使用公司的 DTS(数据传输服务) 可以帮你实现 MySQL 数据的变更自动同步到 ES,那么它是怎么实现并保证一致性的呢?

通过搜索,我发现这个问题的主流解决方案都是通过 MySQL 的 binlog,

我们都知道,binlog 是 MySQL 在 server 级别的一种日志(任何存储引擎都可以用)。它不同于 redo undo log,undolog 这种是在InnoDB 的存储引擎层实现的。其中 undo 记录的是数据变更前的日志(用于回滚,保证原子性)。redo 记录的是数据变更后的数据(用于救援,保证持久性)。

binlog 包含下面三种

  • statement, 记录的是 SQL 语句,这种在主从复制时可能会出现主从的 Diff,比如插入顺序不对导致的 id 不同。
  • row,记录的是每行的情况,缺点是记录的数据会过大。比如 update 语句更新100行数据。采用 statement 只需要记录这一句 SQL,而采用 row 则需要记录100行。
  • mixed,上面两种混合。自动判断使用哪种模式。

看到这我已经猜到,公司使用的是 binlog 且 type = row 的这种。因为 statement 肯定是实现不了的,而 mixed 具体怎么自动选择的我还不了解。但对于往另一种存储里去同步数据来说,无疑 row 是最方便的,mixed 就算解决了主从复制问题,如果写 ES 的时候还需要根据 SQL 查数据也是够麻烦的!

于是我查了公司的 DTS 文档,发现确实是有如下要求:

  • 开启binlog,且 binlog_format 参数值为 ROW
  • 5.6以上 MySQL,binlog_row_image 值设置为 FULL