Docker 配置 Logstash 并将Mysql数据同步至ElasticSearch

最近配置这个东西挺折磨的,决定把过程记录下来,方便将来。

部分过程参考自:https://blog.csdn.net/chongshi4396/article/details/100805225

准备工作

首先要把镜像pull下来,版本号要与ElasticSearch的版本一致。参考:我的ElasticSearch版本是7.12.1。

docker pull logstash:7.12.1

创建config与pipeline的挂载目录

先创建并启动一个容器。

设置环境变量:-e LS_JAVA_OPTS="-Xms512m -Xmx512m"

由于默认内存是1g,这里修改为512m,防止内存不足,内存充足的无需添加此参数。

docker run -it -p 5044:5044 -p 9600:9600 -d --name logstash_7.12.1 -e LS_JAVA_OPTS="-Xms512m -Xmx512m" --privileged=true logstash:7.12.1

容器启动成功后

将容器内的我们需要挂载的两个目录复制出来

docker cp logstash_7.12.1:/usr/share/logstash/config/ /usr/docker/logstash/config/
docker cp logstash_7.12.1:/usr/share/logstash/pipeline/ /usr/docker/logstash/pipeline/

效果如下:

在这里插入图片描述

接着我们就可以把这个容器删除了,下面开始创建我们真正要运行的容器。

docker rm logstash_7.12.1

创建容器并配置Mysql与ES的同步

创建容器并运行

docker run -it -p 5044:5044 -p 9600:9600 -d --name logstash_7.12.1 -e LS_JAVA_OPTS="-Xms512m -Xmx512m" -v /usr/docker/logstash/config/:/usr/share/logstash/config/ -v /usr/docker/logstash/pipeline/:/usr/share/logstash/pipeline/  --privileged=true logstash:7.12.1

进入容器内

docker exec -it logstash_7.12.1 /bin/bash

在容器内为Mysql与ES的连接安装插件

bin/logstash-plugin install logstash-input-jdbc
bin/logstash-plugin install logstash-output-elasticsearch

安装有点慢,请忍一下()。

同时,我们还要为mysql的连接配置驱动,驱动要下载对应的版本。

这里我下载好驱动后,将其放在了**/usr/docker/logstash/pipeline**下(非容器内的目录)。路径如下。

Docker 配置 Logstash 并将Mysql数据同步至ElasticSearch_第1张图片

同时对映射目录**/usr/docker/logstash/config/**下的相关文件进行修改

修改后如下所示

pipeline.yml

# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html

- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline/logstash.conf"

logstash.yml

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://121.971.68.29:9200" ]
xpack.monitoring.enabled: true

以及/usr/docker/logstash/pipeline下的

logstash.conf

input {
  stdin {
  }
  jdbc {
  jdbc_connection_string => "jdbc:mysql://112.139.47.563:3306/test?characterEncoding=UTF-8&useSSL=false&autoReconnect=true"
  jdbc_user => "root"
  jdbc_password => "root"
  jdbc_driver_library => "/usr/share/logstash/pipeline/mysql-connector-java-8.0.16.jar"
  jdbc_driver_class => "com.mysql.jdbc.Driver"
  jdbc_paging_enabled => "true"
  jdbc_page_size => "50000"
  codec => plain { charset => "UTF-8"}


  tracking_column => update_time

  last_run_metadata_path => "/usr/share/logstash/pipeline/logstash_jdbc_last_run"

 jdbc_default_timezone => "Asia/Shanghai"   #设置时区
  statement=>"select * from topic where update_time > :sql_last_value"


  clean_run => false

  schedule => "* * * * *" #默认每1分钟更新一次数据


  }
}
output {
  elasticsearch {
    hosts => "112.93.28.19:9200"
    index => "topic"
	#document_type => "_doc"
    document_id => "%{id}"
  }
  stdout {
    codec => json_lines
  }
}

此时,还缺少一个文件logstash_jdbc_last_run,

我们直接在pipeline目录下创建它,

在这里插入图片描述

logstash_jdbc_last_run

--- !ruby/object:DateTime '2019-01-07 02:40:00.317455000 Z'
~

并解放它的权限,防止容器没有访问它的权限而不断轮询。

chmod 777 logstash_jdbc_last_run

一切工作准备就绪,退出容器

运行验证是否成功

重新启动容器,让配置生效


docker restart  logstash_7.12.1 

查看日志

docker logs -f logstash_7.12.1 

在这里插入图片描述

成功把mysql的增量数据插入到es。

END

你可能感兴趣的:(笔记,ELK,elasticsearch,elk)