简介

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的配置文件中

01 . ELK Stack简介原理及部署应用的更多相关文章

  1. 07 . ELK Stack一键多机部署脚本

    一键部署脚本 目录结构 tree Log_Analysis_Platform_Document Log_Analysis_Platform_Document ├── InstallES.sh ├── ...

  2. 被一位读者赶超,手摸手 Docker 部署 ELK Stack

    被一位读者赶超,容器化部署 ELK Stack 你好,我是悟空. 被奇幻"催更" 最近有个读者,他叫"老王",外号"茴香豆泡酒",找我崔更 ...

  3. ELK Stack部署

    部署ELK Stack 官网:https://www.elastic.co 环境准备: ip hostname 服务 用户.组 192.168.20.3 node2003 kibana6.5,file ...

  4. ELK学习001:Elastic Stack简介

    ELK简介: ELK Stack:ELK是Elasticsearch.Logstash.Kibana的缩写简称,这三者都是开源软件.ELK是5.0版本前的统称:这是一套统一的日志收集分析系统.它能够方 ...

  5. Kubernetes实战之部署ELK Stack收集平台日志

    主要内容 1 ELK概念 2 K8S需要收集哪些日志 3 ELK Stack日志方案 4 容器中的日志怎么收集 5 K8S平台中应用日志收集 准备环境 一套正常运行的k8s集群,kubeadm安装部署 ...

  6. ELK Stack总结

    目录 ELK Stack 介绍 Elasticsearch 概念1(基础) CRUD基本用法 概念2(文本解析器) 查询 分析/聚合 概念3(架构原理的补充) Logstash基础 Kibana的数据 ...

  7. 集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack

    大数据之心 关注  0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, ...

  8. 【ELK Stack】ELK+KafKa开发集群环境搭建

    部署视图 运行环境 CentOS 6.7 x64 (2核4G,硬盘100G) 需要的安装包 Runtime jdk1.8 : jdk-8u91-linux-x64.gz (http://www.ora ...

  9. ELK 日志分析系统概述及部署

    ELK 日志分析系统概述及部署 1.ELK概述: ELK简介 : ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch.Logstash 和 Kiabana 三个开源工具配合使用 ...

随机推荐

  1. Kivy主窗体大小的控制

    1. 引入依赖模块 主窗体大小的控制,需要使用到kivy.core.window中的Window模块 from kivy.app import App from kivy.core.window im ...

  2. BUUCTF Crypto_WP(2)

    BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...

  3. 【Java8新特性】关于并行流与串行流,你必须掌握这些!!

    写在前面 提到Java8,我们不得不说的就是Lambda表达式和Stream API.而在Java8中,对于并行流和串行流同样做了大量的优化.对于并行流和串行流的知识,也是在面试过程中,经常被问到的知 ...

  4. 串口助手下载-带时间戳的串口助手-极简串口助手-V1.1 自动保存配置参数 能显示收发时间方便调试

    1.串口助手下载 2.带时间戳的串口助手,每次收发指令带上了时间戳,方便调试 3.极简串口助手 4.简单易用 高速稳定 5.每次修改的参数都能自动保存,免去了重复配置的工作 下载地址:http://w ...

  5. Java实现 LeetCode 806 写字符串需要的行数 (暴力模拟)

    806. 写字符串需要的行数 我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行. ...

  6. Java实现九阶数独

    你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...

  7. Java实现串的简单处理

    串的处理 在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求程序对用户输入的串进行处理.具体规则如下: 把每个单词的首字母变为大写. 把数字与字母之间用下划线字符(_)分开,使得更清 ...

  8. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  9. java实现第四届蓝桥杯带分数

    带分数 题目描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一 ...

  10. 5.keras-Dropout剪枝操作的应用

    keras-Dropout剪枝操作的应用 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.util ...