草庐IT

ELK 企业级日志分析系统(1)

TaciturN\' 2023-09-06 原文

目录

一、ELK 简介

二、 使用ELK的原因

三、 完整日志系统基本特征

四、 ELK的工作原理

五、ELK的部署

1.节点服务器安装elasticsearch 

2.web服务器安装logstash和kibana

3.安装使用kibana


一、ELK 简介

        ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearchLogstash Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。

1. ElasticSearch

        ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。

        Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。

        Elasticsearch是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大容量的日志数据,也可用于搜索许多不同类型的文档。

2.Kiabana

        Kibana 通常与 Elasticsearch 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 提供图形化的 web 界面来浏览 Elasticsearch 日志数据,可以用来汇总、分析和搜索重要数据。

3.Logstash

        Logstash作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。

        Logstash 由 Ruby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具, 可以实现数据传输、格式处理、格式化输出。

        Logstash 具有强大的插件功能,常用于日志处理。

4.其他组件Filebeat

        Filebeat,轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进行解析,或是直接发给 Elasticsearch 存储,性能上相比运行于 JVM 上的 logstash 优势明显,是对它的替代。常应用于 EFLK 架构当中。

filebeat 结合 logstash 带来好处

1)通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力

2)从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取

3)将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件

4)使用条件数据流逻辑组成更复杂的处理管道

5.其他组件Fluentd

        Fluentd是一个流行的开源数据收集器。由于 logstash 太重量级的缺点,Logstash 性能低、资源消耗比较多等问题,随后就有 Fluentd 的出现。相比较 logstash,Fluentd 更易用、资源消耗更少、性能更高,在数据处理上更高效可靠,受到企业欢迎,成为 logstash 的一种替代方案,常应用于 EFK 架构当中。在 Kubernetes 集群中也常使用 EFK 作为日志数据收集的方案。

        在 Kubernetes 集群中一般是通过 DaemonSet(控制器) 来运行 Fluentd,以便它在每个 Kubernetes 工作节点上都可以运行一个 Pod。 它通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。

云原生环境中会用Fluentd替换Logstash

6.缓存/消息队列

        缓存/消息队列(redis、kafka、RabbitMQ等)可以对高并发日志数据进行流量削峰和缓冲,这样的缓冲可以一定程度的保护数据不丢失,还可以对整个架构进行应用解耦。

二、 使用ELK的原因

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

        往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。 如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。 当务之急我们使用集中化的日志管理, 例如∶ 开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后, 日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

        一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时, 大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统, 可以提高定位问题的效率。

三、 完整日志系统基本特征

  • 收集∶能够采集多种来源的日志数据
  • 传输∶能够稳定的把日志数据解析过滤并传输到存储系统
  • 存储∶存储日志数据
  • 分析∶支持 UI分析
  • 警告∶能够提供错误报告,监控机制

四、 ELK的工作原理

