用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.yml或者使用REST API,你可以给每个目录配置自己的设定。具体细节参见链接。

有趣的是分片和复制的数量。默认情况下,每个目录都被分割成5个分片。如果集群中有一个以上节点存在,每个分片会有一个复制。也就是说每个目录有一共10个分片。当往集群里添加新节点的时候,分片会自动均衡。所以如果你有一个默认目录和11台服务器在集群里的时候,其中一台会不存储任何数据。

每个分片都是一个Lucene索引,所以分片越小,elasticsearch能放进分片新数据越少。如果你把目录分割成更多的分片,插入速度更快。请注意如果你用的是基于时间的目录,你只在当前目录里插入日志,其他旧目录是不会被改变的。

太多的分片带来一定的困难——在空间使用率和搜索时间方面。所以你要找到一个平衡点,你的插入量、搜索频率和使用的硬件条件。

另一方面,复制帮助你的集群在部分节点宕机的时候依然可以运行。复制越多,必须在线运行的节点数就可以越小。复制在搜索的时候也有用——更多的复制带来更快的搜索,同时却增加创建索引的时间。因为对猪分片的修改,需要传递到更多的复制。

映射_source和_all

Mappings定义了你的文档如何被索引和存储。你可以,比如说,定义每个字段的类型——比如你的syslog里,消息肯定是字符串,严重性可以是整数。怎么定义映射参见链接。

映射有着合理的默认值,字段的类型会在新目录的第一条文档插入的时候被自动的检测出来。不过你或许会想自己来调控这点。比如,可能新目录的第一条记录的message字段里只有一个数字,于是被检测为长整型。当接下来99%的日志里肯定都是字符串型的,这样Elasticsearch就没法索引他们,只会记录一个错误日志说字段类型不对。这时候就需要显式的手动映射”message” : {“type” : “string”}。如何注册一个特殊的映射详见链接。

当你使用基于时间的目录名时,在配置文件里创建索引模板可能更适合一点。详见链接。除去你的映射,你海可以定义其他目录属性,比如分片数等等。

在映射中,你可以选择压缩文档的_source。这实际上就是整行日志——所以开启压缩可以减小索引大小,而且依赖你的设定,提高性能。经验值是当你被内存大小和磁盘速度限制的时候,压缩源文件可以明显提高速度,相反的,如果受限的是CPU计算能力就不行了。更多关于source字段的细节详见链接。

默认情况下,除了给你所有的字段分别创建索引,elasticsearch还会把他们一起放进一个叫_all的新字段里做索引。好处是你可以在_all里搜索那些你不在乎在哪个字段找到的东西。另一面是在创建索引和增大索引大小的时候会使用额外更多的CPU。所以如果你不用这个特性的话,关掉它。即使你用,最好也考虑一下定义清楚限定哪些字段包含进_all里。详见链接。

刷新间隔

在文档被索引后,Elasticsearch某种意义上是近乎实时的。在你搜索查找文档之前,索引必须被刷新。默认情况下,目录是每秒钟自动异步刷新的。

刷新是一个非常昂贵的操作,所以如果你稍微增大一些这个值,你会看到非常明显提高的插入速率。具体增大多少取决于你的用户可以接受到什么程度。

你可以在你的index template里保存期望的刷新间隔值。或者保存在elasticsearch.yml配置文件里,或者通过(REST API)[http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings.html]升级索引设定。

另一个处理办法是禁用掉自动刷新,办法是设为-1。然后用REST API手动的刷新。当你要一口气插入海量日志的时候非常有效。不过通常情况下,你一般会采用的就是两个办法:在每次bulk插入后刷新或者在每次搜索前刷新。这都会推迟他们自己本身的操作响应。

Thrift

通常时,REST接口是通过HTTP协议的,不过你可以用更快的Thrift替代它。你需要安装transport-thrift plugin同时保证客户端支持这点。比如,如果你用的是pyes Python client,只需要把连接端口从默认支持HTTP的9200改到默认支持Thrift的9500就好了。

