01 . ELK Stack简介原理及部署应用
简介
ELK并不是一款软件,是一整套解决方案,是由ElasticSearch,Logstash和Kibana三个开源工具组成:通常是配合使用,而且先后归于Elastic.co公司名下,简称ELK协议栈.
日志的收集和处理
在日常运维工作中,对于系统和业务日志的处理尤为重要。日志主要包括系统日志,应用日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息,检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的存储在不同的设备上,如果你管理上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志是很繁琐且效率低下的。当务之急是使用集中化的日志管理,例如: 开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情.
一个完整的集中式日志系统,是离不开以下几个主要特点的
# 1. 收集 - 能够收集多种来源的日志数据
# 2. 传输 - 能够稳定的把日志数据传输到中央系统
# 3. 存储 - 如何存储日志数据
# 4. 分析 - 可以支持UI分析
# 5. 警告 - 能够提供错误报告
日志分析工具
1 . grep,awk,wc,rsyslog,syslog-ng: 对于庞大的机器数量,要达到要求更高的查询,排序和统计等使用这样的方法难免有点力不从心.
2 . 商业化的splunk: Splunk作为企业级的分布式机器数据的平台,拥有强大的分布式配置,包括跨数据中心的集群配置,Splunk提供两种集群,indexer集群和Search Head集群.具体情况请看Splunk文章.
3 . 开源的:
# 1 FaceBook公司的Scribe
# 2 Apache的Chukwa
# 3 Linkedin的Kafka
# 4 Cloudera的Fluentd
# 5 ELK
Elasticsearch
ElasticSearch是一个基于Lucene的开源分布式搜索服务器.是一个实时的分布式搜索和分析引擎,他可以用于全文搜索,结构化搜索以及分析,他是一个建立在全文搜索引擎Apache lucene基础上的搜索引擎,使用Java语言编写,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,在elasticsearch中,所有节点的数据是均等的.
主要特点
# 1 实时分析
# 2 分布式实时文件存储,并将每一个字段都编入索引
# 3 文档导向,所有的对象全部是文档
# 4 高可用性,易扩展,支持集群(cluster),分片和复制(hards和Replicas
# 5 接口友好,支持JSON
Logstash
logstash是一个具有实时渠道能力的数据收集引擎,使用JRuby语言编写,其做着是世界著名的运维工程师乔丹西塞,他是一个完全开源工具,可以对你的日志进行收集,过滤
# 主要特点:
# 1> 几乎可以访问任何数据
# 2> 可以和多种外部应用结合
# 3> 支持弹性扩展
# 它主要由三个主要部分组成,见下图.
# 1> Shipper - 发送日志数据
# 2> Broker - 收集数据,缺省内置Redis
# 3> Indexer - 数据写入
Kibana
Kibana是一款基于Apache开源协议,使用JavaScript语言编写,为Elasticsearch提供分析和可视化的Web平台,他可以在Elasticsearch的索引中查找,交互数据,并生成各种维度的表图.
Filebeat
ELK协议栈的新成员,一个轻量级开源日志数据搜集器,基于Logstash-Forwarder源代码开发,是对他的替代。是需要在采集日志数据server上安装filebeat,并指定日志目录或日志文件后,Filebeat就能读取数据,迅速发送到Logstash进行解析,亦或直接发送到Elasticsearch进行集中式存储和分析
ELK协议栈体系结构
最简单架构
在这种架构中,只有一个Logstash,Elasticsearch和Kibana实例。Logstash通过输入插件从多种数据源(比如日志文件,标准输入Stdin等)获取数据,再经过过滤插件加工数据,然后经过Elasticsearch输出插件输出到Elasticsearch,通过Kibana展示.
Logstash作为日志收集器
这种架构是对上面架构的扩展,把一个Logstash数据搜集节点扩展到多个,分布于多台机器,将解析好的数据发送到Elasticsearch server进行存储,最后在Kibana查阅,生成日志报表等.
这种结构因为需要在各个服务器上部署Logstash,而它比较消耗CPU和内存资源,所以比较适合资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作.
Beats作为日志搜集器
这种架构引入Beats作为日志搜集器。目前Beats包括四种
# 1> Packetbeat (搜集网络流量数据)
# 2> Topbeat (搜集系统,进程和文件系统级别的CPU和内存使用情况等数据)
# 3> Filebeat (搜集文件数据)
# 4> Winlogbeat (搜集Windows事件日志数据)
Beats将搜集到的数据发送到Logstash,经Logstash解析,过滤后,将其发送到Elasticsearch存储,并由Kibana呈现给用户.
这种架构解决了Logstash在各服务器节点上占用系统资源高的问题,相比Logstash,Beats所占系统的CPU和内存几乎可以省略不计,另外,Beats和Logstash之间保持SSL/TLS加密传输,客户端和服务器双向认证,保证了通信安全
因此这种架构适合对数据安全性要求较高,同时各服务器性能比较敏感的场景.
基于Filebeat架构的配置部署详解
前面提到Filebeat已经完全替代了Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。这个章节将详细讲解如何部署基于 Filebeat 的 ELK 集中式日志解决方案,具体架构见下图.
引入消息队列机制的架构
Beats 还不支持输出到消息队列,所以在消息队列前后两端只能是 Logstash 实例。这种架构使用 Logstash 从各个数据源搜集数据,然后经消息队列输出插件输出到消息队列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ 等常见消息队列。然后 Logstash 通过消息队列输入插件从队列中获取数据,分析过滤后经输出插件发送到 Elasticsearch,最后通过 Kibana 展示。见下图
这种架构适合于日志规模比较庞大的情况,但由于Logstash日志解析节点和Elasticsearch的符合比较重,可将他们配置为集群模式,以分担负荷,引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题.
部署
架构图
List
Package:
# elasticsearch-7.2.0-linux-x86_64.tar.gz
# filebeat-7.2.0-x86_64.rpm
# jdk-8u121-linux-x64.rpm
# kibana-7.2.0-linux-x86_64.tar.gz
# logstash-7.2.0.tar.gz
IP | hostname | 软件 | 配置要求 | 网络 | 备注 |
---|---|---|---|---|---|
192.168.144.131 | ES/数据存储 | elasticsearch-7.2 | 内存最低2GB/硬盘40GB | Nat,内网 | |
192.168.144.128 | Kibana/UI展示 | kibana-7.2****logstash-7.2 | 内存最低2GB/硬盘40GB | Nat,内网 | |
192.168.144.135 | Filebeat/数据采集 | Filebeat-7.2/nginx | 内存最低2GB/硬盘40GB | Nat,内网 |
注意事项
# 1.一定要对时,时间校正,不然日志出不来
# 2.启动Elasticsearch必须切换成所创建的ELK用户启动,不然ES处于安全目的,会启动报错.
# 3.日志从Filebeat到Logstash再到ES检索到Kibana的读取速度取决于机器配置
Elasticsearch安装
# 1.初始化
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install ntpdate
ntpdate -b ntp1.aliyun.com
# 2.设置Hostname解析
hostnamectl set-hostname elk-1
## 修改/etc/hosts 增加如下内容
192.168.144.131 elk-1
# 4.java安装
# rpm -ivh jdk-8u121-linux-x64.rpm
# 如果使用rpm请到/etc/profile加上
# JAVA_HOME=/usr/java/jdk1.8.0_121
# export PATH=$PATH:$JAVA_HOME/bin
yum -y install java-1.8.0-openjdk.x86_64
# 5.创建用户和组并准备相关目录并授权
groupadd elk
useradd elk -g elk
mkdir -pv /data/elk/{data,logs}
chown -R elk:elk /data/elk/
# 6.软件包解压、授权
# 上传软件包
通过scp 或者FTP方式上传到/opt下
# 解压软件包到/opt目录
tar xvf elasticsearch-7.2.0-linux-x86_64.tar.gz -C /opt/
# 授权
chown -R elk:elk /opt/elasticsearch-7.2.0/ # 软件包名
# 7.修改elk配置文件
[root@elk-1 ~]# vim /opt/elasticsearch-7.2.0/config/elasticsearch.yml
# 集群名
cluster.name: elk
# 节点名
node.name: node-1
# 存储数据
path.data: /data/elk/data
# 存放日志
path.logs: /data/elk/logs
# 锁内存,尽量不使用交换内存
bootstrap.memory_lock: false
# 网络地址
network.host: 0.0.0.0
http.port: 9200
# 发现集群hosts
discovery.seed_hosts: ["elk-1"]
# 设置集群master节点
cluster.initial_master_nodes: ["node-1"]
# 8.修改/etc/security/limits.conf
# *号不是注释
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
ulimit -n 65535
ulimit -u 20480
# 9.修改/etc/sysctl.conf
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
# 10.启动ES并检查集群健康状态
nohup runuser -l elk -c '/bin/bash /opt/elasticsearch-7.2.0/bin/elasticsearch' &
# 这里为了省事直接用的nohup 可以使用supervisord 对进程进行管理
[root@elk-1 ~]# curl -XGET 'elk-1:9200/_cluster/health?pretty'
{
"cluster_name" : "elk",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"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" : 100.0
}
Kibana安装
# 1.解压Kibana安装包
tar xvf kibana-7.2.0-linux-x86_64.tar.gz -C /opt/
# 2.修改Kibana配置文件
server.port: 5601 # Port
server.host: 0.0.0.0 # 访问限制
elasticsearch.hosts: ["http://192.168.144.131:9200"] # ES主机IP:Port
# 3.启动命令
[root@kibana ~]# nohup /opt/kibana-7.2.0-linux-x86_64/bin/kibana --allow-root &
[1] 14650
# tailf nohup.out 即可实时查看日志
Logstash安装
[root@kibana ~]# rpm -ivh jdk-8u121-linux-x64.rpm
[root@kibana ~]# tar xvf logstash-7.2.0.tar.gz -C /opt/
[root@kibana opt]# vim /opt/nginx.yml
# Sample Logstash configuration for creating a simple
# # Beats -> Logstash -> Elasticsearch pipeline.
#
input {
beats {
port => 5044
}
}
filter {
grok {
match => ["message","%{DATA:log_date} %{WORD:method} %{TIME:log_localtime} %{HOSTNAME:host_name} %{WORD:workd}\[%{WORD:ls}\]\: %{DATA:log_date} %{TIME:log_localtime2} %{WORD:year_tmp}\: %{WORD:name_2}\: %{WORD:request_leixin} %{WORD:request_num}\, %{WORD}\: %{WORD:app_id}\, %{WORD}\: %{IP:ip}\, %{WORD}\: %{INT}\, %{WORD}\: %{USERNAME:device_id}"]
}
}
output {
elasticsearch {
hosts => ["http://192.168.144.131:9200"]
index => "app_log-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
# 启动 (如果起不来或者报错一般都是配置文件语法错误之类的)
/opt/logstash-7.2.0/bin/logstash -f /opt/配置文件名.yml
## 后台运行
nohup /opt/logstash-7.2.0/bin/logstash -f /opt/配置文件名.yml &
Filebeat安装
# 安装filebeat RPM包
[root@filebeat ~]# rpm -ivh filebeat-7.2.0-x86_64.rpm
# 修改配置文件:
Filebeat到Logstash
(vim /etc/filebeat/filebeat.yml) shift + : 输入set nu 显示行号
24: enabled: true # 更改为true以启用输入配置
28: - /data/*.log # 替换为要抓取的日志文件路径,如果抓取nginx日志,修改为/var/log/nginx/access.log,如果是日志服务器,在下面再加上多行其他地方的日志目录即可
73: reload.enabled: true # 启动Filebeat模块
148: output.elasticsearch: # 加上注释;
150: hosts: ["localhost:9200"] # 加上注释;
158: output.logstash: # 去掉注释;
160: hosts: ["192.168.144.128<logstash>:5044"] # 去掉注释,并修改localhost为logstash机器IP及对应端口号;
# 测试配置文件并启动
filebeat test config -e
systemctl start filebeat && systemctl enable filebeat
[root@filebeat ~]# cat /data/nginx.log # 创建该目录及文件,加入两行日志.
Sep 2 16:00:18 cc-prd-3-tk-13-pcs1 pcs[16118]: Mon Sep 2 16:00:18 2019: PCS: recv request, app_id: app_1w5B6O4R2o1k881k12177, ip: 223.104.145.136, os: 0, device_id: 02c3864050502d43dc514905133bcc9c
Sep 2 16:00:18 cc-prd-3-tk-13-pcs1 pcs[16118]: Mon Sep 2 16:00:18 2019: PCS: recv request, app_id: app_1w5B6O4R2o1k881k12177, ip: 223.104.145.136, os: 0, device_id: 02c3864050502d43dc514905133bcc9c
收集的日志需要把有用的信息做切割,让相应字段成为独立的个一个字段,而不是一整条日志是一个字段,那样就没法做分析,而做数据源切割很重要,否则日志会过不来,或者日志做不了分析,统计.
可以把源日志拿到kibana上的grok上做切割,直到Structured Data能出现你想要的字段就可以放到logstash的配置文件中