写在前面
这是一篇搭建 ELK 集群的文章,主要涉及3大组件 elasticsearch、logstash 和 kibana 以及一个日志收集代理 filebeat的安装,通过部署 ELK 建立对其感性的认识。
ELK 是Elasticsearch、Logstash、Kibana 的简写,用于将不同来源的日志集中整合的一起,建立集中式日志管理集群。
一个完整的集中式日志系统,需要有一下过程:
- 收集-能够采集多种来源的日志数据
- 传输-能够稳定的把日志数据传输到中央系统
- 存储-如何存储日志数据
- 分析-可以支持 UI 分析
- 警告-能够提供错误报告,监控机制
Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。目前,最新的版本是 7.1.1。
主要特点
- 实时分析
- 分布式实时文件存储,并将每一个字段都编入索引
- 文档导向,所有的对象全部是文档
- 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)。见图 2 和图 3
- 接口友好,支持 JSON
Logstash 是一个具有实时渠道能力的数据收集引擎。使用 JRuby 语言编写。其作者是世界著名的运维工程师乔丹西塞 (JordanSissel)。目前最新的版本是 7.1.1。
主要特点
- 几乎可以访问任何数据
- 可以和多种外部应用结合
- 支持弹性扩展
它由三个主要部分组成
- Shipper-发送日志数据
- Broker-收集数据,缺省内置 Redis
- Indexer-数据写入
Kibana 是一款基于 Apache 开源协议,使用 JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。目前最新的版本是 7.1.1,并且原生支持中文界面。
Filebeat提供一种轻型的方法用于转发和汇总日志与文件, filebeat替代 logstash-forwarder 接收日志,目前的最新版本是 7.1.1。
实验环境如下:
IP 地址 | OS | 功能 |
---|---|---|
10.0.12.235 | CentOS 7 | filebeat |
10.0.12.235 | CentOS 7 | logstash |
10.0.12.231 | CentOS 7 | elasticsearch |
10.0.12.243 | CentOS 7 | kibana |
安装 Elasticsearch
安装前准备
elasticsearch 由 java 编写,需要系统中支持 java。
代码语言:txt复制yum install java -y
获取 elasticsearch 软件包,下载至/usr/local/src 目录。
代码语言:txt复制wget -P /usr/local/src https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.1-linux-x86_64.tar.gz
创建elasticsearch 的 data 目录和log目录,用于保存 elasticsearch的数据和日志。
代码语言:txt复制 mkdir -p /data/elasticsearch/{data,log}
创建 elasticsearch 用户,因为 elasticsearch 可以接收用户输入的脚本并执行,所以出于系统安全考虑,elasticsearch 默认禁止 root 用户运行 elasticsearch,需要创建 elasticsearch 用户。
代码语言:txt复制useradd -d /usr/local/elasticsearch -M elasticsearch
安装 elasticsearch
解压elasticsearch软件包至指定目录/usr/local。
代码语言:txt复制tar xf /usr/local/src/elasticsearch-7.1.1-linux-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/elasticsearch-7.1.1/ /usr/local/elasticsearch
修改相关目录的属主
代码语言:txt复制chown -R elasticsearch /usr/local/elasticsearch
chown -R elasticsearch /usr/local/elasticsearch-7.1.1/
chown -R elasticsearch /data/elasticsearch/
最简单的 elasticsearch 配置文件
配置文件:
代码语言:txt复制cluster.name: my-application #集群名称
node.name: node-1 #当前节点的名称
path.data: /data/elasticsearch/data #数据存放目录
path.logs: /data/elasticsearch/log #日志存放目录
network.host: 0.0.0.0 #监听的地址
http.port: 9200 #监听端口
cluster.initial_master_nodes: ["node-1"]
运行 elasticsearch
elasticsearch 默认会在前台运行,使用-d
选项可以使其后台运行。
sudo -u elasticsearch /usr/local/elasticsearch/bin/elasticsearch [-d]
可能产生的错误以及解决办法
- 安装 elasticsearch head 插件,提示下载phantomjs-2.1.1失败或解压失败
下载失败:手动下载 phantomjs-2.1.1.tar.bz2文件至/tmp/phantomjs 目录
解压失败:使用 yum 安装 bzip2
- 运行 elasticsearch 报错汇总
错误1:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
max number of threads [3795] for user [elasticsearch] is too low, increase to at least [4096]
代码语言:javascript复制vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
错误2:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
代码语言:javascript复制# vim /etc/sysctl.conf
vm.max_map_count = 262144
# sysctl -p
切换到 elasticsearch 用户后,显示为“-bash-4.2$”
代码语言:javascript复制使用 root 用户
cp /etc/skel/.bash* /usr/local/elasticsearch/
安装elasticsearch-head 插件
编译安装
代码语言:txt复制yum install nodejs -y
cd /usr/local/src
git clone https://github.com/mobz/elasticsearch-head.git
cd /usr/local/src/elasticsearch-head
#在 head 插件目录中执行
npm instal
修改 elasticsearch.yml文件,添加如下内容,解决跨域访问问题:
代码语言:txt复制http.cors.enabled: true
http.cors.allow-origin: "*"
运行 elasticsearch head 插件,监听在9100,提供图形化界面。
代码语言:txt复制#在 elasticsearch head 目录中运行
npm run start
使用 chrome 扩展
使用谷歌浏览器安装 elasgticsearch-head 插件
安装 Filebeat
下载并安装 filebeat
代码语言:txt复制wget -P /usr/local/src https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-linux-x86_64.tar.gz
tar xf /usr/local/src/filebeat-7.1.1-linux-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/filebeat-7.1.1-linux-x86_64/ /usr/local/filebeat
cp /usr/local/filebeat/filebeat.yml /usr/local/filebeat/filebeat.yml.default #备份原始配置文件
修改 filebeat 配置文件
代码语言:txt复制filebeat.inputs: #输入至 filebeat
- type: log
enabled: true
paths:
- /var/log/filebeat/*.log #自己指定一个日志文件
output.logstash: #filebeat 输出至 logstash
hosts: ["LOGSTASH_IP:5044"]
如何让 filebeat 从头读取日志文件 已经运行的 filebeat程序会通过filebeat 程序目录中的
/usr/local/filebeat/data/registry
记录已经读取的日志文件和位置,对于初期调试,首先停止 filebeat 程序,然后删除此目录,再次运行 filebeat 程序,就可以从头读取指定的日志。
启动 filebeat
代码语言:javascript复制/usr/local/filebeat/filebeat
安装 Logstash
下载并解压至相关目录
代码语言:txt复制wget -P /usr/local/src https://artifacts.elastic.co/downloads/logstash/logstash-7.1.1.tar.gz
tar xf /usr/local/src/logstash-7.1.1.tar.gz -C /usr/local/
ln -s /usr/local/logstash-7.1.1/ /usr/local/logstash
创建插件和数据目录mkdir /usr/local/logstash/plugin-data
调整 logstash.yml 配置文件
代码语言:txt复制#vim /usr/local/logstash/config/logstash.yml
node.name: logstash
path.data: /usr/local/logstash/plugin-data
config.reload.automatic: true #自动更新配置
config.reload.interval: 10
http.host: "10.0.12.235" #本机 IP 地址
启动 logstash 需要一个配置文件,用来指定日志的输入、过滤和输出。
代码语言:txt复制# vim /usr/local/logstash/conf/nginx-access.conf
input{
beats {
port => "5044"
}
}
filter {
grok {
patterns_dir => ["/usr/local/logstash/pattern"]
match => {
"message" => ["%{NGINXACCESS}"]
}
}
geoip {
source => "client_ip"
}
date {
match => ["Time","dd/MMM/yyyy:HH:mm:ss Z","ISO8601"]
locale => "cn"
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => [ "http://10.0.12.236:9200" ]
index => "logstash-%{type}-%{ YYYY.MM.dd}"
template_overwrite => true
}
}
因为过滤的正则表达是太长,所以在单独目录种定义
代码语言:txt复制mkdir /usr/local/logstash/pattern
vim /usr/local/logstash/pattern/nginx
NGINXACCESS %{IPV4:client_ip}:%{BASE10NUM:client_port}|%{IPV4:X_Forward}s*%{HTTPDATE:Time}s*HTTP/%{BASE10NUM:httpversion}s*%{WORD:verb}s*%{NOTSPACE:url}s*|%{BASE10NUM:Status}|s*%{BASE10NUM:body_bytes_sent}s*%{BASE10NUM:request_time}s*%{NOTSPACE:referer}s*%{QUOTEDSTRING:agent}s*%{IPV4:upstream}:%{BASE10NUM:upstream_port}s*%{BASE10NUM:upstream_response_time}s*%{BASE10NUM:upstream_status}
调试 grok 正则表达式:https://grokdebug.herokuapp.com/
注意 logstash 在启动时,会读取配置目录中所有以
.conf
结尾的文件,各配置文件不要存在错误,即使没有作用。
启动 logstash
代码语言:txt复制/usr/local/logstash/bin/logstash -f /usr/local/logstash/conf/nginx-assess.conf
安装 Kibana(待更新)
附录
日志文件格式,可以根据 此格式生成多条日志记录
代码语言:javascript复制100.155.1.33:46175|35.136.45.21 10/Jun/2019:15:24:31 0800 HTTP/1.1 GET http://api.XX.XX/xx?XX= |200| 2460 0.187 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Smart_XX 1.0.0 1.0.0" 172.168.32.1:80 0.187 200