go-mysql-elasticsearch插件简介
go-mysql-elasticsearch是用于同步mysql数据到ES集群的一个开源工具,项目github地址:
https://github.com/siddontang/go-mysql-elasticsearch
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权限: 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';
使用体验
go-mysql-elasticsearch完成了最基本的mysql实时同步数据到ES的功能,业务如果需要更深层次的功能如允许运行中修改mysql表结构,可以进行自行定制化开发。
异常处理不足,解析binlog event失败直接抛出异常
据作者描述,该项目并没有被其应用于生产环境中,所以使用过程中建议通读源码,知其利弊。
项目背景
由于项目中需要使用中文的全局搜索,然而mongodb无法做到中文的语义分析,所以只好使用专业的搜索数据库elasticsearch,而数据是写入到mongodb的,如果修改业务,写入mongodb同时写入elasticsearch,就会显得逻辑很冗余,而mongodb也没有SQLAlchemy那样可以监听事务提交,所以只好找找其它方法,发现有很多将mongodb直接同步到elasticsearch的daemon,但是调研一番后发现不是不能用了就是年久失修,最终选择了monstache。
monstache介绍
官方的介绍是:a go daemon that syncs mongodb to elasticsearch in realtime,贴上github地址:https://github.com/rwynn/monstache。
要想同步,mongodb必须使用repica set, 这样才会产生oplog,而monstache则是使用oplog来实现实时同步的,monstache可以配置参数namespace-regex来决定哪些database的哪些collection是需要同步的,规则如下:
namespace-regex = '^mydb\.(mycollection|\$cmd)$'
例如,我需要备份mydb的mycollection,则配置为 '^mydb\.mycolletion$' 就行了,它会监听到所有的写操作,并完成同步,关于如何配置repica set和monstache,这里就不详细介绍了,贴上monstache的参考文档:https://rwynn.github.io/monstache-site/start/。
repica set:可以将MongoDB中的副本集看作一组服务器集群由一个主节点和多个副本节点等组成,相对于之前讲到的主从复制提供了故障自动转移的功能。副本集实现数据同步的方式依赖于local数据库中的oplog数据。
oplog:是存在与主节点或副本节点上的local数据库中的一个固定集合,记录了每一次主节点的写操作,或副本节点每一次从主节点复制数据的操作。
另外一种方法:Mongo-ES连接器
mongo-connector是一个实时同步服务,作为python包。它创建了一个从mongodb集群到一个或多个目标系统的管道。它需要mongo以副本集模式运行,将mongo中的数据同步到目标然后关闭mongo oplog。它需要一个名为“elastic2_doc_manager”的包来向ES写入数据
需要更多教程,微信扫码即可
别忘了扫码领资料哦【高清Java学习路线图】
和【全套学习视频及配套资料】