IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    实战ElasticStack

    老王发表于 2016-12-11 07:22:52
    love 0

    我对 ElasticStack 可以说是既熟悉又陌生,说熟悉是因为很久以前就已经开始使用 ELK 来分析日志了,说陌生是因为以前的 ELK 环境都是同事搭建的,我主要是看看 Kibana 面板而已。随着 V5 的发布,ELK 全面进化为 ElasticStack,是时候动手了。

    实际操作前最好大致浏览一下官方文档,以便对 ElasticStack 各个组件的作用有一个基本概念,如果看完文档还没搞清楚,那么至少要看明白下面这张图:

    ElasticStack

    ElasticStack

    整个流程相当简单,首先服务器通过 Filebeat 把数据上报给 Logstash,然后 Logstash 分析后把数据保存到 ElasticSearch 里,最后用户通过 Kibana 浏览数据。

    废话少说,接下来让我们按顺序安装 ElasticStack 的各个组件,不过安装前我们需要确保系统已有 Java 且版本足够新,一般这种运行环境我习惯用包管理工具:

    shell> yum install java-1.8.0-openjdk

    同时记得创建一个系统账号(比如叫 elastic)以便后续运行服务使用。

    第一步:安装 ElasticSearch

    shell> tar zxvf elasticsearch-<VERSION>.tar.gz
    shell> mv elasticsearch-<VERSION> /usr/local/elasticsearch
    shell> /usr/local/elasticsearch/bin/elasticsearch

    服务启动后,我们可以通过 elasticsearch 提供的 API 来确认一下基本信息:

    shell> curl http://localhost:9200/
    {
      "name" : "...",
      "cluster_name" : "...",
      "cluster_uuid" : "...",
      "version" : {
        "number" : "...",
        "build_hash" : "...",
        "build_date" : "...",
        "build_snapshot" : false,
        "lucene_version" : "..."
      },
      "tagline" : "You Know, for Search"
    }

    缺省情况下,elasticsearch 服务会监听 9200 端口,如果你想自定义监听地址和端口,那么可以设置 elasticsearch.yml 配置文件中的 network.host 和 http.port 选项。

    此时,elasticsearch 服务已经完全准备好了,不过还不算完,推荐安装 x-pack 插件,它在安全,监控等方面为 elasticsearch 提供了完善的支持:

    shell> /usr/local/elasticsearch/bin/elasticsearch-plugin install x-pack

    安装好 x-pack 后,会生成一个管理用户,用户名是 elastic,密码是 changeme,此时我们如果还想通过 curl 命令来操作 elasticsearch 的话,就需要用户名密码了:

    shell> curl -u elastic http://localhost:9200/

    不过使用缺省密码是不安全的,所以我们应该修改它:

    shell> curl -XPUT -u elastic -d '{"password": "<PASSWORD>"}' \
           'localhost:9200/_xpack/security/user/elastic/_password'

    至此,elasticsearh 的安装算是基本工作了,我们还可以确认一下服务的健康与否:

    shell> curl -u elastic http://localhost:9200/_cluster/health?pretty
    {
      "cluster_name" : "my-application",
      "status" : "yellow",
      "timed_out" : false,
      "number_of_nodes" : 1,
      "number_of_data_nodes" : 1,
      "active_primary_shards" : 3,
      "active_shards" : 3,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 2,
      "delayed_unassigned_shards" : 0,
      "number_of_pending_tasks" : 0,
      "number_of_in_flight_fetch" : 0,
      "task_max_waiting_in_queue_millis" : 0,
      "active_shards_percent_as_number" : 60.0
    }

    你可能已经注意到在上面的结果中,状态被标记为危险的黄色,而不是安全的绿色。实际上我们的安装步骤没有问题,之所以会显示黄色,实际上是因为从集群的角度看,这个集群目前只有一个节点,所以是不安全的。多节点的配置大家就自己看文档吧。

    第二步:安装 Kibana

    shell> kibana-<VERSION>-linux-x86_64.tar.gz
    shell> mv kibana-<VERSION>-linux-x86_64 /usr/local/kibana
    shell> /usr/local/kibana/bin/kibana

    不过启动服务器需要先设置好配置文件 kibana.yml,此外同样需要安装 x-pack:

    shell> /usr/local/kibana/bin/kibana-plugin install x-pack

    缺省情况下,Kibana 服务会监听 5601 端口,如果有需要也可以在配置文件中修改。

    第三步:安装 Logstash

    shell> tar zxvf logstash-<VERSION>.tar.gz
    shell> mv logstash-<VERSION> /usr/local/logstash
    shell> /usr/local/logstash/bin/logstash -f /path/to/logstash.conf

    关键在于配置文件 logstash.conf 的编写,它包含 input、filter、output 三部分:

    input {
      beats {
        host => "<HOST>"
        port => 5044
      }
    }
    
    filter {
      grok {
        match => {
          "message" => "%{HTTPD_COMBINEDLOG} (?:%{NUMBER:time:float}|-)"
        }
      }
    
      kv {
        prefix => "request_"
        source => "request"
        field_split => "&"
      }
    
      urldecode {
        all_fields => true
      }
    
      date {
        match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
      }
    }
    
    output {
      elasticsearch {
        hosts => ["<HOST>:9200"]
        user => "<USER>"
        password => "<PASSWORD>"
      }
    }

    说明:HTTPD_COMBINEDLOG 等价于旧版的 COMBINEDAPACHELOG。

    其中,input 通过 5044 端口接收 Filebeat 发送的数据,output 把分析后的数据发送到远端 elasticsearch 的 9200 端口,难点在于 filter 的编写,下面以 nginx 日志为例来说明,缺省情况下,nginx 包含了 combined 的日志格式,也就是:

    log_format combined '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';

    不过我们通常还关心响应时间,所以我们多记录一个 $upstream_response_time:

    log_format logstash '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '$upstream_response_time';

    在 filter 中又属 grok 最难懂,不过有很多例子,其中也包含了 COMBINED 正则,再配上 debug 工具,并不难搞定,如果有问题,那么可以把 output 改成调试模式来纠错:

    output {
      stdout { codec => rubydebug }
    }

    其它诸如 kv,urldecode,date 等等的说明,大家参考官方文档即可。

    第四步:安装 Filebeat

    有很多种 Beat,比如 Packetbeat,Winlogbeat,Metricbeat,因为我们是通过 Nginx 日志来收集数据,所以我们选择的是 Filebeat,配置文件 /etc/filebeat/filebeat.yml大致如下:

    filebeat.prospectors:
    
    - input_type: log
      paths:
        - /path/to/nginx/logstash/format/log/file
    
    output.logstash:
      hosts: ["<HOST>:5044"]

    在我们安装 ELK 的过程中,都是使用手动启动服务的方式,不过需要说明的是 ELK 都是内存消耗大户,保不齐就会出现 OOM 之类的意外情况,所以推荐用 supervisor 管理:

    [program:elasticsearch]
    command=/usr/local/elasticsearch/bin/elasticsearch
    numprocs=1
    autostart=true
    autorestart=true
    user=elastic
    
    [program:logstash]
    command=/usr/local/logstash/bin/logstash -f /path/to/logstash.conf
    numprocs=1
    autostart=true
    autorestart=true
    user= elastic
    
    [program:kibana]
    command=/usr/local/kibana/bin/kibana
    numprocs=1
    autostart=true
    autorestart=true
    user= elastic

    如此,一个基本可用的 ElasticStack 就算是配置好了,理论上 ELK 三部分都是可以水平扩展的,如果性能有问题,一般加节点就行了,下面给一个实际的日志统计图表:

    TIME

    TIME

    通过分析日志里的 $upstream_response_time 数据,我们可以把响应时间分割到多个区间里:90%,95%,99%,如此比单纯取全体平均值更合理。

    结束前再提醒一下大家,如果是按日期索引的日志,那么最好定期清除旧索引:

    shell> curl -XDELETE -u <USER>:<PASSWORD>
           http://<HOST>:9200/logstash-$(date -d '-10days' +'%Y.%m.%d')

    更多的功能就靠大家自己去挖掘了,希望本文能起到抛砖引玉的作用。



沪ICP备19023445号-2号
友情链接