(1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上, 在日志服务器上部署 Logstash。

(2)Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。

(3)Elasticsearch 对格式化后的数据进行索引和存储。

(4)Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。

总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处

五、ELK的部署

web服务器部署logstash+kibana:192.168.116.50

es节点1:192.168.116.60

es节点2:192.168.116.70

1.节点服务器安装elasticsearch 

(1)需要先准备好相关的安装包(后三个用于前端图形化展示es状态)

(2)部署jdk环境

yum -y install java-1.8.0-openjdk-devel.x86_64

(3)安装es

(4)修改配置文件

vim /etc/elasticsearch/elasticsearch.yml
#yml键值对格式 键: 值(冒号后面要加一个括号)
cluster.name: my-elk-cluster    #集群名称
node.name: node1       #当前节点名称
node.master: true      #开启主节点
node.data: true        #开启数据节点(两个都开启是混合模式)

path.data: /var/lib/elasticsearch    #数据文件
path.logs: /var/log/elasticsearch    #日志文件

bootstrap.memory_lock: true     #锁定使用内存(禁用交换分区使性能下降)

network.host: 192.168.116.60    #监听地址(本机ip)
http.port: 9200                 #es和客户端通信的端口(默认9200)
transport.tcp.port: 9300        #es节点之间通信的端口(默认9300)

#启用发现机制(es内置发现模块,通过单播发现集群内的服务节点)
discovery.zen.ping.unicast.hosts: ["192.168.116.60:9300", "192.168.116.70:9300"]

另一台节点配置文件也修改 

* ES三类节点说明

节点名主要功能配置要点配置格式

master主节点

维护元数据,管理集群节点状态;

不负责数据写入和查询。

内存可以相对小一些,但是机器一定要稳定,最好是独占的机器。node.master: true node.data: false
data数据节点负责数据的写入与查询,压力大。大内存,最好是独占的机器。node.master: false
node.data: true
 
client客户端节点负责任务分发和结果汇聚,分担数据节点压力。

大内存,最好是独占的机器。

node.master: false node.data: false

注:还有一种混合节点 node.master: true 和 node.data: true ,这种在生产环境中不建议使用,我们这里的实验测试环境会将主节点和数据节点放在一台主机上。

* 三类节点分配比例

        一般来说,主节点最多3台,数据节点可以为每个主节点分配 2~4 台(3个主节点就是一共6~12台),客户端可以为数据节点总数的1/3左右。

        根据读写情况来决定,写多则数据节点多,读多则客户端多。

(5)优化系统(放开内存、进程数和文件限制)

(6)优化es拥有的内存使用权限

        由于ES构建基于lucene,而lucene设计强大之处在于lucene能够很好的利用操作系统内存来缓存索引数据,以提供快速的查询性能。lucene的索引文件segements是存储在单文件中的,并且
不可变,对于OS来说,能够很友好地将索引文件保持在cache中,以便快速访问。因此,我们很有必要将一半的物理内存留给lucene,另一半的物理内存留给es(TM heap)。

* 在ES内存设置方面,可以遵循以下原则

        当机器内存小于64G时,遵循通用的原则,508给ES,50%留给操作系统,供lucene使用;
        当机器内存大于64G时,遵循原则:建议分配给Es分配4~32G 的内存即可,其它内存留给操作系统,供lucene使用。

(7)启动(注意es启动最低需要4G内存)

(8)依次安装其余三个软件

#安装node.js(大约10分钟)
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make && make install

#安装phantomjs
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin

#安装 Elasticsearch-head-master 数据可视化工具
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master/
npm install

* 注:在npm install 数据可视化工具时如果出现以下报错,说明域名解析失败

解决办法之一:添加DNS服务器8.8.8.8

(9)在es配置文件中添加跨域访问配置,并重启服务

vim /etc/elasticsearch/elasticsearch.yml
#添加
http.cors.enabled: true
http.cors.allow-origin: "*"

#重启服务加载配置
systemctl restart elasticsearch.service

(10)启动可视化工具(开启端口为9100)

cd /opt/elasticsearch-head-master/
npm run start &

(11)测试插入索引

#通过命令插入一个测试索引,索引为 index-demo,类型为 test。
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'

(12)删除索引

curl -X DELETE '192.168.116.60:9200/index-demo'

​​​​​​​​​​​​​​

2.web服务器安装logstash和kibana

(1)准备logstash和kibana的安装包,和jdk环境

(2)安装启动logstash,并将命令加入系统识别路径

(3)测试使用logstash

logstash [选项] ...

                -f        通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
                -e       从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
                -t        测试配置文件是否正确,然后退出。

使用命令行输入标准输出到屏幕 

测试命令行输入,标准输出到es的节点中

(4)测试无误后,自定义logstash配置文件

Logstash 配置文件基本由三部分组成:input、output 以及 filter(根据需要选择使用)
        input{...}:表示从数据源采集数据,常见的数据源如Kafka、日志文件等。

        output{...}:表示将logstash收集的数据经由过滤器处理之后输出到Elasticsearch。


        filter{...}:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式.

        grok:对若干个大文本字段进行再分割成一些小字段(?<字段名>正则表达式)字段名:正则表达式匹配到的内容。

        date:对数据中的时间格式进行统一和格式化。

        mutate:可以重命名,删除,替换和修改事件中的字段。比如对一些无用的字段进行剔除,或增加自定义的字段。

        mutiline:对多行数据进行统一编排,将多行数据汇总为一个单一的行。

(5)加载配置文件,实现日志输出到es

logstash -f 配置文件名        

3.安装使用kibana

(1)安装和修改配置文件,并启动kibana

vim /etc/kibana/kibana.yml
#修改主要配置
#取消注释,Kiabana 服务的默认监听端口为5601
server.port: 5601
#取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
#取消注释,配置es服务器的ip,如果是集群则配置该集群中master节点的ip
elasticsearch.url:  ["http://192.168.116.60:9200","http://192.168.116.70:9200"] 
#取消注释,设置在 elasticsearch 中添加.kibana索引
kibana.index: ".kibana"
#取消注释,配置kibana的日志文件路径(需手动创建),不然默认是messages里记录日志
logging.dest: /var/log/kibana.log

#创建日志文件,并修改归属权限
touch /var/log/kibana.log
chown kibana:kibana /var/log/kibana.log

#启动kibana
systemctl start kibana.service

(2)使用kibana

访问kibana服务器的5601端口

有关ELK 企业级日志分析系统(1)的更多相关文章

  1. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  2. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  3. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  4. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  5. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  6. ruby - Sinatra 中的全局救援和日志记录异常 - 2

    如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si

  7. ruby-on-rails - 使用 Ruby 标准 Logger 每天只创建一个日志 - 2

    我正在使用ruby​​标准记录器,我想要每天轮换一次,所以在我的代码中我有:Logger.new("#{$ROOT_PATH}/log/errors.log",'daily')它运行完美,但它创建了两个文件errors.log.20130217和errors.log.20130217.1。如何强制它每天只创建一个文件? 最佳答案 您的代码对于长时间运行的应用程序是正确的。发生的事情是您在给定的一天多次运行代码。第一次运行时,Ruby会创建一个日志文件“errors.log”。当日期改变时,Ruby将文件重命名为“errors.log

  8. ruby - Cucumber/Savon 省略或删除日志输出 - 2

    在运行Cucumber测试时,我得到(除了测试结果)大量调试/日志相关的输出形式:D,[2013-03-06T12:21:38.911829#49031]DEBUG--:SOAPrequest:D,[2013-03-06T12:21:38.911919#49031]DEBUG--:Pragma:no-cache,SOAPAction:"",Content-Type:text/xml;charset=UTF-8,Content-Length:1592W,[2013-03-06T12:21:38.912360#49031]WARN--:HTTPIexecutesHTTPPOSTusingt

  9. ruby-on-rails - faraday如何设置日志级别 - 2

    我最近将我的http客户端切换到faraday,一切都按预期工作。我有以下代码来创建连接:@connection=Faraday.new(:url=>base_url)do|faraday|faraday.useCustim::Middlewarefaraday.request:url_encoded#form-encodePOSTparamsfaraday.request:jsonfaraday.response:json,:content_type=>/\bjson$/faraday.response:loggerfaraday.adapterFaraday.default_ada

  10. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

随机推荐