从ELK到EFK

2023-05-16

背景

作为中国最大的在线教育站点,目前沪江日志服务的用户包含沪江网校,交易,金融,CCtalk(直播平台) 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)日志,热数据保留最近7天数据,冷数据永久保存。

为什么做日志系统

首先,什么是日志? 日志就是程序产生的,遵循一定格式(通常包含时间戳)的文本数据

通常日志由服务器生成,输出到不同的文件中,一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。

通常当系统发生故障时,工程师需要登录到各个服务器上,使用 grep / sed / awk 等 Linux 脚本工具去日志里查找故障原因。在没有日志系统的情况下,首先需要定位处理请求的服务器,如果这台服务器部署了多个实例,则需要去每个应用实例的日志目录下去找日志文件。每个应用实例还会设置日志滚动策略(如:每天生成一个文件),还有日志压缩归档策略等。

这样一系列流程下来,对于我们排查故障以及及时找到故障原因,造成了比较大的麻烦。因此,如果我们能把这些日志集中管理,并提供集中检索功能,不仅可以提高诊断的效率,同时对系统情况有个全面的理解,避免事后救火的被动。

我认为,日志数据在以下几方面具有非常重要的作用:

  • 数据查找:通过检索日志信息,定位相应的 bug ,找出解决方案
  • 服务诊断:通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态
  • 数据分析:可以做进一步的数据分析,比如根据请求中的课程 id ,找出 TOP10 用户感兴趣课程。

针对这些问题,为了提供分布式的实时日志搜集和分析的监控系统,我们采用了业界通用的日志数据管理解决方案 - 它主要包括 Elasticsearch 、 Logstash 和 Kibana 三个系统。通常,业界把这套方案简称为ELK,取三个系统的首字母,但是我们实践之后将其进一步优化为EFK,F代表Filebeat,用以解决Logstash导致的问题。下面,我们展开详细介绍。

文中涉及的 ELK stack 版本是:

Elasticsearch 5.2.2
Logstash 5.2.2
Kibana 5.2.2
Filebeat 5.2.2
Kafka 2.10

clipboard.png

Logstash :数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。

Kibana :可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。

Elasticsearch :分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。

Filebeat :轻量级数据收集引擎。基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 shipper 端的第一选择。

既然要谈 ELK 在沪江系统中的应用,那么 ELK 架构就不得不谈。本次分享主要列举我们曾经用过的 ELK 架构,并讨论各种架构所适合的场景和优劣供大家参考

简单版架构

clipboard.png

这种架构下我们把 Logstash 实例与 Elasticsearch 实例直接相连。Logstash 实例直接通过 Input 插件读取数据源数据(比如 Java 日志, Nginx 日志等),经过 Filter 插件进行过滤日志,最后通过 Output 插件将数据写入到 ElasticSearch 实例中。

这个阶段,日志的收集、过滤、输出等功能,主要由这三个核心组件组成 Input 、Filter、Output

Input:输入,输入数据可以是 File 、 Stdin(直接从控制台输入) 、TCP、Syslog 、Redis 、Collectd 等

Filter:过滤,将日志输出成我们想要的格式。Logstash 存在丰富的过滤插件:Grok 正则捕获、时间处理、JSON 编解码、数据修改 Mutate 。Grok 是 Logstash 中最重要的插件,强烈建议每个人都要使用 Grok Debugger 来调试自己的 Grok 表达式

grok {
      match => ["message", "(?m)\[%{LOGLEVEL:level}\] \[%{TIMESTAMP_ISO8601:timestamp}\] \[%{DATA:logger}\] \[%{DATA:threadId}\] \[%{DATA:requestId}\] %{GREEDYDATA:msgRawData}"]
    }

Output:输出,输出目标可以是 Stdout (直接从控制台输出)、Elasticsearch 、Redis 、TCP 、File 等

这是最简单的一种ELK架构方式,Logstash 实例直接与 Elasticsearch 实例连接。优点是搭建简单,易于上手。建议供初学者学习与参考,不能用于线上的环境。

集群版架构

clipboard.png

这种架构下我们采用多个 Elasticsearch 节点组成 Elasticsearch 集群,由于 Logstash 与 Elasticsearch 采用集群模式运行,集群模式可以避免单实例压力过重的问题,同时在线上各个服务器上部署 Logstash Agent,来满足数据量不大且可靠性不强的场景。

数据收集端:每台服务器上面部署 Logstash Shipper Agent 来收集当前服务器上日志,日志经过 Logstash Shipper 中 Input插件、Filter插件、Output 插件传输到 Elasticsearch 集群

