使用Logstash将MySQL数据同步到elasticsearch:
input {
stdin {
}
jdbc {
jdbc_driver_library => "mysql-connector-java-5.1.46-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
#B表示你的MySQL的ip+3306,A表示某个数据库
jdbc_connection_string => "jdbc:mysql://B/A"
#MySQL用户名
jdbc_user => "****"
#密码
jdbc_password => "*****"
jdbc_paging_enabled => "true"
jdbc_page_size => "100000"
#这个参数表示你在开启Logstash同步数据时需不需要clean掉上次的记录
clean_run => true
#use_column_value 设置为true,表示按照增量更新模式更新数据
use_column_value => true
#这个参数表示将id作为每次增量更新所依照的参数
tracking_column => "id"
#这是存放上一次执行之后id的值
last_run_metadata_path => "/usr/YEE/logstash-6.3.2/MySqlYee/****/*****.txt"
#sql语句可以按照脚本(路径)或者sql语句给出
#statement_filepath => "/usr/YEE/logstash-6.3.2/MySqlYee/****.sql"
#sql_last_value每次读取last_run_metadata_path中存放的值,下面语句增量更新是按照id值递增的顺序同步mysql中的内容
statement => "select * from story where id > :sql_last_value"
该参数按照 分 时 日 月 年 来设置多久更新一次数据,不设置表示仅更新一次;全* 表示每分钟更新一次
#schedule => "* * * * *"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
#下面:当使用Logstash自动生成的mapping模板时过滤掉@timestamp和@version字段
mutate {
remove_field =>
["@timestamp","@version"]
}
output {
elasticsearch {
#hosts:一般是localhost:9200
hosts => ["****:9200"]
index => "*****"
#表示按照id同步mysql数据
document_id => "%{id}"
document_type => "****"
#下面两个参数表明加载我自己配置的Mapping模板,包括可以自行设置中文分词等
template_overwrite => true
template => "/usr/YEE/logstash-6.3.2/MySqlYee/*****/template/*****_test1_ik.json"
}
stdout {
codec => json_lines
}
}
同步数据时可能遇到的一些问题:
- 对于全量更新,不用考虑数据更新的问题,但是数据量大的话需很长时间(我所描述的是每次都从elasticsearch删除数据从零的更新,否则就会有数据重复的问题了)
- 增量更新对于某条已经存在数据内容修改的问题:
- 通过在MySQL数据库中添加一列用于记录实时修改时间,然后上面增量更新的参数就设置为这个updatetime,每次数据有一点改动都要更新这个updatime的值,这样就可以把每一次修改的值都更新;
- 增量更新对于数据删除的问题:
- 设置两个参数:updatetime记录当前更新数据时间;Delete_flag:表示这条数据有没有被删掉
- 当使用自己的template时遇到问题:elasticsearch每新增加一个index都会使用这个template中提供的mapping。Logstash同步数据时包括创建新的mapping时,都先查看已经已经存在的template:
GET /_cat/templates
,然后就会看到一条记录如下:
通过代码:DELETE /_template/logstash
删掉这个template,然后在添加新的index - Logstash could not be started because there is already another instance using the configured data directory.
- 解决办法:
- 1、添加新的路径
- 2、 ps aux|grep logstash 查询运行中的Logstash进程
- kill -9 xxx kill进程