ELK Stack Introduction

一 简介

Elastic Stack是开源(www.elastic.co)的日志搜集解决方案,主要是解决分布式系统中日志集中管理。ELK是Elasticsearch、Logstash、Kibana的简称。目前Elastic Stack生态圈的组件很多,适用于各种不同的业务场景,如日志分析、指标分析、网站搜索、安全分析等。

搭建基于ELK的日志平台,主要是通过搜集程序日志,了解业务运行状况从而制定相应的调整策略。

二 Elasticsearch集群搭建

2.1 准备

Elasticsearch集群节点数量保证是奇数个,这里以3个ES节点为例。服务器初始环境的配置包括:

· JDK版本: 1.8

· 操作系统文件打开数(/etc/security/limits.conf):

echo “ soft nofile 65536” >> /etc/security/limits.conf ​ echo “ hard nofile 65536” >> /etc/security/limits.conf ​ · /etc/sysctl.conf

fs.file-max = 6553560

vm.max_map_count=262144

· 服务器目录规划(目录权限属于elastic用户)

/opt elasticsearch程序、日志所在路径

/data 新挂载1T盘,做LVM。ES的数据存储路径

· 端口开放

9200为ES启动默认端口;9300为ES集群间通讯端口。开放2个端口。

重启服务器。

2.2 集群搭建(Elasticsearch 6.6.2)

2.2.1 安装包下载

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.2.tar.gz

程序启动只能以非root账号,这里使用elastic

2.2.2 集群配置

· 修改配置文件(/opt/elasticsearch-6.6.2/config/elasticsearch.yml)

cluster.name: elk-cluster  
node.name: es-0001  
path.data: /data  
path.logs: /opt/elasticsearch-6.6.2/logs
network.host: 0.0.0.0  # 集群配置 0.0.0.0  
http.port: 9200  # ES服务端口  
discovery.zen.ping.unicast.hosts: ["192.168.1.2", "192.168.1.3", "192.168.1.4"] #参与选主ES
discovery.zen.minimum_master_nodes: 2 # 参与选主实例数/2 + 1    

· 修改JVM内存大小(/opt/elasticsearch-6.6.2/config/jvm.options)

# 默认1G,调整为50%服务器内存
-Xms4g
-Xmx4g

2.3 Elasticsearch集群验证

curl '192.168.1.2:9200/_cat/health?v'  # 查看节点状态  
curl '192.168.1.2:9200/_cat/nodes?v'   # 查看集群信息       

三 Kibana配置与使用

3.1 准备

· JDK版本 1.8

· 文件打开数配置,参考2.1

3.2 安装与配置(Kibana 6.6.2)

3.2.1 安装包下载(yum源)

https://www.elastic.co/guide/en/kibana/current/rpm.html

3.2.2 配置连接Elasticsearch(/etc/kibana/kibana.yml)

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.1.2:9200","http://192.168.1.3:9200","http://192.168.1.4:9200"]

3.2.3 Kibana服务管理

/bin/systemctl enable kibana.service ​ /bin/systemctl start kibana.service

3.3 Kibana的使用

四 Logstash配置与使用

Logstash在ELK Stack中主要负责日志清洗,将源日志格式化输出到Elasticsearch中。Logstash的过滤插件很多,常见的如正则解析、json解析等。清洗之后的结果类似一对对k-v的键值对,在ES中可以方便的查询和做一些聚合的操作。官方插件地址:https://www.elastic.co/guide/en/logstash/6.6/filter-plugins.html

4.1 安装与配置说明

安装的方式有很多,对于CentOS 7以上的系统,推荐使用配置yum源的方式安装。低版本可以使用二进制包安装,使用nohup方式启动。

4.1.1 安装

· java8环境

· 配置yum源(https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)

· yum install logstash

4.1.2 配置(/etc/logstash/logstash.yml)

Logstash配置文件中,涉及到数据处理的主要有三个部分:input -> filter -> output 。