数据存储与搜索:Elasticsearch 配置默认即可满足,同时我们看数据重要性来决定是否添加副本,如果需要的话,最多一个副本即可

数据展示:Kibana 可以根据 Elasticsearch 的数据来做各种各样的图表来直观的展示业务实时状况

这种架构使用场景非常有限,主要存在以下两个问题

  • 消耗服务器资源:Logstash 的收集、过滤都在服务器上完成,这就造成服务器上占用系统资源较高、性能方面不是很好,调试、跟踪困难,异常处理困难
  • 数据丢失:大并发情况下,由于日志传输峰值比较大,没有消息队列来做缓冲,就会导致 Elasticsearch 集群丢失数据

这个架构相对上个版本略微复杂,不过维护起来同样比较方便,同时可以满足数据量不大且可靠性不强的业务使用。

引入消息队列

clipboard.png

该场景下面,多个数据首先通过 Lostash Shipper Agent 来收集数据,然后经过 Output 插件将数据投递到 Kafka 集群中,这样当遇到 Logstash 接收数据的能力超过 Elasticsearch 集群处理能力的时候,就可以通过队列就能起到削峰填谷的作用, Elasticsearch 集群就不存在丢失数据的问题。

目前业界在日志服务场景中,使用比较多的两种消息队列为 :Kafka VS Redis。尽管 ELK Stack 官网建议使用 Redis 来做消息队列,但是我们建议采用 Kafka 。主要从下面两个方面考虑:

数据丢失:Redis 队列多用于实时性较高的消息推送,并不保证可靠。Kafka保证可靠但有点延时。
数据堆积:Redis 队列容量取决于机器内存大小,如果超过设置的Max memory,数据就会抛弃。Kafka 的堆积能力取决于机器硬盘大小。

综合上述的理由,我们决定采用 Kafka 来缓冲队列。不过在这种架构下仍然存在一系列问题

  • Logstash shipper 收集数据同样会消耗 CPU 和内存资源
  • 不支持多机房部署

这种架构适合较大集群的应用部署,通过消息队列解决了消息丢失、网络堵塞的问题。

多机房部署

clipboard.png

随着沪江业务的飞速增长,单机房的架构已经不能满足需求。不可避免的,沪江的业务需要分布到不同机房中,对于日志服务来说也是不小的挑战。当然业界也有不少成熟的方法,比如阿里的单元化、腾讯的 SET 方案等等。单元化在这边不详细展开,大家可以参考微博的【单元化架构】。

最终我们决定采用单元化部署的方式来解决 ELK 多机房中遇到的问题(延时、专线流量过大等),从日志的产生、收集、传输、存储、展示都是在同机房里面闭环消化,不存在跨机房传输与调用的问题。因为交互紧密的应用尽量部署在同机房,所以这种方案并不会给业务查询造成困扰。

Logstash、Elasticsearch、Kafka、Kibana 四个集群都部署到同一机房中,每个机房都要每个机房自己的日志服务集群,比如A机房业务的日志只能传输给本机房 Kafka ,而A机房 Indexer 集群消费并写入到A机房 Elasticsearch 集群中,并由A机房 Kibana 集群展示,中间任何一个步骤不依赖B机房任何服务。

引入Filebeat

clipboard.png

Filebeat 是基于原先 logstash-forwarder 的源码改造出来的,无需依赖 Java 环境就能运行,安装包10M不到。

如果日志的量很大,Logstash 会遇到资源占用高的问题,为解决这个问题,我们引入了Filebeat。Filebeat 是基于 logstash-forwarder 的源码改造而成,用 Golang 编写,无需依赖 Java 环境,效率高,占用内存和 CPU 比较少,非常适合作为 Agent 跑在服务器上。

下面看看Filebeat的基本用法。编写配置文件,从 Nginx access.log 中解析日志数据:

# filebeat.yml
filebeat.prospectors:
- input_type: log
  paths: /var/log/nginx/access.log
  json.message_key:

output.elasticsearch:
  hosts: ["localhost"]
  index: "filebeat-nginx-%{+yyyy.MM.dd}"

我们来看看压测数据:

压测环境

  • 虚拟机 8 cores 64G内存 540G SATA盘
  • Logstash 版本 2.3.1
  • Filebeat 版本 5.5.0

压测方案

Logstash / Filebeat 读取 350W 条日志 到 console,单行数据 580B,8个进程写入采集文件

压测结果

项目workerscpu usr总共耗时收集速度
Logstash853.7%210s1.6w line/s
Filebeat838.0%30s11w line/s

