es与mysql数据同步 (go-mysql-es)

es与mysql数据同步 (go-mysql-es)

简介

go-mysql-elasticsearch是一款开源的高性能的Mysql数据同步ES的工具,其由go语言开发,编译及使用非常

简单。go-mysql-elasticsearch的原理很简单,首先使用mysqldump获取当前MySQL的数据,然后在通过此

时binlog的name和position获取增量数据,再根据binlog构建restful api写入数据到ES中

注意

  • mysql binlog必须是ROW模式
//设置为ROW模式
set global binlog_format="ROW";

//查看模式
show global variables like "%binlog_format%";
  • 要同步的mysql数据表必须包含主键,否则直接忽略,这是因为如果数据表没有主键,UPDATE和DELETE操作就会因为在ES中找不到对应的document而无法进行同步
  • 不支持程序运行过程中修改表结构

es创建索引

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"
            }
        }
    }
}

go-mysql-elasticsearch部署

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"

es与mysql数据同步 (go-mysql-es)_第1张图片

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 . 编辑数据库的内容,也会出现这个问题

:如下

es与mysql数据同步 (go-mysql-es)_第2张图片

已知的解决方案 :

有可能在导入数据的时候,生成的日志并不是 ROW模式的数据,导致无法吧数据同步到es中,解决方案是mysql更改为ROW模式后,重新导入/生成(INSERT INTO 的方式) 数据表中的数据

你可能感兴趣的:(ELK,elasticsearch,mysql)