go-mysql-elasticsearch是一款开源的高性能的Mysql数据同步ES的工具,其由go语言开发,编译及使用非常
简单。go-mysql-elasticsearch的原理很简单,首先使用mysqldump获取当前MySQL的数据,然后在通过此
时binlog的name和position获取增量数据,再根据binlog构建restful api写入数据到ES中
//设置为ROW模式
set global binlog_format="ROW";
//查看模式
show global variables like "%binlog_format%";
PUT /products/
{
"mappings":{
"properties":{
"name":{
"type":"text",
"analyzer":"ik_smart"
},
"long_name":{
"type":"text",
"analyzer":"ik_smart"
},
"brand_id":{
"type":"integer"
},
"category_id":{
"type":"integer"
},
"shop_id":{
"type":"integer"
},
"price":{
"type":"scaled_float",
"scaling_factor":100
},
"sold_count":{
"type":"integer"
},
"review_count":{
"type":"integer"
},
"status":{
"type":"integer"
},
"create_time":{
"type":"date"
},
"last_time":{
"type":"date"
}
}
}
}
1 . 拉取取go-mysql-elasticsearch镜像
docker pull gozer/go-mysql-elasticsearch
2 . 创建一个目录用于存储配置文件
mkdir /docker/go-mysql-es
cd /docker/go-mysql-es
touch go_mysql_river.toml
文件内容如下
my_addr = "172.17.0.4:3306" --mysql地址与端口
my_user = "root" --mysql用户
my_pass = "root" --mysql密码
my_charset = "utf8" --字符集
enable-relay = true
es_addr = "172.17.0.7:9200" --es的地址与端口
es_user = "" --es用户名
es_pass = "" --es密码
data_dir = "/docker/data" --存储数据目录
stat_addr = "127.0.0.1:12800" --服务器内部地址
stat_path = "/metrics"
server_id = 1001
flavor = "mysql"
mysqldump = "" --备份文件
#skip_master_data = false
bulk_size = 128
flush_bulk_time = "200ms"
skip_no_pk_table = false
[[source]]
schema = "lmrs" --同步的mysql数据库名称
tables = ["lmrs_products"] --同步的mysql表
#es 映射的mapping
[[rule]]
schema = "lmrs"
table = "lmrs_products"
# es的索引名
index = "products" --同步的es索引
type = "_doc" --同步的es类型
filter = ["id", "name","long_name","brand_id","shop_id","price","sold_count","review_count","status","create_time","last_time","three_category_id"] --同步哪些字段
[rule.filed] --mysql的three_category_id替换es的category_id
mysql = "three_category_id"
elastic = "category_id"
3 . 构建go-mysql-elasticsearch容器
docker run -p 12345:12345 -d --name go-mysql-es \
-v /docker/go-mysql-es/go_mysql_river.toml:/config/river.toml:ro \
--privileged=true \
gozer/go-mysql-elasticsearch
注释:启动好后,就会自动把数据同步到es中
1 . 数据库中已有的数据,不会触发同步到es中,会一直出现一个报错
2 . 编辑数据库的内容,也会出现这个问题
:如下
有可能在导入数据的时候,生成的日志并不是 ROW模式的数据,导致无法吧数据同步到es中,解决方案是mysql更改为ROW模式后,重新导入/生成(INSERT INTO 的方式) 数据表中的数据