zoukankan      html  css  js  c++  java
  • Ubuntu 搭建ELK

     

    一、简介

    官网地址:https://www.elastic.co/cn/

    官网权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

    安装指南:https://www.elastic.co/guide/en/elasticsearch/reference/5.x/rpm.html

    ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。

    Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。

    Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。

    Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据

    二、准备工作

    环境介绍

    操作系统 主机名 IP地址 相关软件
    ubuntu-16.04.5-server-amd64 jqb-node128 192.168.91.128 elasticsearch,kibana
    ubuntu-16.04.5-server-amd64 jqb-node128 192.168.91.128 logstash,filebeat,nginx

    架构图

    说明:

    文本主要是采集Nginx的access日志。采集的方式有2中,分别是logstash和filebeat。

    logstash依赖于java环境,比较重。而filebeat是一个轻量级的logstash,它不需要java环境。而且安装包比较小!

    所以本文会分别介绍2中采集工具的使用方法!

    镜像选择

    本文所使用的镜像是ubuntu,注意:使用docker push镜像时,一定要加版本号!使用16.04

    为什么呢?因为默认的是ubuntu是18.04,安装logstash的deb包时,会报错一个ruby错误!无法解决!

    使用16.04就不会出现这个问题了!

    elk版本选择

    打开官网 https://www.elastic.co/cn/,目前最新版是6.4.3。那么就直接怼最新版,不要怂!

    各个组件版本,统一为6.4.3

    安装docker

    本文所使用的几个组件,都是基于docker安装的。这样方便部署!

    修改ubuntu更新源

    2台服务器,修改ubuntu的更新源为阿里云。默认的更新源太慢了!

    vim /etc/apt/sources.list

    内容如下:

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu xenial-security main restricted
    deb http://mirrors.aliyun.com/ubuntu xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu xenial-security multiverse
    View Code

    更新资源

    apt-get update

    2台服务器都安装docker

    apt-get install -y docker.io

    修改镜像为阿里云

    默认的更新源太慢了,所以这里直接使用阿里云的更新源

    在2台服务器上面修改

    vim /etc/docker/daemon.json 

    内容如下:

    {
       "registry-mirrors": [
          "https://kv3qfp85.mirror.aliyuncs.com"
        ]
    }

     2台服务器都 重启docker服务

    systemctl restart docker

    下载软件包

    登录到128服务器,创建目录,并下载软件包。待会dockerfile会用到!

    mkdir /opt/elasticsearch
    cd /opt/elasticsearch
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.3.deb
    
    mkdir /opt/kibana
    cd /opt/kibana
    wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.3-amd64.deb

    如果下载速度比较慢,可以开迅雷下载,再上传到服务器!

    复制sources.list,待会dockerfile会用到!

    cp /etc/apt/sources.list /opt/elasticsearch/
    cp /etc/apt/sources.list /opt/kibana/

    登录到129服务器,创建目录,并下载软件包。待会dockerfile会用到!

    mkdir /opt/logstash
    cd /opt/logstash
    wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.3.deb
    
    mkdir /opt/filebeat
    cd /opt/filebeat
    wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.3-amd64.deb

    复制sources.list,待会dockerfile会用到!

    cp /etc/apt/sources.list /opt/logstash/
    cp /etc/apt/sources.list /opt/filebeat/

    三、安装elasticsearch

    登录到128服务器,修改系统参数

    vim /etc/sysctl.conf

    修改参数vm.max_map_count,此参数必须修改,否则启动失败!

    vm.max_map_count = 2621440

    使用以下命令刷新

    sysctl -p

    请确保服务器有2G的可用内存!否则会导致elasticsearch启动失败!

    创建dockerfile

    vim /opt/elasticsearch/dockerfile

    内容如下:

    FROM ubuntu:16.04
    # 修改更新源为阿里云
    ADD sources.list /etc/apt/sources.list
    ADD elasticsearch-6.4.3.deb ./
    # 安装jdk和elasticsearch
    RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && dpkg -i elasticsearch-6.4.3.deb && rm -rf elasticsearch-6.4.3.deb
    EXPOSE 9200
    # 添加启动脚本
    ADD run.sh .
    RUN chmod 755 run.sh
    ENTRYPOINT [ "/run.sh"]

    准备run.sh

    vim /opt/elasticsearch/run.sh

    内容如下

    #!/bin/bash
    set -e
    
    # 添加时区
    TZ=Asia/Shanghai
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    # 设置权限
    chown -R elasticsearch:elasticsearch /etc/elasticsearch
    
    # 判断目录是否存在,否则创建
    if [ ! -d /var/lib/elasticsearch/data ];then
      mkdir -p /var/lib/elasticsearch/data
      chown -R elasticsearch:elasticsearch /var/lib/elasticsearch/data
    fi
    if [ ! -d /var/log/elasticsearch/logs ];then
      mkdir -p /var/log/elasticsearch/logs
      chown -R elasticsearch:elasticsearch /var/log/elasticsearch/logs
    fi
    
    # 修改数据和日志目录
    sed -i '33s@/var/lib/elasticsearch@/var/lib/elasticsearch/data@g' /etc/elasticsearch/elasticsearch.yml
    sed -i '37s@/var/log/elasticsearch@/var/log/elasticsearch/logs@g' /etc/elasticsearch/elasticsearch.yml
    
    # 修改绑定ip和端口
    sed -i '55s@#network.host: 192.168.0.1@network.host: 0.0.0.0@g' /etc/elasticsearch/elasticsearch.yml 
    sed -i '59s@#http.port: 9200@http.port: 9200@g' /etc/elasticsearch/elasticsearch.yml
    
    # 修改启动文件,去掉-d参数,避免后台运行
    sed -i 72's@-d -p $PID_FILE@-p $PID_FILE@g' /etc/init.d/elasticsearch
    
    # 启动elasticsearch,要hold住,否则容器启动就退出了!
    /etc/init.d/elasticsearch start
    View Code

    此时, /opt/elasticsearch目录结构如下:

    ./
    ├── dockerfile
    ├── elasticsearch-6.4.3.deb
    ├── run.sh
    └── sources.list

    生成镜像

    docker build -t elasticsearch-6.4.3 /opt/elasticsearch

    启动容器

    docker run -d -it --restart=always -p 9200:9200 elasticsearch-6.4.3

    等待几秒钟,查看端口是否起来了

    root@jqb-node128:/opt/elasticsearch# netstat -anpt
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1303/sshd       
    tcp6       0      0 :::9200                 :::*                    LISTEN      13342/docker-proxy
    tcp6       0      0 :::22                   :::*                    LISTEN      1303/sshd       

    访问页面

    http://192.168.91.128:9200/

    效果如下:

    按照网络大部分的文章来讲,这个时候,应该要安装elasticsearch-head插件。但是不好意思,目录的elasticsearch-head插件不支持elasticsearch6.x版本。

    最高支持到elasticsearch5.x版本!

    四、安装logstash

    登录到129服务器,在安装logstash之前,先来安装Nginx

    安装nginx

    apt-get install -y nginx

    安装好之后,默认就启动了。访问首页:

    默认的access日志为

    /var/log/nginx/access.log

    安装logstash

    创建dockerfile,内容如下:

    FROM ubuntu:16.04
    # 修改更新源为阿里云
    ADD sources.list /etc/apt/sources.list
    ADD logstash-6.4.3.deb ./
    # 安装jdk和elasticsearch
    RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && dpkg -i logstash-6.4.3.deb && rm -rf logstash-6.4.3.deb
    EXPOSE 9600
    # 添加启动脚本
    ADD run.sh .
    RUN chmod 755 run.sh
    ENTRYPOINT [ "/run.sh"]

    准备run.sh,内容如下:

    #!/bin/bash
    
    # 添加时区
    TZ=Asia/Shanghai
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    
    # 修改配置文件
    sed -i '41s@# pipeline.workers: 2@# pipeline.workers: 1@g' /etc/logstash/logstash.yml
    sed -i '45s@# pipeline.batch.size: 125@pipeline.batch.size: 125@g' /etc/logstash/logstash.yml
    
    sed -i '50s@# pipeline.batch.delay: 50@pipeline.batch.delay: 5@g' /etc/logstash/logstash.yml
    
    sed -i '64s@# path.config:@path.config: /etc/logstash/conf.d@g' /etc/logstash/logstash.yml
    
    sed -i '190s@# http.host: "127.0.0.1"@http.host: "0.0.0.0"@g' /etc/logstash/logstash.yml
    sed -i '195s@# http.port: 9600-9700@# http.port: 9600@g' /etc/logstash/logstash.yml
    
    cp -r /etc/logstash /usr/share/logstash/config
    
    # 启动
    /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf
    View Code

    准备logstash.conf,内容如下:

    input {
            
            file {
                    path => "/var/log/nginx/access.log"
                    type => "system"
                    start_position => "beginning"
            }
    }
            
    output {    
            elasticsearch {
                    hosts => ["192.168.91.128:9200"]
                    index => "system-%{+YYYY.MM.dd}"
                    }
            stdout { codec => rubydebug }
    }

    参数解释:

    input : 表示输入的内容
    
      file: 表示类型为文件
    
        path: 文件路径
        type: 类型
        start_position: 监听文件的起始位置,默认是end。beginning表示开始
    
    
    output : 表示输出的内容
    
      elasticsearch : 表示输出到elasticsearch 
        hosts: ip地址,这里的ELASTICSEARCH,待会会被run.sh替换为真正的地址,比如192.168.91.128:9200
        index: 索引值,index常用的%{+YYYY.MM.dd}这种写法必须读取@timestamp数据。这样写容易做分片,方便es删除历史数据!
                stdout { codec => rubydebug } 开启debug日志输出
    View Code

    注意:调试阶段要先开启日志输出,否则无法知道有没有发送数据!

    如果还想收集nginx错误日志,path还可以这么写

    /var/log/nginx/*.log

    因为error日志也在/var/log/nginx/目录下。

    如果想收集/var/log里面的所有文件,可以这么写

    /var/log/*/*

    此时, /opt/logstash目录结构如下:

    ./
    ├── dockerfile
    ├── logstash-6.4.3.deb
    ├── logstash.conf
    ├── run.sh
    └── sources.list

    生成镜像

    docker build -t logstash-6.4.3 /opt/logstash

    启动容器

    docker run -it --restart=always -p 9600:9600 -v "/opt/logstash:/etc/logstash/conf.d" -v /var/log:/var/log logstash-6.4.3

    注意:这里使用2个-v选项,用来挂载文件

    logstash.conf 是配置文件,需要配置文件路径以及elasticsearch地址,注意要带端口号

    /var/log 是日志文件,因为要监控nginx的日志,所以要把日志目录挂载到容器中

    run.sh 启动时,会加载配置文件 /etc/logstash/conf.d/logstash.conf

    等待几秒钟,查看端口是否起来了

    root@jqb-node129:/opt/logstash# netstat -anpt
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      32174/nginx -g daem
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      8798/sshd       
    tcp        0      0 192.168.91.129:22       192.168.91.1:54112      ESTABLISHED 33699/sshd: root@no
    tcp        0     36 192.168.91.129:22       192.168.91.1:52999      ESTABLISHED 31702/0         
    tcp6       0      0 :::80                   :::*                    LISTEN      32174/nginx -g daem
    tcp6       0      0 :::22                   :::*                    LISTEN      8798/sshd       
    tcp6       0      0 :::9600                 :::*                    LISTEN      41726/docker-proxy

    访问页面

    http://192.168.91.129:9600/

    效果如下:

    查看elasticsearch的数据

    http://192.168.91.128:9200/_search?pretty

    效果如下:

     

    没有发现index值,数据是空的!

    访问一下nginx页面,查看access日志是否有了

    root@b304d87c93c4:/etc/logstash/conf.d# tail -f /var/log/nginx/access.log 
    192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
    192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.91.129/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"

    查看docker进程

    root@jqb-node129:/opt/logstash# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
    b304d87c93c4        logstash-6.4.3      "/run.sh"           7 minutes ago       Up 6 minutes        0.0.0.0:9600->9600/tcp   inspiring_fermat

    查看日志输出:

    docker logs -t b304d87c93c4

    输出如下信息:

    {
              "type" => "system",
              "path" => "/var/log/nginx/access.log",
        "@timestamp" => 2018-11-15T10:08:24.189Z,
           "message" => "192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"",
          "@version" => "1",
              "host" => "b304d87c93c4"
    }
    {
              "type" => "system",
              "path" => "/var/log/nginx/access.log",
        "@timestamp" => 2018-11-15T10:08:24.276Z,
           "message" => "192.168.91.1 - - [15/Nov/2018:18:08:23 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.91.129/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"",
          "@version" => "1",
              "host" => "b304d87c93c4"
    }

    再次查看elasticsearch页面,发现数据已经有了!index值为system-2018.11.15

     既然有了数据,就可以使用kin展示了!

    查看索引

    http://192.168.91.128:9200/_cat/indices?v

    这个索引,就是接下来kabana要填的索引值。

    更多api,请参考链接:

    https://blog.csdn.net/hanyuyang19940104/article/details/81743459

    五、安装kibana

    登录到128服务器,创建dockerfile

    内容如下:

    FROM ubuntu:16.04
    ADD kibana-6.4.3-amd64.deb ./
    # 安装jdk和elasticsearch
    RUN dpkg -i kibana-6.4.3-amd64.deb && rm -rf kibana-6.4.3-amd64.deb
    EXPOSE 5601
    # 添加启动脚本
    ADD run.sh .
    RUN chmod 755 run.sh
    ENTRYPOINT [ "/run.sh"]

    注意:kibana不需要安装jdk,直接安装deb包即可!

    准备run.sh,内容如下:

    #!/bin/bash
    
    # 添加时区
    TZ=Asia/Shanghai
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    elasticsearch="192.168.91.128"
    
    # 修改配置文件
    # 修改监听地址
    sed -i '7s@#server.host: "localhost"@server.host: "0.0.0.0"@g' /etc/kibana/kibana.yml
    # 去除注释
    sed -i '28s@#elasticsearch.url: "http://localhost:9200"@elasticsearch.url: "http://localhost:9200"@g' /etc/kibana/kibana.yml
    # 修改ip
    sed -i "28s?localhost?$elasticsearch?g" /etc/kibana/kibana.yml
    
    
    # 启动
    /usr/share/kibana/bin/kibana "-c /etc/kibana/kibana.yml"
    View Code

    此时, /opt/kibana目录结构如下:

    ./
    ├── dockerfile
    ├── kibana-6.4.3-amd64.deb
    └── run.sh

    生成镜像

    docker build -t kibana-6.4.3 /opt/kibana

    启动容器

    docker run -d -it --restart=always -p 5601:5601 kibana-6.4.3

    等待几秒钟,查看端口是否起来了

    root@jqb-node128:/opt/elasticsearch# netstat -anpt
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1303/sshd       
    tcp6       0      0 :::9200                 :::*                    LISTEN      13342/docker-proxy
    tcp6       0      0 :::5601                 :::*                    LISTEN      2488/docker-proxy
    tcp6       0      0 :::22                   :::*                    LISTEN      1303/sshd       

    访问页面

    http://192.168.91.128:5601

    选择不参加体验计划

    点击左边的Discover,下面已经提示了index值

     

    将index值复制过来,选择下一步

    时间选择@timestamp,点击创建

     

    效果如下:

    多刷新几次Nginx页面,刷10次。

    效果如下:

     

     如果数据较少,是不会出现这个页面的!

    六、安装filebeat

    下面演示如下使用filebeat

    查看进程

    root@jqb-node129:/opt/logstash# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
    b304d87c93c4        logstash-6.4.3      "/run.sh"           49 minutes ago      Up 50 seconds       0.0.0.0:9600->9600/tcp   inspiring_fermat

    杀掉logsth的进程

    docker rm b304d87c93c4 -f

    由于时间关系,这里不演示使用docker了。直接服务器安装filebeat

    dpkg -i filebeat-6.4.3-amd64.deb

    关于filebeat,主要是配置文件

    /etc/filebeat/filebeat.yml

    要修改的部分如下:

    - type: log
    
      # Change to true to enable this input configuration.
      enabled: false
    
      # Paths that should be crawled and fetched. Glob based paths.
      paths:
        - /var/log/*.log
        #- c:programdataelasticsearchlogs*
    
    ...
    
    
    output.elasticsearch:
      # Array of hosts to connect to.
      hosts: ["localhost:9200"]

    修改后的的文件如下:

    - type: log
    
      # Change to true to enable this input configuration.
      enabled: true
    
      # Paths that should be crawled and fetched. Glob based paths.
      paths:
        - /var/log/nginx/access.log
        #- c:programdataelasticsearchlogs*
    
    ...
    
    
    output.elasticsearch:
      # Array of hosts to connect to.
      hosts: ["192.168.91.128:9200"]

    注意:enabled一定要配置为true,否则不会生效,不会发送日志

    启动filebeat

    systemctl start filebeat.service

    查看elasticsearch数据,发现有filebeat的数据了

  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/9957879.html
Copyright © 2011-2022 走看看