2016年2月22日

ELK架构浅析

转自:http://blog.csdn.net/lively1982/article/details/50678657

ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。后文的四种基本架构中将逐一介绍应用到的其它套件。

  • Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。

  • Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。

  • Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。

 

我们先谈谈第一种ELK架构,如图1,这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。建议供学习者和小规模集群使用。

此架构首先由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web Portal方便的对日志查询,并根据数据生成报表(详细过程和配置在此省略)。

图片描述

                                            图1 ELK架构一

 

第二种架构(图2)引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。

图片描述

                                                图2 ELK架构二

这种架构适合于较大集群的解决方案,但由于Logstash中心节点和Elasticsearch的负荷会比较重,可将他们配置为集群模式,以分担负荷,这种架构的优点在于引入了消息队列机制,均衡了网络传输,从而降低了网络闭塞尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题。

 

第三种架构(图3)引入了Logstash-forwarder。首先,Logstash-forwarder将日志数据搜集并统一发送给主节点上的Logstash,Logstash分析、过滤日志数据后发送至Elasticsearch存储,并由Kibana最终将数据呈现给用户。

图片描述

                                                              图3 ELK架构三

这种架构解决了Logstash在各计算机点上占用系统资源较高的问题。经测试得出,相比Logstash,Logstash-forwarder所占用系统CPU和MEM几乎可以忽略不计。另外,Logstash-forwarder和Logstash间的通信是通过SSL加密传输,起到了安全保障。如果是较大集群,用户亦可以如结构三那样配置logstash集群和Elasticsearch集群,引入High Available机制,提高数据传输和存储安全。更主要的配置多个Elasticsearch服务,有助于搜索和数据存储效率。但在此种架构下发现Logstash-forwarder和Logstash间通信必须由SSL加密传输,这样便有了一定的限制性。

 

第四种架构(图4),将Logstash-forwarder替换为Beats。经测试,Beats满负荷状态所耗系统资源和Logstash-forwarder相当,但其扩展性和灵活性有很大提高。Beats platform目前包含有Packagebeat、Topbeat和Filebeat三个产品,均为Apache 2.0 License。同时用户可根据需要进行二次开发。

图片描述

                                               图4 ELK架构四

这种架构原理基于第三种架构,但是更灵活,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。

 

posted @ 2016-02-22 15:09 chenkeyou 阅读(9224) 评论(0) 推荐(0)

2013年12月19日

动态内存分配———越界访问

摘要: 在编写关于内存动态分配的程序时,很容易遇到越界访问的问题,如果是在visual studio环境下,一般会报 HEAP CORRUPTION DETECTED 错误。堆栈的越界访问又分为两种:堆前和堆后的越界访问。堆前的越界访问比较少见,VS2010弹出的报错信息为:HEAP CORRUPTION DETECTED:after Normal block(#***) at 0x****.CRT detected that application wrote memory before start of heap buffer.当遇到这种错误时,上面的信息把出错的原因说得很清楚了:就是在分配的.. 阅读全文

posted @ 2013-12-19 17:38 chenkeyou 阅读(508) 评论(0) 推荐(0)

bash:xxx:command not found

摘要: 前几天在centos6.0上配好了oracle 10g并且能够执行oracle相关命令,但是今天准备往oracle里倒数据时,执行sqlplus 出现bash:command not found[oracle@master ~]$ sqlplus /nologbash: sqlplus: command not found然后google了下,是/usr/bin找不到sqlplus命令,然后对$ORACLE_HOME/bin/sqlplus在/usr/bin下建立连接[oracle@master ~]$ ln -s $ORACLE_HOME/bin/sqlplus /usr/bin[oracl 阅读全文

posted @ 2013-12-19 10:46 chenkeyou 阅读(3119) 评论(0) 推荐(0)

2013年10月15日

ORA-00031: session marked for kill 标记要终止的会话

摘要: 原文转载处:http://moonsoft.itpub.net/post/15182/203828一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。如果是使用pl/sql developer工具操作数据库的话,可以从tools-》sessions 查看到sid,serial#,status。在status那栏找到状态被置为"killed"那一行。1.下面的语句用来查询哪些对象被锁:select objec 阅读全文

posted @ 2013-10-15 11:56 chenkeyou 阅读(955) 评论(0) 推荐(0)

2013年10月14日

C 文件读写操作

摘要: 当文件按指定的工作方式打开以后,就可以执行对文件的读和写。下面按文件的性质分类进行操作。针对文本文件和二进制文件的 不同性质,对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。1. 读写字符C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为: int fgetc(FILE *stream)fgetc( )函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,此时 表示本次操作结束,若读写文件完成,则应关闭文件。 int fputc(int... 阅读全文

posted @ 2013-10-14 16:42 chenkeyou 阅读(509) 评论(3) 推荐(0)

2013年10月12日

使用快速排序算法对字符串数组进行排序

摘要: 原文转发处:http://blog.chinaunix.net/uid-15723764-id-3366757.htmlqsort是万能数组排序函数,必须要学会使用,简单的数组自然不用说,这里主要讨论一下字符串数组的使用。首先看一下qsort的原型:1 void qsort(void *base, size_t nmemb, size_t size, 2 int(*compar)(const void *, const void *));正确使用这个函数要注意几点: 1.base要传数组的首地址 2.size传的是每个元素的大小 3.正确编写compar函数下面是实... 阅读全文

posted @ 2013-10-12 17:38 chenkeyou 阅读(819) 评论(0) 推荐(0)

导航

< 2025年8月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
点击右上角即可分享
微信分享提示