异步复制

通常,一个索引操作会在所有分片(包括复制的)都完成对文档的索引后才返回。你可以通过index API设置复制为异步的来让复制操作在后台运行。你可以直接使用这个API,也可以使用现成的客户端(比如pyes或者rsyslog的omelasticsearch),都会支持这个。

用过滤器替代请求

通常,当你搜索日志的时候,你感兴趣的是通过时间序列做排序而不是评分。这种使用场景下评分是很无关紧要的功能。所以用过滤器来查找日志比用请求更适宜。因为过滤器里不会执行评分而且可以被自动缓存。两者的更多细节参见链接。

批量索引

建议使用bulk API来创建索引它比你一次给一条日志创建一次索引快多了。

主要要考虑两个事情:

  • 最佳的批量大小。它取决于很多你的设定。如果要说起始值的话,可以参考一下pyes里的默认值,即400。
  • 给批量操作设定时器。如果你添加日志到缓冲,然后等待它的大小触发限制以启动批量插入,千万确定还要有一个超时限制作为大小限制的补充。否则,如果你的日志量不大的话,你可能看到从日志发布到出现在elasticsearch里有一个巨大的延时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解除单个文件的与svn服务器的关联

有些文件和个人开发环境有关不需要和svn服务器做同步,可以取消其和svn服务的关联。 右键选中要取消关联的文件,右键菜单 Tortoise SVN ---> unversion and add to ignore list 确定后,文件图标会变成一把小剪刀,说明已经…

java xml出错,Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException...

Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException解决办法:利用Java操作XML,在操作XML过程中,执行到最后一步,在利用Transformer进行XML转换时出现NullPointerException错误&#xff…

Ubuntu磁盘扩容及启动问题整理

参考:Ubuntu磁盘扩容及启动问题整理 作者:一只青木呀 发布时间: 2020-12-08 10:42:19 网址:https://blog.csdn.net/weixin_45309916/article/details/110850358 也可参照正点原子的:Ubuntu磁盘空间不足?一招…

函数求值需要运行所有线程_精读《深度学习 - 函数式之美》

1 引言函数式语言在深度学习领域应用很广泛,因为函数式与深度学习模型的契合度很高,The Beauty of Functional Languages in Deep Learning — Clojure and Haskell 就很好的诠释了这个道理。通过这篇文章可以加深我们对深度学习与函数式编程的理解。2…

IOS(常用移动终端设备) push实现通知中心

参考文章: http://blog.csdn.net/zhuqilin0/article/details/6527113 http://www.dozer.cc/2013/03/push-notifications-server-side-implement/ http://blog.sina.com.cn/s/blog_71ce775e0101b43e.html PushSharp:https://github.com/Redth/PushShar…

Ubuntu下无法看到共享文件夹的解决办法

参考:Ubuntu下无法看到共享文件夹的解决办法 作者:一只青木呀 发布时间:2020-08-07 10:09:04 网址:https://blog.csdn.net/weixin_45309916/article/details/107856157 今天早上起来突然发现共享文件夹的查看不到了,找…

MySQL提供了以下三种方法用于获取数据库对象的元数据

MySQL提供了以下三种方法用于获取数据库对象的元数据: 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序,如mysqlshow, mysqldump 用SHOW语句获取元数据 MySQL用show语句获取元数据是最常用的方法&a…

laravel 5.1 php版本号,发行版本说明 | 序言 | Laravel 5.1 中文文档

发行版本说明由 学院君 创建于5年前, 最后更新于 11个月前版本号 #219641 views23 likes0 collects支持政策LTS版本,比如Laravel 5.1,将会提供两年的bug修复和三年的安全修复支持。这些版本将会提供最长时间的支持和维护。对于其他通用版本,只…

NYOJ-522 Interval

Interval 时间限制&#xff1a;2000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述There are n(1 < n < 100000) intervals [ai, bi] and m(1 < m < 100000) queries, -100000 < ai < bi < 100000 are integers.Each query contains an inte…

