简介

ELK并不是一款软件,是一整套解决方案,是由ElasticSearch,Logstash和Kibana三个开源工具组成:通常是配合使用,而且先后归于Elastic.co公司名下,简称ELK协议栈.

日志的收集和处理

在日常运维工作中,对于系统和业务日志的处理尤为重要。日志主要包括系统日志,应用日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息,检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

通常,日志被分散的存储在不同的设备上,如果你管理上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志是很繁琐且效率低下的。当务之急是使用集中化的日志管理,例如: 开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情.

一个完整的集中式日志系统,是离不开以下几个主要特点的

  1. # 1. 收集 - 能够收集多种来源的日志数据
  2. # 2. 传输 - 能够稳定的把日志数据传输到中央系统
  3. # 3. 存储 - 如何存储日志数据
  4. # 4. 分析 - 可以支持UI分析
  5. # 5. 警告 - 能够提供错误报告
日志分析工具

1 . grep,awk,wc,rsyslog,syslog-ng: 对于庞大的机器数量,要达到要求更高的查询,排序和统计等使用这样的方法难免有点力不从心.

2 . 商业化的splunk: Splunk作为企业级的分布式机器数据的平台,拥有强大的分布式配置,包括跨数据中心的集群配置,Splunk提供两种集群,indexer集群和Search Head集群.具体情况请看Splunk文章.

3 . 开源的:

  1. # 1 FaceBook公司的Scribe
  2. # 2 Apache的Chukwa
  3. # 3 Linkedin的Kafka
  4. # 4 Cloudera的Fluentd
  5. # 5 ELK
Elasticsearch

ElasticSearch是一个基于Lucene的开源分布式搜索服务器.是一个实时的分布式搜索和分析引擎,他可以用于全文搜索,结构化搜索以及分析,他是一个建立在全文搜索引擎Apache lucene基础上的搜索引擎,使用Java语言编写,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,在elasticsearch中,所有节点的数据是均等的.

主要特点

  1. # 1 实时分析
  2. # 2 分布式实时文件存储,并将每一个字段都编入索引
  3. # 3 文档导向,所有的对象全部是文档
  4. # 4 高可用性,易扩展,支持集群(cluster),分片和复制(hards和Replicas
  5. # 5 接口友好,支持JSON

Logstash

logstash是一个具有实时渠道能力的数据收集引擎,使用JRuby语言编写,其做着是世界著名的运维工程师乔丹西塞,他是一个完全开源工具,可以对你的日志进行收集,过滤

  1. # 主要特点:
  2. # 1> 几乎可以访问任何数据
  3. # 2> 可以和多种外部应用结合
  4. # 3> 支持弹性扩展
  5. # 它主要由三个主要部分组成,见下图.
  6. # 1> Shipper - 发送日志数据
  7. # 2> Broker - 收集数据,缺省内置Redis
  8. # 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. # 1> Packetbeat (搜集网络流量数据)
  2. # 2> Topbeat (搜集系统,进程和文件系统级别的CPU和内存使用情况等数据)
  3. # 3> Filebeat (搜集文件数据)
  4. # 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
  1. Package:
  2. # elasticsearch-7.2.0-linux-x86_64.tar.gz
  3. # filebeat-7.2.0-x86_64.rpm
  4. # jdk-8u121-linux-x64.rpm
  5. # kibana-7.2.0-linux-x86_64.tar.gz
  6. # 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. # 1.一定要对时,时间校正,不然日志出不来
  2. # 2.启动Elasticsearch必须切换成所创建的ELK用户启动,不然ES处于安全目的,会启动报错.
  3. # 3.日志从Filebeat到Logstash再到ES检索到Kibana的读取速度取决于机器配置
