用ElasticSearch存储日志
Posted floodwater
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用ElasticSearch存储日志相关的知识,希望对你有一定的参考价值。
介绍
如果你使用elasticsearch来存储你的日志,本文给你提供一些做法和建议。
如果你想从多台主机向elasticsearch汇集日志,你有以下多种选择:
- Graylog2 安装在一台中心机上,然后它负责往elasticsearch插入日志,而且你可以使用它那个漂亮的搜索界面~
- Logstash 他有很多特性,包括你能输入什么日志,如何变换过滤,最好输出到哪里。其中就有输出到elasticsearch,包括直接输出和通过RabbitMQ的river方式两种。
- Apache Flume 这个也可以从海量数据源中获取日志,用”decorators”修改日志,也有各种各样的”sinks”来存储你的输出。和我们相关的是elasticflume sink。
- omelasticsearch Rsyslog的输出模块。你可以在你的应用服务器上通过rsyslog直接输出到elasticsearch,也可以用rsyslog传输到中心服务器上来插入日志。或者,两者结合都行。具体如何设置参见rsyslog Wiki。
- 定制方案。比如,专门写一个脚本从天南海北的某个服务器传输你的日志到elasticsearch。
根据你设定的不同,最佳配置也变化不定。不过总有那么几个有用的指南可以推荐一下:
内存和打开的文件数
如果你的elasticsearch运行在专用服务器上,经验值是分配一半内存给elasticsearch。另一半用于系统缓存,这东西也很重要的。
你可以通过修改ES_HEAP_SIZE环境变量来改变这个设定。在启动elasticsearch之前把这个变量改到你的预期值。另一个选择上球该elasticsearch的ES_JAVA_OPTS变量,这个变量时在启动脚本(elasticsearch.in.sh或elasticsearch.bat)里传递的。你必须找到-Xms和-Xmx参数,他们是分配给进程的最小和最大内存。建议设置成相同大小。嗯,ES_HEAP_SIZE其实就是干的这个作用。
你必须确认文件描述符限制对你的elasticsearch足够大,建议值是32000到64000之间。关于这个限制的设置,另有教程可以参见。
目录数
一个可选的做法是把所有日志存在一个索引里,然后用ttl field来确保就日志被删除掉了。不过当你日志量够大的时候,这可能就是一个问题了,因为用TTL会增加开销,优化这个巨大且唯一的索引需要太长的时间,而且这些操作都是资源密集型的。
建议的办法是基于时间做目录。比如,目录名可以是YYYY-MM-DD的时间格式。时间间隔完全取决于你打算保留多久日志。如果你要保留一周,那一天一个目录就很不错。如果你要保留一年,那一个月一个目录可能更好点。目录不要太多,因为全文搜索的时候开销相应的也会变大。
如果你选择了根据时间存储你的目录,你也可以缩小你的搜索范围到相关的目录上。比如,如果你的大多数搜索都是关于最近的日志的,那么你可以在自己的界面上提供一个”快速搜索”的选项只检索最近的目录。
轮转和优化
移除旧日志在有基于时间的目录后变得异常简单:
$ curl -XDELETE ‘http://localhost:9200/old-index-name/‘
这个操作的速度非常快,和删除大小差不多的少量文件速度接近。你可以放进crontab里半夜来做。
Optimizing indices是在非高峰时间可以做的一件很不错的事情。因为它可以提高你的搜索速度。尤其是在你是基于时间做目录的情况下,更建议去做了。因为除了当前的目录外,其他都不会再改,你只需要对这些旧目录优化一次就一劳永逸了。
$ curl -XPOST ‘http://localhost:9200/old-index-name/_optimize‘
以上是关于用ElasticSearch存储日志的主要内容,如果未能解决你的问题,请参考以下文章
用ElasticSearch,LogStash,Kibana搭建实时日志收集系统
ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段