「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。
其实现实工作中使用es,基本都是从数据库同步到es中,这里简单介绍下从mysql数据库到es的过程
安装logstash
- 1.下载安装包,目前是在linux下,需要注意下,最好下载和es版本相同的logstash
- 2.解压下载的tar包,然后进入logstash目录下
- 3.创建一个文件夹,sync文件,此时需要在里面创建一个 .conf文件和mysql-conector-java的 jar包,需要对应你的数据库,我的数据库是mysql-8.0 需要8.0的jia包
[root@localhost sync]# ls
logstash-db-sync.conf mysql-connector-java-5.1.41.jar mysql-connector-java-8.0.16.jar
- 4.编辑conf文件的内容
这里我创建了logstash-db-sync.conf 文件,内容如下,需要根据自己的情况进行修改
input{
jdbc{
jdbc_driver_library => "/usr/local/logstash/sync/mysql-connector-java-8.0.16.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://xxx.xxx.xxx.xxx:3306/blog"
jdbc_user => "root"
jdbc_password => "12345678"
lowercase_column_names => false
jdbc_default_timezone => "Asia/Shanghai"
schedule => "* * * * *"
clean_run => true
statement => "select * FROM t_blog WHERE update_time > :sql_last_value AND update_time < NOW() ORDER BY update_time desc"
}
}
output {
elasticsearch{
hosts => ["192.168.247.8:9200"]
index => "test"
document_id => "%{id}"
}
}
这里大家可以 随意编写同步一个mysql表的数据
启动同步
- 1.进入logstash/bin目录然后执行
./logstash -f /usr/local/logstash/sync/logstash-db-sync.conf
执行成功后就可以了
注意
如果上面你的mysql数据库中字段又json类型的可以下面处理下
filter {
json {
source => "stages_obj"
target => "stages"
remove_field => ["stages_obj"]
}
json {
source => "subjects_obj"
target => "subjects"
remove_field => ["subjects_obj"]
}
}
经过个人测试,共1109301条数据,共6分钟导入完成。
多个pipeline启动多个配置文件
vi /usr/local/logstash/config/pipelines.yml
- pipeline.id: mysql
pipeline.workers: 1
pipeline.batch.size: 100
path.config: "/usr/local/logstash/sync/xxx.conf"
- pipeline.id: es
queue.type: persisted
path.config: "/usr/local/logstash/sync/xxx.conf"
启动
#无需指定配置文件,默认走pipelines.yml的配置,如果使用-e或-f时,Logstash会忽略pipelines.yml文件
nohup /usr/local/logstash/bin/logstash > /dev/null 2>&1 &
多个sql
如果你需要执行多个sql语句,需要写多个input,具体如下
input {
jdbc {
type => "user"
...
}
}
input {
jdbc {
type => "home"
...
}
}
output {
if [type]=="user" {
}
}
if [type]=="home" {
}
}
}
缺点
其实使用logstash 同步mysql的数据到es又一个缺点,就是如果mysql中的数据删除掉之后,如果时物理删除,logstsah时监听不到的。会导致es数据比mysql数据库的数据多
可以考虑canel进行增量数据的处理,这里我并没有用过,后期用到了之后在进行说明吧。
好了,玩的开心