oynix

于无声处听惊雷,于无色处见繁花

ELK 单机部署,多 beat 节点

参考文章

适用场景:多个项目或服务,独立部署,各个服务有自己的 log 文件。为便于查看、过滤等,可单机部署 ELK 服务后,各个服务通过 filebeat 服务将 log 发送至 ELK 机器。

一、安装 java

1
2
3
4
5
6
$ sudo yum install java

$ java -version
openjdk version "11.0.5" 2019-10-15 LTS
OpenJDK Runtime Environment Corretto-11.0.5.10.1 (build 11.0.5+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.5.10.1 (build 11.0.5+10-LTS, mixed mode)

对于 elasticsearch、logstash 和 kibana,Elastic.co 都提供了多种环境的安装方式,这里只介绍通过 RPM 的方式,其他环境可参考官网文档

二、安装 elasticsearch

  1. 下载安装公钥。
    1
    $ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  2. 增加 yum 源。在 /etc/yum.repos.d/ 创建文件 elasticsearch.repo 并写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    [elasticsearch-7.x]
    name=Elasticsearch repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
  3. 安装、启动
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ sudo yum install elasticsearch

    $ sudo systemctl daemon-reload

    $ sudo systemctl enable elasticsearch.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

    $ sudo systemctl start elasticsearch.service

    $ sudo systemctl | grep elasticsearch
    elasticsearch.service loaded active running Elasticsearch
    注意:elasticsearch 基于 java,默认占用的最小内存是 1G,如果机器内存不够启动时会报错 Not enough space,将 /etc/elasticsearch/jvm.options 中的 -Xms-Xmx 改小后重试即可。

三、安装 logstash

  1. 下载安装公钥。如果上面执行过,可跳过。
    1
    $ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  2. 增加 yum 源。在 /etc/yum.repos.d/ 创建文件 logstash.repo 并写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    [logstash-7.x]
    name=Elastic repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
  3. 安装
    1
    2
    3
    4
    5
    6
    $ sudo yum install logstash

    $ sudo systemctl daemon-reload

    $ sudo systemctl enable logstash.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.
  4. 配置。在 /etc/logstash/conf.d/ 创建文件 beat2es.conf,并写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    input {
    beats{
    port => 5044
    ssl => false
    }
    }
    filter {
    grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:[@metadata][timestamp]} %{DATA:message" }
    overwrite => [ "message" ]
    }
    date {
    match => [ "[@metadata][timestamp]" , "yyyy-MM-dd HH:mm:ss,SSS" ]
    }
    }
    output {
    elasticsearch {
    hosts => ["localhost:9200"]
    index => "%{[fields][appname]}-%{+YYYY.MM.dd}"
    sniffing => true
    }
    }
  5. 启动
    1
    $ sudo systemctl start logstash

四、安装 kibana

  1. 下载安装公钥。如果上面执行过,可跳过。
    1
    $ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  2. 增加 yum 源。在 /etc/yum.repos.d/ 创建文件 kibana.repo 并写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    [kibana-7.x]
    name=Kibana repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
  3. 安装、启动
    1
    2
    3
    4
    5
    6
    7
    8
    $ sudo yum install kibana

    $ sudo systemctl daemon-reload

    $ sudo systemctl enable kibana.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.

    $ sudo systemctl start kibana.service
至此,ELK 服务已经部署完成。logstash 监听 5044 端口,所有发送到 5044 端口的内容都会传送至 elasticsearch,可通过 kibana 可视化搜索页面进行查询。
kibana 默认部署在 locaohost:5601,为了增加安全性,需通过 nginx 为 kibana 设置用户登陆访问。
如果不需要安全性,可修改 /etc/kibana/kibana.yml 文件,将其中的 server.host 的值改为 0.0.0.0 后重启 kibana 服务,这样外网可直接通过该机器的 5601 端口访问 kibana 服务。

