1. 前言
Elasticsearch(ES)可用于全文检索、日志分析、指标分析、APM等众多场景,而且搭建部署容易,后期弹性扩容、故障处理简单。ES在一定程度上实现了一套系统支持多个场景的希望,大幅度降低使用多套专用系统的运维成本(当然ES不是万能的,不能满足事务等场景)。正是因为其通用性和易用性,ES自2010年发布首个版本以来得到爆发式的发展,广泛应用于各类互联网公司的不同业务场景,在数据库的专业排名中(DB Engines)上升至第8位。
对于很多用户,想要将Mysql中的数据导入到ES中,而又找不到一种较好的方法,笔者这里给出一种简单快捷的方式,轻松将Mysql中的数据同步到ES。
2. 工具介绍 — go-mysql-elasticsearch
go-mysql-elasticsearch是一款开源的高性能的Mysql数据同步ES的工具,其由go语言开发,编译及使用非常简单。go-mysql-elasticsearch的原理很简单,首先使用mysqldump获取当前MySQL的数据,然后在通过此时binlog的name和position获取增量数据,再根据binlog构建restful api写入数据到ES中。下面笔者将会给出详细的使用步骤。
3.Mysql数据同步ES步骤
3.1Mysql配置及使用事项
- mysql binlog必须是ROW模式
- 要同步的mysql数据表必须包含主键,否则直接忽略,这是因为如果数据表没有主键,UPDATE和DELETE操作就会因为在ES中找不到对应的document而无法进行同步
- 不支持程序运行过程中修改表结构
3.2下载go-mysql-elasticsearch
git clone https://github.com/siddontang/go-mysql-elasticsearch
cd go-mysql-elasticsearch
make
vim etc/river.toml
3.3修改river.toml配置文件
# 注意:go-mysql-elasticsearch的默认配置文件在go-mysql-elasticsearch/etc/river.toml
# MySQL 的相关配置
# 指定用户必须具备复制权限
my_addr = "127.0.0.1:3306"
my_user = "root"
my_pass = "123546"
my_charset = "utf8"
# ES 相关配置
es_addr = "127.0.0.1:9200"
es_user = ""
es_pass = ""# 数据源配置
# 以 Slave 模式工作
server_id = 10001
# mysql/mariadb
flavor = "mysql"
# mysqldump 路径,如果为空或者未设置,会跳过这一环节。
mysqldump = "mysqldump"
bulk_size = 128
flush_bulk_time = "200ms"
skip_no_pk_table = false[[source]]
# 数据库名称
schema = "dataweb"
# 数据表同步范围,支持通配符
tables = ["biz_log",’*’]# 规则定义[[rule]]
# 数据库名称
schema = "dataweb"
# 规则对应的数据表,支持通配符
table = "biz_log"
# 目标 ES 索引
index = "biz"
# 该规则在 ES 中生成的文档类型
type = "log_db"
3.4运行go-mysql-elasticsearch
#切换至go-mysql-elasticsearch根目录
./bin/go-mysql-elasticsearch -config=./etc/river.toml