mysql实时同步到elasticsearch

以下插件实现MySQL数据自动同步到Elasticsearch的功能

go-mysql-elasticsearch

是一种将MySQL数据自动同步到Elasticsearch的服务。

它首先用于mysqldump获取原始数据,然后使用binlog逐步同步数据。

优点:支持实时增删改

缺点:只支持有主键的表

logstash-input-jdbc

优点:操作简单

缺点:最快10s同步一次数据。支持增改,不支持删除

go-mysql-elasticsearch

使用前须知

数据库目前只支持有PK(PRIMARY KEY)

github: https://github.com/siddontang/go-mysql-elasticsearch

备注:本地需要安装go环境

步骤:

  1. cd /go/src
  2. go get github.com/siddontang/go-mysql-elasticsearch
  3. cd github.com/siddontang/go-mysql-elasticsearch
  4. make
  5. 按照教程修改etc/river.toml
  6. ./bin/go-mysql-elasticsearch -config=./etc/river.toml
  7. 可以在 http://127.0.0.1:12800/stat 上查看操作情况

分享一些遇到的问题及解决方案

问题点 错误原因 解决方案
mysqldump: Error: Binlogging on server not active
mysqldump: Error: Binlogging on server not active
ERRO[0000] canal dump mysql err: exit status 2
ERRO[0000] start canal err exit status 2
mysql没有启动备份(binlog日志 mac目录:/usr/local/etc/my.cnf
添加
log_bin=ON
log_bin_basename=/usr/local/var/mysql/mysql-bin
log_bin_index=/usr/local/var/mysql/mysql-bin.index
或者log-bin=/usr/local/var/mysql/mysql-bin
如果报错,添加server-id=123454 (随便制定一个字符串)
重启 mysqld restart
在/usr/local/var/mysql下看是否生效:可以看到多个mysql-bin和多个mysql-bin.index文件
mysqldump: Couldn’t execute ‘show fields from v_crm‘: SELECT command denied to user ‘’@’%’ for column ‘phone’ in table ‘crm_passenger’ (1143)
ERRO[0000] canal dump mysql err: exit status 2
ERRO[0000] start canal err exit status 2
data_dir = “./var”注释掉之后的错误
原因:mysql该用户权限不够
mysql新建一个全局层级用户:
mysql -uroot -p 登录
CREATE USER ‘dump’@’%’ IDENTIFIED BY ‘12345’;
GRANT ALL PRIVILEGES ON . TO ‘dump’@’%’ IDENTIFIED BY ‘12345’;
FLUSH PRIVILEGES;
没有报错,但是es上也没有数据 mysql该用户权限不够 (同上)
没有 PRIMARY KEY的表无法同步到es 目前不支持 不支持
原始数据第一次运行时,没有同步到es 该插件只支持binlog更新
注释掉data_dir = “./var”
同步到es之后,命令行可以查找数据,但是discover上无法显示数据
待解决

logstash-input-jdbc

官方文档

安装步骤

  1. logstash安装
  2. logstash-plugin install logstash-input-jdbc 安装jdbc
  3. 在logstash/bin下创建mysqltoes.conf,添加以下内容(见配置文件)
  4. ./logstash -f mysqltoes.conf

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
input {
stdin { }
jdbc {
jdbc_connection_string =>"jdbc:mysql://localhost:3306/park"
jdbc_user =>"root"
jdbc_password =>"passwd"
jdbc_driver_library
=>"../mysql-connector-java-5.1.38.jar"
jdbc_driver_class=>"com.mysql.jdbc.Driver"
tracking_column_type => "timestamp"
last_run_metadata_path => “/usr/local/Cellar/logstash/6.2.4/bin/lastrecord/”
statement =>"SELECT * FROM calendar WHERE update_time>:sql_last_value"
use_column_value => true
tracking_column => "update_time"
schedule => "* * * * *"
type => "calendar"
}
}
output {
stdout {
codec => json_lines
}
elasticsearch {
hosts =>"127.0.0.1:9200"
index =>"pangrou"
document_type =>"%{type}"
document_id =>"%{holiday_date}"
}
}

配置文件说明

  1. jdbc_driver_library 为mysql驱动包的路径
  2. tracking_column_type 此处是根据 update_time作为增量更新的条件,故为timestamp类型
  3. last_run_metadata_path 存放上次更新的偏移量文件
  4. update_time>:sql_last_value 设置为增量更新
  5. tracking_column 增量更新选取的字段
  6. index 索引名,只支持小写
  7. document_type 类型
  8. document_id id(要保持唯一性)

问题点及解决方案

问题点 原因 解决方案
logstash无法退出 - 杀死logstash进程:
ps -ef
grep logstash (用户 进程编号)
kill -9