Elasticsearch安装
  1. # 1.初始化
  2. setenforce 0
  3. sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
  4. systemctl stop firewalld
  5. systemctl disable firewalld
  6. sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
  7. sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
  8. curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
  9. curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  10. yum -y install ntpdate
  11. ntpdate -b ntp1.aliyun.com
  12. # 2.设置Hostname解析
  13. hostnamectl set-hostname elk-1
  14. ## 修改/etc/hosts 增加如下内容
  15. 192.168.144.131 elk-1
  16. # 4.java安装
  17. # rpm -ivh jdk-8u121-linux-x64.rpm
  18. # 如果使用rpm请到/etc/profile加上
  19. # JAVA_HOME=/usr/java/jdk1.8.0_121
  20. # export PATH=$PATH:$JAVA_HOME/bin
  21. yum -y install java-1.8.0-openjdk.x86_64
  22. # 5.创建用户和组并准备相关目录并授权
  23. groupadd elk
  24. useradd elk -g elk
  25. mkdir -pv /data/elk/{data,logs}
  26. chown -R elk:elk /data/elk/
  27. # 6.软件包解压、授权
  28. # 上传软件包
  29. 通过scp 或者FTP方式上传到/opt
  30. # 解压软件包到/opt目录
  31. tar xvf elasticsearch-7.2.0-linux-x86_64.tar.gz -C /opt/
  32. # 授权
  33. chown -R elk:elk /opt/elasticsearch-7.2.0/ # 软件包名
  34. # 7.修改elk配置文件
  35. [root@elk-1 ~]# vim /opt/elasticsearch-7.2.0/config/elasticsearch.yml
  36. # 集群名
  37. cluster.name: elk
  38. # 节点名
  39. node.name: node-1
  40. # 存储数据
  41. path.data: /data/elk/data
  42. # 存放日志
  43. path.logs: /data/elk/logs
  44. # 锁内存,尽量不使用交换内存
  45. bootstrap.memory_lock: false
  46. # 网络地址
  47. network.host: 0.0.0.0
  48. http.port: 9200
  49. # 发现集群hosts
  50. discovery.seed_hosts: ["elk-1"]
  51. # 设置集群master节点
  52. cluster.initial_master_nodes: ["node-1"]
  53. # 8.修改/etc/security/limits.conf
  54. # *号不是注释
  55. * soft nproc 65535
  56. * hard nproc 65535
  57. * soft nofile 65535
  58. * hard nofile 65535
  59. ulimit -n 65535
  60. ulimit -u 20480
  61. # 9.修改/etc/sysctl.conf
  62. echo "vm.max_map_count=262144" >> /etc/sysctl.conf
  63. sysctl -p
  64. # 10.启动ES并检查集群健康状态
  65. nohup runuser -l elk -c '/bin/bash /opt/elasticsearch-7.2.0/bin/elasticsearch' &
  66. # 这里为了省事直接用的nohup 可以使用supervisord 对进程进行管理
  67. [root@elk-1 ~]# curl -XGET 'elk-1:9200/_cluster/health?pretty'
  68. {
  69. "cluster_name" : "elk",
  70. "status" : "green",
  71. "timed_out" : false,
  72. "number_of_nodes" : 1,
  73. "number_of_data_nodes" : 1,
  74. "active_primary_shards" : 0,
  75. "active_shards" : 0,
  76. "relocating_shards" : 0,
  77. "initializing_shards" : 0,
  78. "unassigned_shards" : 0,
  79. "delayed_unassigned_shards" : 0,
  80. "number_of_pending_tasks" : 0,
  81. "number_of_in_flight_fetch" : 0,
  82. "task_max_waiting_in_queue_millis" : 0,
  83. "active_shards_percent_as_number" : 100.0
  84. }
Kibana安装
  1. # 1.解压Kibana安装包
  2. tar xvf kibana-7.2.0-linux-x86_64.tar.gz -C /opt/
  3. # 2.修改Kibana配置文件
  4. server.port: 5601 # Port
  5. server.host: 0.0.0.0 # 访问限制
  6. elasticsearch.hosts: ["http://192.168.144.131:9200"] # ES主机IP:Port
  7. # 3.启动命令
  8. [root@kibana ~]# nohup /opt/kibana-7.2.0-linux-x86_64/bin/kibana --allow-root &
  9. [1] 14650
  10. # tailf nohup.out 即可实时查看日志