实现图书增删的代码_不仅仅是图书信息管理系统

点击蓝字 关注我们不仅仅是图书信息管理系统基于双链表&#xff0c;采用面向对象编程方法制作的图书管理系统❞效果演示root用户&#xff1a;账号&#xff1a;0&#xff0c;密码&#xff1a;0普通用户&#xff1a;账号&#xff1a;1001&#xff0c;密码&#xff1a;666666图书信…

HDU1846 - Brave Game【巴什博弈】

十年前读大学的时候&#xff0c;中国每年都要从国外引进一些电影大片&#xff0c;其中有一部电影就叫《勇敢者的游戏》&#xff08;英文名称&#xff1a;Zathura&#xff09;&#xff0c;一直到现在&#xff0c;我依然对于电影中的部分电脑特技印象深刻。 今天&#xff0c;大家…

Ubuntu18.04换源更新国内源

参考&#xff1a;Ubuntu18.04更新国内源 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-08-05 10:24:11 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107808268 树莓派换源博文&#xff1a;https://blog.csdn.net/zhuguanlin121/article/d…

php中解析数组,在PHP中解析多维数组

您应该在将数据解析为Smarty之前准备好数据。你可以这样做&#xff1a;$result array(array(name > Hockey Team 1, category_id > 1),array(name > Hockey Team 2, category_id > 2),array(name > Hockey Team 3, category_id > 3),array(name > Footba…

了解jQuery并掌握jQuery对象和DOM对象的区别

jQuery的优势&#xff1a; 开源--开放源代码 轻量级 强大的选择器 出色的DOM操作(对DOM元素的一个增删改查) 完善的Ajax&#xff0c;出色的浏览器兼容性&#xff0c;丰富的插件支持&#xff0c;完善的文档&#xff08;说明书&#xff09; 链式操作方式&#xff0c; 写得少&…

linux下复制

复制文件 cp - i file tofile 复制目录 cp - r dic todic转载于:https://www.cnblogs.com/Hero-Qiang/archive/2013/03/20/2971579.html

rh php56 php,在全球范围内提供RHSCL PHP的最佳方法

我使用以下网址安装了RHSCL 2&#xff1a;使用RedHat订阅管理器.然后我运行yum删除php *,然后是yum install rh-php56一切顺利,除非现在找不到PHP.然后我运行find / -name php并在以下目录中找到rh-php56&#xff1a;/var/opt/rh/rh-php56/lib/php/opt/rh/rh-php56/register.co…

Vmware15的安装(ps解决:重装Vmware出现无法安装服务Vmware Authorization Service)

参考&#xff1a;Linux之Vmware的安装 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-09 22:13:14 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107238658 目录1.前言2.打开Vmware虚拟机安装包安装解决&#xff1a;重装Vmware出现无法…

python多线程模块_python 多线程模块参考

threading.active_count() 返回当前处于 active 状态的线程的数目 threading.current_thread() 返回调用者当前的 Thread 对象 threading.get_ident() 返回当前线程的“thread identifier”属性&#xff08;3.3新增&#xff09; threading.enumerate() 返回当前处于 active 状态…

谈谈即时通讯开发平台

由于即时通讯系统的复杂性和对服务器稳定性的很高要求&#xff0c;一般即时通讯系统开发至少需要1年左右的时间&#xff0c;而这还只是测试版&#xff0c;离"稳定"还有一定距离&#xff0c;而这时匆匆上马的不稳定的系统会让你失去用户&#xff0c;您也不可能召集上万…

内存,RAM(DDR),ROM(EEPROM、flash),存储卡(emmc,sd,tf)以及Cache的区别与联系

参考&#xff1a;内存&#xff0c;RAM&#xff0c;ROM&#xff0c;Cache的区别与联系 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-09-26 09:55:40 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108808106 参考&#xff1a;EEPROM和flash…