ELK集中式日志平台之二 — 部署

647 阅读4分钟
原文链接: www.fanhaobai.com

由于系统日志量还在可控范围,所以选择了 ELK+Beats 的方案,并未引入消息队列,当然后续需要可以对系统升级。鉴于此,只需要在日志平台部署 Elasticsearch 和 Logstash 集群,同时在应用服务器部署 Filebeat。

安装前准备

JAVA环境

ELK 需要 JAVA 8 以上的运行环境,若未安装则按如下步骤安装:

# 查看是否安装
$ rpm -qa | grep java
# 批量卸载
$ rpm -qa | grep java | xargs rpm -e --nodeps
$ yum install -y java-1.8.0-openjdk*
$ java -version
openjdk version "1.8.0_151"

在文件/etc/profile配置环境变量:

# 指向安装目录,其中1.8.0.151需与版本号保持一致
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el6_9.x86_64
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
JAVACMD=/usr/bin/java
export JAVA_HOME JAVACMD CLASSPATH PATH

执行source /etc/profile命令,使配置环境生效。

安装GPG-KEY

由于后续采用 yum 安装,所以需要下载并安装 GPG-KEY:

$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
yum 命令会安装最新的版本,若需安装较旧的版本,请先从 官方地址 下载对应的旧版本 rpm 包,然后使用rpm -ivh命令安装。

Elasticsearch

安装

通过 官方地址 下载选择最新版本,然后解压:

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.tar.gz
$ mkdir -p /usr/local/elk
$ tar zxvf elasticsearch-6.1.1.tar.gz -C /usr/local/elk
$ mv /usr/local/elk/elasticsearch-6.1.1 /usr/local/elk/elasticsearch

启动前,需要修改配置文件jvm.options中 JVM 大小,否则可能会内存溢出,导致启动失败。

$ vim config/jvm.options
# 根据实际情况修改
-Xms128m
-Xmx256m

由于 Elasticsearch 新版本不允许以 root 身份启动,因此先创建 elk 用户。这里使用 service 服务方式管理 Elasticsearch,修改启动用户和安装目录。

$ useradd elk
$ chown -R elk:elk /usr/local/elk/elasticsearch

$ vim /etc/init.d/elasticsearch
ES_USER="elk"
ES_GROUP="elk"
ES_HOME="/usr/local/elk/elasticsearch"
MAX_OPEN_FILES=65536
MAX_MAP_COUNT=262144
LOG_DIR="$ES_HOME/logs"
DATA_DIR="$ES_HOME/data"

设置开机启动服务,启动 Elasticsearch,其默认监听 9200 端口。

# 开启服务
$ chkconfig --add elasticsearch
$ chkconfig elasticsearch on

$ service elasticsearch start

$ netstat -tunpl | grep "9200"
tcp   0   0 127.0.0.1:9200   0.0.0.0:*    LISTEN    27029/java
# 获取信息
$ curl http://127.0.0.1:9200

最后,安装使用到的插件:

$ cd /usr/local/elk/elasticsearch
# ingest-geoip和ingest-user-agent分别为ip解析插件和agent解析插件
$ bin/elasticsearch-plugin install ingest-geoip
$ bin/elasticsearch-plugin install ingest-user-agent
# 用户管理和monitor管理
$ bin/elasticsearch-plugin install x-pack
# 修改用户密码
$ bin/x-pack/setup-passwords interactive

安装 x-pack 插件后,对 Elasticsearch 的操作都需要授权,默认用户名为 elastic,默认密码为 changeme。

Kibana

首先,在/etc/yum.repos.d目录下创建名为kibana.repo的 yum 源文件:

[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

使用 yum 命令安装:

$ yum install -y kibana
$ mkdir -p /usr/local/elk
$ ln -s /usr/share/kibana /usr/local/elk/kibana
$ cd /usr/local/elk/kibana

修改配置文件kibana.yml以下配置项:

$ mkdir -p /usr/local/elk/kibana/config
$ mv /etc/kibana/kibana.yml /usr/local/elk/kibana/config
$ vim config/kibana.yml

server.port: 5601                           # 监听端口
server.host: "0.0.0.0"                      # 绑定地址
server.name: "elk.fanhaobai.com"            # 域名
elasticsearch.url: "http://127.0.0.1:9200"  # es
kibana.index: ".kibana"                     # 索引名
elasticsearch.username: "elastic"           # 用户名
elasticsearch.password: "changeme"          # 密码

安装常用插件,例如 x-pack:

$ bin/kibana-plugin install x-pack

Kibana 运行时 NodeJs 默认会最大分配 1G 内存,可以在启动时增加max-old-space-size参数,以限制其运行内存大小:

$ vim bin/kibana

# 增加--max-old-space-size=140参数
NODE_ENV=production exec "${NODE}" $NODE_OPTIONS --max-old-space-size=140 --no-warnings "${DIR}/src/cli" ${@}

修改 init 启动脚本,并启动 Kibana:

$ vim /etc/init.d/kibana

home=/usr/share/kibana
program=$home/bin/kibana
args=-c\\\ $home/config/kibana.yml
# 默认以kibana运行
$ chown -R kibana:kibana /usr/local/elk/kibana/*
$ chkconfig --add kibana
$ chkconfig kibana on
$ service kibana start

配置 Web 服务后,访问 elk.fanhaobai.com 就可以看到 Kibana 强大又绚丽的界面。

安装 x-pack 插件后,访问 Kibana 同样需要授权,且任何 Elasticsearch 的用户名和密码对都可被认证通过。

Logstash

安装

首先,在/etc/yum.repos.d目录下创建logstash.repo文件:

[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

使用 yum 安装 Logstash,并测试:

# 安装logstash 5.x
$ yum install -y logstash
# 默认安装路径/usr/share
$ mkdir -p /usr/local/elk
$ ln -s /usr/share/logstash /usr/local/elk/logstash
$ cd /usr/local/elk/logstash
# 命令行测试
$ bin/logstash -e 'input { stdin { } } output { stdout {} }'

The stdin plugin is now waiting for input:
elk
2017-11-21T22:25:07.264Z fhb elk

修改配置文件路径:

$ mv /etc/logstash /usr/local/elk/logstash/config
# 修改文件权限
$ chown -R elk:elk /usr/local/elk/logstash

修改 JVM 内存大小,防止出现内存溢出异常:

$ vim config/jvm.options
# 根据实际情况修改
-Xms80m
-Xmx150m

生成并修改 init 启动脚本:

$ bin/system-install /etc/logstash/startup.options sysv
$ vim /etc/init.d/logstash
home=/usr/share/logstash
name=logstash
program=$home/bin/logstash
args=--path.settings\ $home/config
user="elk"
group="elk"
# 添加启动
$ chkconfig --add logstash
$ chkconfig logstash on

安装 x-pack 插件,基本状态信息的监控:

$ bin/logstash-plugin install x-pack

配置

主配置文件

Logstash 主配置文件为config/logstash.yml,配置如下:

path.data: /var/lib/logstash
path.logs: /usr/share/logstash/logs
# 配置
path.config: /usr/share/logstash/config/conf.d
# elasticsearch用户名和密码
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme

配置管道

创建一个简单的管道(inputs → filters → outputs),配置文件为conf.d/filebeat.conf。日志过滤处理后,直接推送到 Elasticsearch,在 output 部分需配置 Elasticsearch 的用户名和密码。

input {
    beats {
        port => 5044
    }
}

filter {
    if [fileset][name] =~ "access" {
        grok {
            match => {"message" => "%{COMBINEDAPACHELOG}"}
        }
        date {
            match => ["timestamp", "dd/MMM/YYYY:H:m:s Z"]
        }
    } else if [fileset][name] =~ "error" {
    
    } else {
        drop {}
    }
}

output {
    elasticsearch {
        hosts => "localhost:9200"
        manage_template => false
        index => "%{[@metadata][type]}-%{+YYYY.MM}"  #索引名称
        document_type => "%{[fields][env]}"          #文档类型
        user => "elastic"                            #用户名     
        password => "changeme"                       #密码
    }
}

完整配置见 配置示例 部分,更多配置示例见 Logstash Configuration Examples

启动

$ service logstash start
# 完成监听
$ netstat -tnpl | grep 5044
tcp   0      0 0.0.0.0:5044     0.0.0.0:*    LISTEN      10132/java

Beats

Filebeat

安装

由于同 Elasticsearch 使用一个源,所以直接使用 yum 安装:

# 安装filebeat 5.6.6
$ yum install -y filebeat
$ mkdir -p /usr/local/elk/beats
$ ln -s /usr/share/filebeat /usr/local/elk/beats/filebeat
$ cd /usr/local/elk/beats/filebeat

修改 init 启动脚本:

$ vim /etc/init.d/filebeat

home=/usr/share/filebeat
pidfile=${PIDFILE-/var/run/filebeat.pid}
agent=${BEATS_AGENT-$home/bin/filebeat}
args="-c $home/filebeat.yml -path.home $home -path.config $home -path.data $home/data -path.logs $home/logs"

配置启动服务:

$ chkconfig --add filebeat
$ chkconfig filebeat on

配置

创建 Filebeat 配置文件filebeat.yml,开启 nginx 日志模块采集 access 日志信息:

filebeat.modules:
- module: nginx
  access:
    enabled: true
    var.paths: ["/data/logs/fanhaobai.com.access.log"] #日志路径
    prospector:
      document_type: nginx-www-access               #Logstash的type字段
  error:
    enabled: true
    var.paths: ["/data/logs/error.log"]
    prospector:
      document_type: nginx-all-error
fields:                                      #自定义字段,Logstash的fields字段
  env: prod                                  #添加环境标识
queue_size: 1000
bulk_queue_size: 0

output.logstash:                             #输出到Logstash
  enabled: true
  hosts: ["localhost:5044"]  
  worker: 1  
  loadbalance: true
  index: 'filebeat'

启动

$ service filebeat start
# 查看推送日志
$ tailf /usr/local/elk/beats/filebeat/bin/logs/filebeat
2017-12-22T02:00:53+08:00 INFO Non-zero metrics in the last 30s: filebeat.harvester.open_files=1 filebeat.harvester.running=1
libbeat.logstash.publish.read_bytes=6 libbeat.logstash.publish.write_bytes=460

Filebeat 启动后,会侦测待采集文件内容是否有增加或更新,并实时推送数据到 Logstash。

因为 Filebeat、Logstash 有些配置并不向后兼容,更新升级后可能导致服务不可用,所以这里在/etc/yum.conf增加exclude=filebeat logstash配置项,禁用yum update的自动更新。

数据呈现

Filebeat 推送到 Logstash 过滤后,Elasticsearch 存储的数据格式为:

{
    "_index": "nginx-www-access-2017.12",
    "_type": "prod",
    "_source": {
        "response_code": "200",
        "ip": "106.11.152.143",
        "offset": 81989257,
        "method": "GET",
        "user_name": "-",
        "input_type": "log",
        "http_version": "1.1",
        "read_timestamp": "2017-12-21T18:12:53.604Z",
        "source": "/data/logs/fanhaobai.com.access.log",
        "fileset": {
            "name": "access",
            "module": "nginx"
        },
        "type": "nginx-www-access",
        "url": "/2017/11/qconf-deploy.html",
        "referrer": "-",
        "@timestamp": "2017-12-21T18:12:53.000Z",
        "@version": "1",
        "beat": {
            "name": "fhb",
            "hostname": "fhb",
            "version": "5.6.5"
        },
        "host": "fhb",
        "body_sent": { "bytes": "44067" },
        "fields": { "env": "prod" }
    }
}

在 Kibana 中呈现效果为:

相关文章 »