logstash的安装以及mysql到es的数据同步

441 阅读2分钟

「这是我参与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进行增量数据的处理,这里我并没有用过,后期用到了之后在进行说明吧。

好了,玩的开心