前言

建议服务器/虚拟机至少4G内存,本文使用的 ELK 版本均为 6.5.4

效果如下(链接可能失效)


ELK 由 Elasticsearch、Logstash 和 Kibana 三部分组件组成。

  • Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  • Logstash 是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用
  • kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

安装

Docker 安装 ElasticSearch

Docker 安装 Logstash

Docker 安装 Kibana

配置

配置 kibana

访问地址:http://localhost:5601 ,效果如下。

kibana-home

点击 Disconver,在上方出现如下信息

In order to visualize and explore data in Kibana, you'll need to create an index pattern to retrieve data from Elasticsearch.

大概意思是说为了在 Kibana 中展示数据,需要创建一个索引从 ElasticSearch 中检索数据。

kibana-discover

这里呢,我们创建一个索引为 product,该索引是我之前已经在 ElasticSearch 中新增的数据,可以在 ElasticSearch-Head 中查看。

elasticsearch-head-index-product

添加好索引,索引所对应得数据就可以在 kibana 中展示出来了,如下如所示。

kibana-discover

配置 Logstash

docker 运行 logstash 容器的时候,需要指定输入输出及过滤器,这里我们简单地展示下 logstash 的用法:使用控制台输入,然后输出到控制台。

docker run -it --rm logstash:6.5.4 \
-e 'input { stdin { } } output { stdout { } }'

待 logstash 启动好,在控制台输入 hello world,立即看到输出了

[root@test home]# docker run -it --rm logstash:6.5.4 -e 'input { stdin { } } output { stdout { } }'
# 此处省略启动信息...
[2019-01-17T02:04:42,837][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
^C[2019-01-17T02:04:47,446][WARN ][logstash.runner          ] SIGINT received. Shutting down.
[2019-01-17T02:04:47,982][INFO ][logstash.pipeline        ] Pipeline has terminated {:pipeline_id=>"main", :thread=>"#<Thread:0x463023ae run>"}
 # 输入
hello word
# 输出
{
       "message" => "hello word",
      "@version" => "1",
          "host" => "5fbc23c4b4d6",
    "@timestamp" => 2019-01-17T02:04:41.852Z
}
[root@test home]#

展示了 logstash 的用法,有人可能有疑问,logstash 到底 和 elasticsearch 有什么关系呢,我们为什么要用 logstash 呢?

通过 logstash 添加/同步数据到 elasticsearch

本文只展示 elasticsearch、mysql 同步数据,其他玩法请参考Docker Logstash 参考配置

  • employees.conf
input {
    stdin {
    }

    jdbc {
      # mysql数据库连接信息
      jdbc_connection_string => "jdbc:mysql://mysql.lqiao.top/employees?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"
      # 驱动配置
      jdbc_driver_library => "/home/logstash/mysql-connector-java-6.0.5.jar"
      # 驱动类名
      jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
      # mysql用户名和密码
      jdbc_user => "employees"
      jdbc_password => "Passwd@123456"


      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      jdbc_default_timezone =>"Asia/Shanghai"

      # 执行指定的sql语句
      statement_filepath => "/home/logstash/employees.sql"
      # 设置监听 各字段含义 分 时 天 月  年 ,默认全部为*代表含义:每分钟都更新
      schedule => "* * * * *"
      # 索引类型
      type => "people"
    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    # 输出到elasticsearch的配置
    elasticsearch {
        # ES服务器
        hosts => ["172.17.0.2:9200"]
        # ES索引名称
        index => "employees"
        # 自增ID,为mysql的自增字段
        document_id => "%{emp_no}"
    }

    # 这里输出调试,正式运行时可以注释掉
    stdout {
        codec => json_lines
    }
}
  • employees.sql
select * from employees

启动

/home/logstash 目录下包含 Mysql JDBC驱动和 employees.confemployees.sql

命令说明:

  • -v /home/logstash:/home/logstash:将主机 /home/logstash 目录挂载到容器的 /home/logstash
  • --link elasticsearch:elasticsearch:告诉当前容器需要使用 elasticsearch 容器,并命名为 elasticsearch(默认命名为 elasticsearch,需和 logstash 容器内 /config/logstash.yml 中保持一致)
  • -f /home/logstash/employees.conf:执行 employees.conf 文件
docker run -it --rm \
-v /home/logstash:/home/logstash \
--link elasticsearch:elasticsearch \
logstash:6.5.4 -f /home/logstash/employees.conf

然后耐心等待,logstash 会将数据一点点的导入进 elasticsearch 中...

results matching ""

    No results matching ""