五、设置 kibana 登陆访问

  1. 添加 nginx 源
    1
    $ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  2. 安装 nginx
    1
    $ sudo yum install nginx
  3. 配置 nginx。修改 /etc/nginx/conf.d/default.conf/ 路由的配置,如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    location / {
    auth_basic "secret";
    auth_basic_user_file /etc/nginx/db/passwd.db;
    proxy_pass http://localhost:5601;
    proxy_set_header Host $host:5601;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Via "nginx";
    }
  4. 安装 httpd
    1
    $ sudo yum install httpd
  5. 设置用户。用户名:jack,密码:123456
    1
    $ sudo htpasswd -bc /etc/nginx/pwd.db jack 123456
  6. 启动 nginx
    1
    $ sudo systemctl nginx.service
至此,访问该机器的 80 端口,通过用户密码验证,即可访问到 kibana 服务。

六、安装 filebeat

filebeat 服务可安装在任何有 log 文件的机器上,其实时监听 log 文件,并将内容发送至 logstash 服务。

  1. 下载 rpm 文件,并安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.2-x86_64.rpm
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 22.7M 100 22.7M 0 0 24.8M 0 --:--:-- --:--:-- --:--:-- 24.8M

    $ sudo rpm -vi filebeat-7.4.2-x86_64.rpm
    Preparing packages...
    filebeat-7.4.2-1.x86_64

    $ filebeat version
    filebeat version 7.4.2 (amd64), libbeat 7.4.2 [15075156388b44390301f070960fd8aeac1c9712built 2019-10-28 19:46:13 +0000 UTC]
  2. 配置。配置文件按模块分为了几部分,如 Filebeat inputs、Filebeat modules、Outputs等,在这里只需关心两个模块,一是 Filebeat inputs,另个为 Outputs。
    Filebeat inputs 用来配置 Filebeat 服务所监听、读取的文件,以及读取时的一些选项,这里的文件,即为 log 文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    enabled: true 表示开启

    paths: 指定 log 文件的路径

    fields: 配置元数据,appname 为必填项,用来区分不同项目

    multiline.pattern: 正则表达式

    multiline.negate: 是否反向。true 表示匹配 multiline.pattern 时开始新的一行;false 表示不匹配时开始新的一行

    multiline.match: 连接的位置。after 表示不匹配 multiline.pattern 时连在上一句后面;before 表示连在下一句前面

    3 项用来设置多行识别,'^[0-9]{4}-[0-9]{2}-[0-9]{2}' 是识别,行首格式为 YYYY-MM-DD 的日期,即每当行首为该格式的日期时,如 2019-11-15,都会重新开始一行。

    Outputs 用来配置读取到的内容,如何输出。配置里缺省的输出方向是 Elasticsearch,这里需要切换为 Logstash。Logstash 的 SSL 目前尚未开启,因此只需配置 hosts 即可。

    1
    hosts: ["{host}:5044"],logstash 服务所在的主机地址

    如无特殊需求,修改下面内容中的 pathsappname 以及 hosts,替换原 filebeat.yml 文件内容,即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
       #=========================== Filebeat inputs =============================

    filebeat.inputs:

    - type: log
    enabled: true
    paths:
    - /var/log/app.log
    fields:
    appname: {your-app-name}
    multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    multiline.negate: true
    multiline.match: after

    #============================= Filebeat modules ===============================

    filebeat.config.modules:
    # Glob pattern for configuration loading
    path: ${path.config}/modules.d/*.yml

    # Set to true to enable config reloading
    reload.enabled: false

    #==================== Elasticsearch template setting ==========================

    setup.template.settings:
    index.number_of_shards: 1
    #index.codec: best_compression
    #_source.enabled: false

    #================================ Outputs =====================================

    #----------------------------- Logstash output --------------------------------
    output.logstash:
    # The Logstash hosts
    hosts: ["{host}:5044"]

    # Optional SSL. By default is off.
    # List of root certificates for HTTPS server verifications
    #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

    # Certificate for SSL client authentication
    #ssl.certificate: "/etc/pki/client/cert.pem"

    # Client Certificate Key
    #ssl.key: "/etc/pki/client/cert.key"

    #================================ Processors =====================================

    processors:
    - add_host_metadata: ~
    - add_cloud_metadata: ~
  3. 启动

    1
    2
    3
    $ sudo systemctl enable filebeat.service

    $ sudo systemctl start filebeat.service
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2019/11/60757107ed17/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道