`

怎样做实时日志二套方案

阅读更多

实时日志

1.需求/问题

需求

   随着业务增长,服务器增多,最开始是登陆服务器查看日志,这对于几台服务器的需求,还是勉强能应付过去的。但有两个不好的方面,一是零散,不够集中高效查看日志,寻找根源;二是不安全,要对开发,测试等同学开帐号权限。因此日志系统就应运而生了,集中高效web方式搜索查看日志。


问题

   a.采集延时15s。这是由于logstash默认机制造成的,每隔1秒检查文件状态,每隔15s检查是否有新文件产生,每隔15s写入

   b.消息队列延时。redis版本升经到3.0.6消息队列阻塞问题基本没有了。


redis

  c.检索展示延时;(1)elasticsearch节点与分片,索引有关(2)与搜索时间范围深度有关(3)数据量大小,由于采用归类合并展示方式,mobile_info一个月数据量约是180G,最小19M。

   d.网络延时;分两部分,第一部分日志节点间数据传输;第二部分客户端加载数据延时。这里暂不考虑。

    e.服务器资源消耗;目前有两台服务器,cpu,men峰值利用率75%,如果应用节点再增加,为了达到实时日志效果,加入新资源支撑。

   f.减少数据量的加载;去掉不必要的数据,如_id,@version,path

   g.减少数据合并时间;提高cpu计算能力,目前合并数是采用if else写法,寻找更高效逻辑处理写法。

   h. ELK版本升级,提高处理效率;通过对比,上次版本1.7 与现在的版本2.1对比,2.1版本没down过。

   i.优化服务器性能;如磁盘换成ssd;避免内存swap,预留多一点内存;避免cpu上下文切换,目前logstash线程数开到512

   j.elastic写入数据慢,目前还没发现


elastic

2. 验收指标

    客户端产生一条消息,小于1s时就在web端展示出来。


3. 技术方案

A方案ELK+Redis

     目前采用的方案是elk+redis+mongodb,elasticsearch集群读写分离模式,mongdo是用来归档数据。这次是在此方案基础上进行优化,具体做法,参考第一章已列出了的问题。


优化各个环节

   (1)优化服务器的读写能力
   (2)客户端采集优化,客户端默认内存是1g,目前分配是300M,检查,更新,写入等配置都是默认的,要参数化配置到毫秒级别。
   (3)消息队列,目前没有延时,基本上都是实时的put-get-delete模式
    (4) logstash合并数据写法是if else模式,源文件越多,elif判断越多。对于这种情况,一是寻找更高效的写法,二是简化数据源的判断
    (5) elasticsearch优化。写入慢,目前没发现,因为是采取读写分离模式,相对于而言还是单节点模式。目前分配的内存是3g,为了下一步高效搜索,把内存提高到4g。
   (6)kibana优化,这是web直接面向用户,新版本采取nodejs这样非阻塞模式,官方对效率的优化已经很高了。再寻找一下别的方法。
   (7)每一个环节数据停留控制在豪秒级别
   (8)ES索引优化
    (9)通过配置nginx压缩静态提高打开kibana速度
    
       

S索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡。所以从上我可以通过索引的settings进行第一优化: 
“index.translog.flush_threshold_ops”: “100000″ 
“index.refresh_interval”: “-1″, 
这两个参数第一是到tranlog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的。所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行tranlog平衡。第二参数是刷新频率,默认为120s是指索引在生命周期内定时刷新,一但有数据进来能refresh像lucene里面commit,我们知道当数据addDoucment会,还不能检索到要commit之后才能行数据的检索所以可以将其关闭,在最初索引完后手动refresh一之,然后将索引setting里面的index.refresh_interval参数按需求进行修改,从而可以提高索引过程效率。 
另外的知道ES索引过程中如果有副本存在,数据也会马上同步到副本中去。我个人建议在索引过程中将副本数设为0,待索引完成后将副本数按需量改回来,这样也可以提高索引效率。 
“number_of_replicas”: 0 
上面聊了一次索引过程的优化之后,我们再来聊一下检索速度比较慢的问题,其实检索速度快度与索引质量有很大的关系。而索引质量的好坏与很多因素有关。 
一、分片数 
分片数,与检索速度非常相关的的指标,如果分片数过少或过多都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少为导至单个分片索引过大,所以检索速度慢。 
在确定分片数之前需要进行单服务单索引单分片的测试。比如我之前在IBM-3650的机器上,创建一个索引,该索引只有一个分片,分别在不同数据量的情况下进行检索速度测试。最后测出单个分片的内容为20G。 
所以索引分片数=数据总量/单分片数 
目前,我们数据量为4亿多条,索引大小为近1.5T左右。因为是文档数据所以单数据都中8K以前。现在检索速度保证在100ms 以下。特别情况在500ms以下,做200,400,800,1000,1000+用户长时间并发测试时最坏在750ms以下. 
二、副本数 
副本数与索引的稳定性有比较大的关系,怎么说,如果ES在非正常挂了,经常会导致分片丢失,为了保证这些数据的完整性,可以通过副本来解决这个问题。建议在建完索引后在执行Optimize后,马上将副本数调整过来。 
大家经常有一个误去副本越多,检索越快,这是不对的,副本对于检索速度其它是减无增的我曾做过实现,随副本数的增加检索速度会有微量的下降,所以大家在设置副本数时,需要找一个平衡值。另外设置副本后,大家有可能会出现两次相同检索,出现出现不同值的情况,这里可能是由于tranlog没有平衡、或是分片路由的问题,可以通过?preference=_primary 让检索在主片分上进行。 
三、分词 
其实分词对于索引的影响可大可小,看自己把握。大家越许认为词库的越多,分词效果越好,索引质量越好,其实不然。分词有很多算法,大部分基于词表进行分词。也就是说词表的大小决定索引大小。所以分词与索引膨涨率有直接链接。词表不应很多,而对文档相关特征性较强的即可。比如论文的数据进行建索引,分词的词表与论文的特征越相似,词表数量越小,在保证查全查准的情况下,索引的大小可以减少很多。索引大小减少了,那么检索速度也就提高了。 
四、索引段 
索引段即lucene中的segments概念,我们知道ES索引过程中会refresh和tranlog也就是说我们在索引过程中segments number不至一个。而segments number与检索是有直接联系的,segments number越多检索越慢,而将segments numbers 有可能的情况下保证为1这将可以提到将近一半的检索速度。 
$ curl -XPOST ‘ http://localhost:9200/twitter/_optimize? max_num_segments =1′ 
五、删除文档 
删除文档在Lucene中删除文档,数据不会马上进行硬盘上除去,而进在lucene索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档。 
$ curl -XPOST ‘ http://localhost:9200/twitter/_optimize? only_expunge_deletes =true

 

 

 

$ curl -XPOST 'http://localhost:9200/twitter/_optimize'

 

管理索引优化

 optimize API允许通过API优化一个或多个索引。优化过程的操作基本上优化的索引搜索速度更快(和涉及到Lucene索引内保存每个碎片的段数)。优化操作允许减少的段数,把它们合并。

 

$ curl -XPOST 'http://localhost:9200/twitter/_optimize'

 

 

 

 

 

名称 描述
 
max_num_segments

段数优化。要全面优化索引,将其设置为 1。默认设置只需检查是否需要执行一个合并,如果是这样,执行它

。【经过测试越小速度越快】

only_expunge_deletes 优化过程中应该只抹去段删除。在Lucene中,不会被删除的文件从段,只是标记为删除。分部在合并过程中,创建一个新的分部,没有那些删除。此标志只允许合并段删除。默认为 false。【设置为true docs才会合并】
refresh 如果刷新后进行优化。默认为 true
flush 如果冲洗后进行优化。默认为 true
wait_for_merge 申请应等待合并结束。默认为 true。注意,合并有可能是一个非常繁重的操作,所以它可能是有意义运行它设置为 。【最好设置为false,默认true请求就会阻塞在那里,直到完成】 

优化API一个调用,可以应用到多个索引,或者所有索引

 

 

$ curl -XPOST 'http://localhost:9200/kimchy,elasticsearch/_optimize'

$ curl -XPOST 'http://localhost:9200/_optimize'

参数使用方法: http://localhost:9200/indexName/_optimize?only_expunge_deletes=true&wait_for_merge=false

 

 

 

 
1. 多线程程序插入,可以根据服务器情况开启多个线程index  
速度可以提高n倍, n>=2  

2. 如果有多台机器,可以以每台设置n个shards的方式,根据业务情况,可以考虑取消replias  
curl -XPUT 'http://10.1.*.*:9200/dw-search/' -d '{  
    "settings" : {  
        "number_of_shards" : 20,  
        "number_of_replicas" : 0  
    }  
}'  
这里设置20个shards, 复制为0,如果需要replicas,可以完成index后再修改为replicas>=1  
原文:http://www.elasticsearch.org/guide/reference/api/admin-indices-create-index.html  

3. 提高ES占用内存  
内存适当调大,初始是256M, 最大1G,  
调大后,最小和最大一样,避免GC, 并根据机器情况,设置内存大小,  
$ bin/elasticsearch -f -Xmx4g -Xms4g -Des.index.storage.type=memory  
原文:http://www.elasticsearch.org/guide/reference/setup/installation.html  

4. 减少shard刷新间隔  
curl -XPUT 'http://10.1.*.*:9200/dw-search/_settings' -d '{  
    "index" : {  
        "refresh_interval" : "-1"  
    }  
}'  

完成bulk插入后再修改为初始值  
curl -XPUT 'http://10.1.*.*:9200/dw-search/_settings' -d '{  
    "index" : {  
        "refresh_interval" : "1s"  
    }  
}'  

5. 设置一个shard的段segment最大数  
可以减少段文件数,提高查询速度  
curl -XPOST 'http://10.1.*.*:9200/dw-search/_optimize?max_num_segments=5'  
注意:有时候可能需要多次执行  
原文:http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings.html  
原文:http://www.elasticsearch.org/guide/reference/index-modules/merge.html  

6. 去掉mapping中_all域  
Index中默认会有_all的域,这个会给查询带来方便,但是会增加索引时间和索引尺寸  
"_all" : {"enabled" : false}  
原文:http://www.elasticsearch.org/guide/reference/mapping/all-field.html  
curl -XPOST 'http://10.1.*.*:9200/dw-search/pt_normal/_mapping' --data-binary @pt_normal_properties.mapping  

7. 设置source为压缩模式或者disable  
compress=true这个能大大减少index的尺寸  
disable将直接没有_source域  

8. 增加merge.policy.merge_factor数  
设置merge.policy.merge_factor到30,初始是10  
增加这个数需要更多的内存,bulk index可以调大这个值.  
如果是即时索引,应该调小这个值  
       
       

B.备选方案是elk+redis(kafka)

   这两套方案都引入消息队列,有两个作用:(1)系统解藕(2) 消息缓冲FIFO。直接从redis采用数据过滤归档,解藕的好处。日志峰期采集最高400条/s,平均100条/s,避免冲跨接收端。

   总结:优化客户端采集的效率,目前的消息队列暂不用优化,优化接收端的处理效率,由于我们对数据展示作了归类,采用if else写法,对cpu性能还是有一定消耗,所以优化。elasticsearch优化有:内存,节点,索引刷新时间,分片。


4. 时间表

    20160215写实时日志文档
    20160216-18优化,配置到各节点
    20160219测试,验收


5. 后续规划

   elk整体方案是比较消耗资源的,后续引入:

   a.   轻量级rsyslog作为客户端采集,高效级flunted作业客户端采集。
   b.  kafka替代redis,redis是基于内存,数据量大是顶不住的。没有kafka基于磁盘数据结构,每秒百万级别的吐吞量强。
   c.  elaticsearch优势是搜索,虽也支持分布式存储,目前按服务器规模,引入一些小而精的组合,如influxdb,mongodb只负责存储,elastic只负责搜索。
    e.  目前的需求,kibana是满足,如一些统计数据,cellectd采集系统性能数据,漂亮的ui展示,再加入grafana,更专业。        


6. 参考资料

 

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

0
2
分享到:
评论
1 楼 qindongliang1922 2016-02-22  
楼主的压测是怎么做的,查询条件都是什么,有无排序,是否开启缓存?

相关推荐

    分布式实时日志分析解决方案ELK部署架构.docx

    分布式实时日志分析解决方案ELK部署架构 ELK(Elasticsearch、Logstash、Kibana)是一种流行的集中式日志解决方案,主要由 Beats、Logstash、Elasticsearch、Kibana 等组件组成,来共同完成实时日志的收集、存储、...

    微服务请求日志统一处理方案

    同时,日志存储也应考虑持久化,可以采用如ELK(Elasticsearch、Logstash、Kibana)或者Splunk这样的日志分析平台,以便于实时监控和分析。 总之,微服务请求日志统一处理方案是一个综合性的设计,涉及日志拦截、...

    网络安全日志分析服务技术方案.docx

    网络安全日志分析服务技术方案是针对现代网络安全需求而设计的一项重要服务。日志分析服务旨在通过对各类系统、应用和网络设备产生的日志信息进行深入分析,以发现潜在的安全威胁、快速定位故障并处理安全事件。这项...

    程序运行日志处理解决方案

    程序运行日志处理解决方案旨在提供有效管理和分析日志的方法,以确保系统的稳定性和优化问题诊断。以下将详细阐述使用Enterprise Library 2.0进行日志处理的一些核心知识点: 1. **引入依赖库**:在进行日志处理时...

    db2调整日志大小解决方案

    当面临“db2调整日志大小解决方案”的问题时,通常涉及到的是DB2数据库的日志管理,这是数据库性能优化的重要环节。日志文件主要记录了数据库的所有事务操作,用于数据恢复和保证数据一致性。 在DB2中,事务日志...

    【10、日志审计(LAS)】XX大学日志审计解决方案.docx

    XX大学日志审计解决方案 XX大学网络信息中心为了应对不断增长的基础设施信息量、业务数量和事件处理时限需求,计划利用日志审计系统整合内部分散的基础设施信息资源,提升基础设施日志的收集、关联能力。网神SecFox...

    DB2数据库归档日志管理方案

    DB2 数据库归档日志管理方案 DB2 数据库中的日志文件管理是非常重要的,因为日志文件中包含了数据库的所有操作记录。如果日志文件没有被正确地管理,可能会导致数据库的崩溃和数据丢失。为了解决这个问题,需要对...

    ISA日志统计的整体方案及实施过程

    ### ISA日志统计的整体方案及实施过程 #### 一、旧方案的实施过程 ##### 1. DTS导出LOG 旧方案的第一步是通过DTS(Data Transformation Services)工具来导出日志数据。DTS是一种用于在不同数据源之间进行数据迁移...

    tomcat 日志设置解决方案

    为了实时监控日志,可以配置日志发送到ELK(Elasticsearch, Logstash, Kibana)堆栈,或者集成Sentry、Loggly等云日志服务。还可以设置警报规则,当特定错误出现时触发通知。 7. **性能优化** 在高并发环境中,...

    ELK分布式日志解决方案.docx

    二、ELK 分布式日志解决方案架构 ELK 分布式日志解决方案的架构主要包括三个部分:日志收集、日志存储和日志可视化。 * 日志收集:Logstash 负责收集应用服务产生的日志数据,并将其输出到 Elasticsearch 中。 * ...

    日志解决方案(转)

    标题中的“日志解决方案(转)”意味着我们将讨论的是在IT领域中如何管理和处理日志信息,这通常是系统、应用程序或服务运行过程中产生的记录信息。这些日志数据对于故障排查、性能监控、安全审计等至关重要。 描述中...

    JAVA应用开发日志解决方案

    ### JAVA应用开发日志解决方案 #### 1. 简介 在软件开发与维护过程中,日志记录是至关重要的环节之一。通过日志记录,开发者可以追踪程序运行过程中的状态变化,帮助诊断错误和异常情况,从而提高系统的稳定性和可...

    CDN日志实时分析解决方案免费内测开放.docx

    CDN(内容分发网络)日志实时分析解决方案是一种针对CDN服务的高效监测和分析工具,旨在帮助企业更好地管理和优化其网络流量。该解决方案现在正免费开放内测,为企业提供了深入理解和利用CDN访问日志的新途径。 1. ...

    日志agent解决方案

    标题中的“日志agent解决方案”指的是在IT领域中,用于收集、处理和传输系统或应用日志的代理软件。这类工具通常部署在服务器上,自动抓取分散的日志数据,以便进行集中管理、分析和监控。Logagent就是这样一个日志...

    ELK实现日志的收集和分析-实现方案 - 2.0.pptx

    2. 安全监控和告警:ELK可以实时监控日志数据,发现安全威胁和告警。 3. 业务优化和改进:ELK可以提供业务运营和性能分析,帮助企业优化和改进业务流程。 ELK是一种功能强大且灵活的日志收集和分析解决方案,能够...

    JAVA日志框架适配-冲突解决方案.docx

    2. 包管理工具的传递依赖(Transitive Dependencies)导致,例如依赖了dubbo,但是dubbo依赖了zkclient,而zkclient又依赖了log4j,这样如果项目中还有其他日志框架存在并有使用,就会导致多套共存。 3. 同一个日志...

    大数据搜索与日志挖掘及可视化方案 ELK Stack Elasticsearch Logstash Kibana 第2版

    《大数据搜索与日志挖掘及可视化方案:ELK Stack(Elasticsearch, Logstash, Kibana)第二版》 在大数据领域,有效地管理和分析海量数据是至关重要的。ELK Stack,即Elasticsearch、Logstash和Kibana的组合,提供了...

    数据库日志文件太大的解决方案

    ### 数据库日志文件太大的解决方案 在数据库管理过程中,日志文件的大小是一个非常重要的监控指标。过大的日志文件不仅会占用大量的磁盘空间,还可能导致性能问题,如数据库响应时间增加、备份时间延长等。因此,...

    【方案类】- 日志集群建设方案1

    总结来说,日志集群建设方案旨在构建一套高效、可扩展的日志管理系统,利用ELK堆栈的特性,实现日志的实时收集、分析和展示,提升运维效率,为业务决策提供数据支持。通过合理的架构设计和实施策略,可以确保日志...

Global site tag (gtag.js) - Google Analytics