本文主要讲述MySQL数据如何同步到ES7

使用go-mysql-elasticsearch开源同步工具

简介

参考地址

开源工具github地址

go-mysql-elasticsearch的基本原理是:如果是第一次启动该程序,首先使用mysqldump工具对源mysql数据库进行一次全量同步,通过elasticsearch client执行操作写入数据到ES;然后实现了一个mysql client,作为slave连接到源mysql,源mysql作为master会将所有数据的更新操作通过binlog event同步给slave, 通过解析binlog event就可以获取到数据的更新内容,之后写入到ES。

另外,该工具还提供了操作统计的功能,每当有数据增删改操作时,会将对应操作的计数加1,程序启动时会开启一个http服务,通过调用http接口可以查看增删改操作的次数。

使用事项

  1. MySQL binlog必须是ROW模式;

  2. 要同步的mysql数据表必须包含主键,否则直接忽略,这是因为如果数据表没有主键,UPDATE和DELETE操作就会因为在ES中找不到对应的document而无法进行同步;

  3. 不支持程序运行过程中修改表结构;

  4. 要赋予用于连接mysql的账户RELOAD权限以及REPLICATION权限, SUPER权限;

    1
    2
    3
    GRANT REPLICATION SLAVE ON *.* TO 'elastic'@'172.16.32.44';
    GRANT RELOAD ON *.* TO 'elastic'@'172.16.32.44';
    UPDATE mysql.user SET Super_Priv='Y' WHERE user='elastic' AND host='172.16.32.44';

利用Binlog和Kafka实时同步mysql数据到Elasticsearch

参考地址

分析

binlog中间件,负责解析binlog,把变动的数据以json的格式发送给kafka;

kafka中间件,负责消费kafka队列中的Message,把数据写入到elasticsearch中;

地址

使用Canal将MySQL数据同步到Elasticsearch

canal简介

阿里巴巴开源的canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。

canal工作原理

canal会模拟MySQL主库和从库的交互协议,从而伪装成MySQL的从库,然后向MySQL主库发送dump协议,MySQL主库收到dump请求会向canal推送binlog,canal通过解析binlog将数据同步到其他存储中去。

地址

canal的使用

首先我们需要下载canal的各个组件canal-servercanal-adaptercanal-admin

  1. calnal-server(canal-deploy) : 可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理;
  2. canal-adapter:相当于canal的客户端,会从canal-server中获取数据,然后对数据进行同步,可以同步到MySQL、Elasticsearch和HBase等存储中去;
  3. canal-admin:为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。

注:不同版本的MySQL、Elasticsearch 和 canal 会有兼容性问题,要注意版本。