Filebeat 所消耗的CPU只有 Logstash 的70%,但收集速度为 Logstash 的7倍。从我们的应用实践来看,Filebeat 确实用较低的成本和稳定的服务质量,解决了 Logstash 的资源消耗问题。

最后,分享给大家一些血泪教训,希望大家以我为鉴。

  1. Indexer 运行一段时间后自动挂掉

突然有一天监控发现日志不消费了,排查下来发现消费 Kafka 数据的 indexer 挂掉了。所以,Indexer 进程也是需要用 supervisor 来监控的,保证它时刻都在运行。

  1. Java异常日志输出

开始我们在通过 grok 切割日志的时候,发现 Java 的 Exception 日志输出之后,会出现换行的问题。后来使用 Logstash codec/multiline 插件来解决。

input {
    stdin {
        codec => multiline {
            pattern => "^\["
            negate => true
            what => "previous"
        }
    }
}
  1. 由于时区导致日志8小时时差

Logstash 2.3版本 date插件配置如下,查看解析结果发现@timestamp比中国时间早了8小时。

解决方案 Kibana 读取浏览器的当前时区,然后在页面上转换时间内容的显示

date {
    match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss.SSS" ]
    target => "@timestamp"
  }

4.Grok parse failure

我们遇到线上 node 日志突然有几天日志查看不出来。后来拉出原始日志对比才发现生成出来的日志格式不正确,同时包含 JSON 格式和非 JSON 格式的日志。但是我们用grok解析的时候采用是 json 格式。建议大家输出日志保证格式一致同时不要出现空格等异常字符,可以使用在线 grok debug (http://grokdebug.herokuapp.com/) 来调试正则。

总结

基于 ELK stack 的日志解决方案的优势主要体现于:

  • 可扩展性:采用高可扩展性的分布式系统架构设计,可以支持每日 TB 级别的新增数据。
  • 使用简单:通过用户图形界面实现各种统计分析功能,简单易用,上手快
  • 快速响应:从日志产生到查询可见,能达到秒级完成数据的采集、处理和搜索统计。
  • 界面炫丽:Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。

clipboard.png

参考资料

  • https://www.elastic.co/guide/...
  • https://zhuanlan.zhihu.com/p/...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从ELK到EFK 的相关文章

  • elasticsearch的bulk(批量)操作

    在es中我们可能会有这么一种需求 即有时需要批量向es中插入或更新或删除数据 如果一条一条数据的操作 那么速度必然很慢 那么es的bulk api就可以派上用场 delete 删除操作 只需要写一个json即可 create 创建操作 如果
  • ES7.7中highlight的结果丢失部分文本的bug

    本bug在windows版本 ES 7 7 0 和 7 15 2 中都可以再现 ik分词器已安装 并导入了扩展停止词 extra stopword dic Step1 先建立一个索引 在此之前 请确保已经安装分词器插件ik PUT test
  • [翻译] logstash中logback的json编码器插件

    翻译 logstash中logback的json编码器插件 掘金
  • 使用docker搭建elk

    一 安装前须知 以下步骤在 VMware 中的 centos 7 中操作 ip 地址为 192 168 161 128 注意安装的时候最好统一版本 否则后面会出现许多问题 进官网搜索对应镜像 查看 Tags 标签下的版本 目前我这最新的 T
  • SpringBoot 接入 ELK - 动态索引详解

    1 说明 1 docker环境需要java maven环境 检查这两个 java version mvn version 2 本次ELK是使用docker运行的 ELK极其耗内存 服务器内存在4G及以内的 不建议安转 2 Linux mav
  • ELK系列(三)、安装Logstash插件及打包离线安装包

    Logstash有input output filter codec 四种插件类型 支持的种类也很丰富 功能特别强大 选对正确的插件可以节省很多的资源占用和开发效率 生产环境一般都无法连接到公网 所以本篇就带大家如何在线安装 以及打包离线安
  • ELK多个日志文件创建多个项目索引

    一 背景 我的elk架构是filebeat redis logstash elasticsearch kibana 我的想法是 我一台服务器多个程序有多个日志文件 在kibana里面想创建不通项目索引 指定不同日志文件 二 问题及解决思路
  • Docker部署ELK(配置密码登录)及Elastalert企业微信告警配置

    ELK部署记录 部署Elasticsearch Kibana Cerebro 通过docker进行部署 可以避免很多缺少依赖的问题 推荐使用centos7环境进行部署 请提前安装好docker服务 docker compose服务 先新建一
  • 非root用户-elastic-stack日志收集系统的规划及部署

    架构图 192 168 140 17 ELK 1 4核 8G 250G centos7 8 ES1 kibana 192 168 140 18 ELK 2 4核 8G 250G centos7 8 ES2 192 168 140 19 EL
  • 基于ELK的项目日志收集系统

    前言 Beats 是作为ELK技术栈前端数据收集平台的一个开源软件 Beats is the platform for building lightweight open source data shippers for many type
  • 使用 ELK 收集日志

    在当前分布式 微服务架构下 各个应用都部署在不同的服务器上 每个应用都在记录着自己重要或者不重要的日志信息 当我们要通过日志信息来排查错误时 可以根据出错应用在对应的机器上找报错相关的日志信息 但是 可能我们不具有相应服务器的访问权限 也可
  • ES词典热加载-通过修改ik分词器源码实现热加载自定义词典

    逻辑 自定义词典的数据从mysql加载 只需要重启一次ES即可 后续热加载 实现 在自定义词典的init方法中实现每隔一定时间读取mysql并写入自定义词典的逻辑
  • 大数据课程M1——ELK的概述

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 了解ELK的定义 掌握ELK的使用 一 什么是ELK 1 简介 ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案 是三个产品的首字母缩写
  • ELK的优点和局限性

    ELK作为一种开源的日志管理解决方案 具有以下优点 实时性高 ELK可以实现实时索引和搜索 支持高效的日志收集和处理 可以帮助用户及时发现问题和异常 提高系统的响应速度和稳定性 可扩展性强 ELK的架构支持水平扩展和负载均衡 可以根据需要增
  • 使用python和snapshot备份ElasticSearch索引数据

    该python备份snapshot的索引数据脚本 通过Elasticsearch连接es 然后通过es indices get alias函数获取所有索引名称 通过列表的startswith函数剔除 开头的自带索引名称 然后把所有索引名称放
  • elasticsearch部署过程中各种报错解析

    elasticsearch bootstrap StartupException java lang RuntimeException can not run elasticsearch as root ES不能能使用root用户直接运行
  • 分布式日志收集(ELK)

    ELK简介 ELK Elasticsearch Logstash Kibana 是同一家公司开发的3个开源工具 可组合起来搭建海量日志分析平台 目前很多公司都在使用这种方式搭建日志分析平台进行大数据分析 参考 初识ES数据库 Logstas
  • ElasticSearch 6.3版本(ES)查询人名关键字不拆词查询

    ElasticSearch 6 3版本 ES 查询关键字不拆词查询 类似mysql 的 like 语句 mysql的sql语法类似如下 采用大量like和locate语法 进行模糊查询 导致查询一个需要8秒多 通过ES优化后 总的查询在1秒
  • SpringBoot整合ELK教程

    SpringBoot整合ELK教程 1 基础概念 ELK 即 Elasticsearch Logstash Kibana 组合起来可以搭建线上日志系统 本文主要讲解使用 ELK 来收集测试框架产生的日志 Elasticsearch 用于存储
  • Beats — Filebeat 基础操作

    ElasticStack Beats 定义 一 ElasticStack 的组成 二 Beats 组件 FileBeat 日志采集 二 Filebeat 工作原理 三 启动命令 四 部署和运行 1 output console 通过终端获取

随机推荐

  • Android Facebook分享功能实现

    1 下载 Facebook SDK https developers facebook com docs Android locale 61 zh CN 2 在facebook下设置app的相关信息 3 主要代码 private Callb
  • Java实现下载文件到本地

    需求 导出文件后存留在了服务器中 xff0c 需要提供下载按钮 xff0c 点击后可下载到本地 xff1b xff08 因为涉及多个文件 xff0c 下载前先将文件进行压缩 xff0c 提供下载压缩文件 xff09 效果预览 代码 主要方法
  • Cross-Origin Read Blocking (CORB)

    本文的开始源于落地页项目中遇到的 Chrome 控制台 warn 提示 xff0c 担心影响页面渲染 xff0c 特此弄个究竟 提示如下 xff0c Cross Origin Read Blocking CORB blocked cross
  • ECharts插件实现3D饼图

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 下载Echarts插件 xff0c 官网地址 xff1a http echarts baidu com download html 下载开发版本 xff1a 2 引入到
  • QT定时任务- timerEvent事件使用以及和QTimer 定时器的使用区别

    定时器QTimer和timerEvent事件重载的使用区别记录 QTimer定时器QObject中的timerEvent事件重载 QObject定时器总结参考文章 QTimer定时器 一般情况下我们使用定时器开启定时任务都是这样操作 xff
  • maven-assembly-plugin插件的使用方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 Assembly 是什么意思 xff1f 二 maven assembly plugin是什么 xff1f 1 它是maven中针对打包任务而提供的标准插件 三 mav
  • DLL编辑和源码管理的一些疑问和见解

    xff08 本来不想放在首页的 xff0c 但是因为的确需要帮助 xff0c 姑且放在首页希望对本文描述到的问题有见解告诉小弟一声 xff09 今天因为类库里面有一个地方写错了 xff0c 所以找经理要了类库的源码 xff0c 经理说我用的
  • Unity3D--学习太空射击游戏制作(四)

    步骤七 xff1a 添加声音和特效 射击声音和爆炸效果 01 xff1a 在Project窗口单机右键 xff0c 选择Import Package gt Custome Package 然后到资源文件目录packages浏览unity包文
  • pnfs加密aes部分。

    首先需要找到加密的地方 实际上 xff0c 文件系统的读写 xff0c 可以首先查看vfs write amp vfs read 然后根据具体定义的 file operations 查找 xff0c 对应的文件系统的read和write函数
  • Ubuntu使任何用户都有设置图形网络权限的方法

    sudo vi usr share polkit 1 actions org freedesktop NetworkManager policy 695行 lt lt allow active gt auth admin keep lt a
  • Ajax 跨域请求 Access-Control-Allow-Origin 问题

    这转移一台GMtool的服务器 xff0c 结果转移过去后 xff0c 去登陆账号密码卡在登陆界面上 xff0c 用google开发者工作查看network时 xff0c 是卡在一个验证的服务器上 xff0c 然而可悲的是那台验证上的服务也
  • 国家气象局免费天气预报接口,城市代码(JSON格式)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 原文链接 xff1a blog csdn net zgyulongfei 国家气象局提供免费的天气预报接口 xff0c 但是访问时候需要指定城市代码 update 2015
  • AutoCAD2016简体中文破解版32位64位下载

    AutoCAD2016序列号 xff1a 666 69696969 667 98989898 400 45454545 066 66666666 任意一个 AutoCAD2016产品密钥 xff1a 001H1 AutoCAD2016软件3
  • 树莓派进阶之路 (031) -字符问题(1) - GBK汉字编码表(转)

    转载 xff1a http blog sina com cn s blog 8184e033010109ug html 基本简介 GB码 xff0c 全称是GB2312 80 信息交换用汉字编码字符集基本集 xff0c 1980年发布 xf
  • 外贸盒子x96max+ 搭建Armbian系统 (附国内可用的img镜像下载地址)

    记录一下在x96max 43 外贸盒子上面搭建Armbian的历程 Armbian是什么操作过程 救砖历程 xff1a 国内外相关电视盒子论坛 Armbian是什么 Armbian是轻量级的Debian系统 xff0c 为ARM开发板专门发
  • 手机上输入http://192.168.1.102:8888/FiddlerRoot.cer为什么下载不了证书

    因为之前你的手机可能已经安装了该证书 xff0c 所以再次下载会说找不到证书 解决办法 如果你遇到上面的问题 就可能是证书的问题 我的本地证书是用系统生成证书的一个软件生成的个人证书 所以出现了问题 操作步骤如下 1 将之前的证书删除打开系
  • 区块链上编程:DApp 开发实战——来写个竞猜游戏吧!

    本文旨在引导对 DApp 开发感兴趣的开发者 xff0c 构建一个基于以太坊去中心化应用 xff0c 通过开发一款功能完备的竞猜游戏 xff0c 迈出 DApp 开发的第一步 xff0c 通过实例讲解 Solidity 语言的常用语法 xf
  • pip更改下载源设置

    任何一个信息都可以把人分为两类 xff0c 知道的和不知道的 有些我们已知的信息 xff0c 自己觉得很平常 xff0c 却可能对另一些不知道的人来说很有用处 比如今天要说的这个小技巧 xff0c 我自己原以为不值一提 xff0c 网上也很
  • 让div在屏幕中居中(水平居中+垂直居中)的几种方法

    水平居中方法 1 inline xff0c inline block元素的水平居中 xff0c 在父级块级元素中设置text align center 2 确定宽度的块级元素水平居中方法 margin xff1a 0 auto xff1b
  • 从ELK到EFK

    背景 作为中国最大的在线教育站点 xff0c 目前沪江日志服务的用户包含沪江网校 xff0c 交易 xff0c 金融 xff0c CCtalk xff08 直播平台 xff09 等多个部门的多个产品的日志搜索分析业务 xff0c 每日产生的