· input(https://www.elastic.co/guide/en/logstash/6.6/input-plugins.html)

源数据输入部分。支持的数据源格式可以参考官方文档中这部分的插件说明,目前最常见的是接受Beats的数据。Beat是清理级的日志收集组件,带一些简单的过滤功能,如只匹配ERROR行等。Filebeat可以将数据实时发送到Logstash,资源占用较小,对应用服务器压力不大。

· filter(https://www.elastic.co/guide/en/logstash/6.6/filter-plugins.html)

对源数据进行格式化处理。根据不同的日志格式做解析,如正则(grok)、IP地址解析(geoip)等插件。过滤之后,整合成类似k-v的数据。

· output(https://www.elastic.co/guide/en/logstash/6.6/output-plugins.html)

存储过滤之后的数据。支持的插件也很多,常用的如Kafka、S3、Elasticsearch等。ELK方案中主要是输出到Elasticsearch中。

4.1.3 启动

作为系统服务启动或者nohup /usr/share/logstash/bin/logstash -f logstash.conf >/dev/null 2>&1 &

4.2 Logstash使用demo – 配置Logstash解析类Apache格式日志

4.2.1 编写解析规则,如/etc/logstash/apache.conf

input {
    # Logstash读取的数据源,这里是kafka
    kafka {
        bootstrap_servers => "kafka1:9092 kafka2:9092 kafka3:9092"
        group_id => "ELK001"
        topics => ["AI_hxapi_accesslog"]
        consumer_threads => 3
        auto_offset_reset => "earliest"
        enable_auto_commit => "true"
        codec => "json"
    }
}
filter {
    grok {
        # apache标准日志解析规则
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    urldecode {
        # 对url的中文解码
        all_fields => true
    }
}

output {
        # 输出到Elasticsearch
    elasticsearch {
                 hosts => ["es1:9200","es2:9200","es3:9200"]
                 index => "hxapi_access_log-%{+yyyy.MM.dd}"
    }
}

4.2.2 调试自己的解析规则

input {
    # 从控制台输入要解析的数据
        stdin {}
}
filter{
        grok {
                match => {"message"=> "^<(?<log_type>[^>]+)><(?<appid>\-)><(?<timestamp>[^>]+)[^>\n]*><(?<thread_id>\d+)><(?<filename_line>\w+\.\w+:\d+)>\s+(?<stockinfo>.+)"}
                }
}

output {
    # 控制台输出解析结果
        stdout {}
        }

logstash -f /etc.logstash/test.conf;启动完成后,在控制台上输入要解析的日志内容即可。

五 Filebeat配置与使用

5.1 使用说明

Filebeat是轻量级的日志抽取工具。与Logstash相比,占用系统的资源比较少,适合全量日志或者简单过滤日志传输。新的架构里,可以用Filebeat抽取日志发送到Logstash,由Logstash进行日志清洗。这样做可以减轻业务程序所在服务器的负担,同时也保证清洗的完整性。

5.2 安装与配置说明

按照官网给的安装说明,配置yum源。配置参考:

#=========================== Filebeat inputs =============================

filebeat.inputs:
- type: log
  # Change to true to enable this input configuration.
  enabled: true
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /opt/nginx/logs/app1_access.log
  tags: ["app1"] 
- type: log
  # Change to true to enable this input configuration.
  enabled: true
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /opt/nginx/logs/app2_access.log
  tags: ["app2"]
#-------------------------- Kafka output ------------------------------
output.kafka:
  # initial brokers for reading cluster metadata
  hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]

  # message topic selection + partitioning
  topic: mytopic

  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000
  version: 0.10.0.0
#================================ Logging =====================================
# 配置Filebeat程序本身日志保存时长,避免日志量增长导致磁盘空间不足
logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7  
  permissions: 0644

5.3 服务启动

systemctl start/stop/restart filebeat

六 Elastic Stack 接入安全

6.1 Nginx配置HTTP访问加密

高版本Elasticsearch的X-pack插件官方已收费,目前ES集群未开启认证。Kibana由于会在公网使用,所以配置Nginx转发做简单密码认证。

6.1.1 Kibana配置调整

server.host: “0.0.0.0” 修改为 server.host: “localhost”

6.1.2 生成登录的用户名/密码

sh -c "echo -n 'logcollection:' >> /etc/nginx/.htpasswd"
sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

6.1.3 配置Nginx反向代理

# 主要配置
location / {
             auth_basic "Welcome! Please login.";
             auth_basic_user_file /etc/nginx/.htpasswd;
             proxy_pass http://localhost:5601;
        }

6.1.4 访问Kibana

打开Nginx访问端口,输入账号密码登录

6.2 nginx-auth-ldap模块开启LDAP认证(推荐)

6.2.1 编译安装Nginx Lua环境

https://github.com/openresty/lua-nginx-module#installation

a. LuaJIT环境

https://github.com/openresty/luajit2/releases

make && make install
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1

b. ngx_devel_kit (NDK)、ngx_lua 模块

https://github.com/simplresty/ngx_devel_kit/tags

https://github.com/openresty/lua-nginx-module/tags

c. 编译安装

yum install -y openldap-devel openssl openssl-devel gcc pcre pcre-devel gd gd-devel GeoIP GeoIP-devel provides geoip-devel
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module --with-ld-opt="-Wl,-rpath,/usr/local/lib" --add-module=/usr/local/nginx_module/ngx_devel_kit-0.3.0 --add-module=/usr/local/nginx_module/lua-nginx-module-0.10.14
make && make install

6.2.2 Nginx配置参考

worker_processes  4;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;


    sendfile        on;

    keepalive_timeout  65;

# LDAP config
    ldap_server mycorp {
        url ldap://ldapserver:389/DC=mycorp,DC=com,DC=cn?sAMAccountName?sub?(objectClass=person);
        binddn "my@mycorp.com.cn";
        binddn_passwd mypasswd;
        group_attribute uniquemember;
        group_attribute_is_dn on;
        require valid_user;
      }

    server {
        listen       15601;
        server_name  mydomain;
        auth_ldap "Welcome! Please login with  LDAP account";
        auth_ldap_servers mycorp;

        location / {
            proxy_pass http://localhost:5601;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}