Logstash安装
  1. [root@kibana ~]# rpm -ivh jdk-8u121-linux-x64.rpm
  2. [root@kibana ~]# tar xvf logstash-7.2.0.tar.gz -C /opt/
  3. [root@kibana opt]# vim /opt/nginx.yml
  4. # Sample Logstash configuration for creating a simple
  5. # # Beats -> Logstash -> Elasticsearch pipeline.
  6. #
  7. input {
  8. beats {
  9. port => 5044
  10. }
  11. }
  12. filter {
  13. grok {
  14. 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}"]
  15. }
  16. }
  17. output {
  18. elasticsearch {
  19. hosts => ["http://192.168.144.131:9200"]
  20. index => "app_log-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  21. }
  22. }
  23. # 启动 (如果起不来或者报错一般都是配置文件语法错误之类的)
  24. /opt/logstash-7.2.0/bin/logstash -f /opt/配置文件名.yml
  25. ## 后台运行
  26. nohup /opt/logstash-7.2.0/bin/logstash -f /opt/配置文件名.yml &
Filebeat安装
  1. # 安装filebeat RPM包
  2. [root@filebeat ~]# rpm -ivh filebeat-7.2.0-x86_64.rpm
  3. # 修改配置文件:
  4. FilebeatLogstash
  5. vim /etc/filebeat/filebeat.yml shift + 输入set nu 显示行号
  6. 24: enabled: true # 更改为true以启用输入配置
  7. 28: - /data/*.log # 替换为要抓取的日志文件路径,如果抓取nginx日志,修改为/var/log/nginx/access.log,如果是日志服务器,在下面再加上多行其他地方的日志目录即可
  8. 73 reload.enabled: true # 启动Filebeat模块
  9. 148 output.elasticsearch: # 加上注释;
  10. 150: hosts: ["localhost:9200"] # 加上注释;
  11. 158 output.logstash: # 去掉注释;
  12. 160 hosts: ["192.168.144.128<logstash>:5044"] # 去掉注释,并修改localhost为logstash机器IP及对应端口号;
  13. # 测试配置文件并启动
  14. filebeat test config -e
  15. systemctl start filebeat && systemctl enable filebeat
  16. [root@filebeat ~]# cat /data/nginx.log # 创建该目录及文件,加入两行日志.
  17. 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
  18. 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. Kubernetes Ingress简单入门

    作者:Nick Ramirez 原文链接:https://thenewstack.io/kubernetes-ingress-for-beginners/ 本文转载自Rancher Labs 不知道你 ...

  2. js中 addEventListener 和removeEventListener

    js中添加事件监听本来是非常常见的事情,但是去除监听一般很少去干,最近项目中需要监听页面显示或者隐藏 代码如下 document.addEventListener(visibilitychange', ...

  3. Python对象组合

    一个类的对象作为另一个类的对象的属性,称为类的组合. 即 class1.instance1.property = class2.instance 组合也是代码重用的重要方式之一. 先定义三个类:人.汽 ...

  4. [Objective-C] 008_Foundation框架之NSArray与NSMutableArray

    在Cocoa Foundation中NSArray和NSMutableArray 用于对象有序集合,NSArray和NSMutableArray类最大的区别是:NSArray是不可变,NSMutabl ...

  5. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙

    我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...

  6. c#tcp多线程服务器实例代码

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  7. Java实现 LeetCode 557 反转字符串中的单词 III(StringBuilder的翻转和分割)

    557. 反转字符串中的单词 III 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode c ...

  8. Java实现 LeetCode 513 找树左下角的值

    513. 找树左下角的值 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输 ...

  9. Java实现 蓝桥杯VIP 算法训练 数组查找及替换问题

    描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序.如果数组元素数值在A到Z的ASCII之间,替换为对应字母.元素个数不超过100,b在1至100 ...

  10. Java实现 LeetCode 85 最大矩形

    85. 最大矩形 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1 ...