template的使用 

刚开始的时候,每次实验都去改/etc/elasticsearch/elasticsearch.yml配置文件。事实上在template里修改settings更方便而且灵活!当然最主要的,还是调节里面的properties设定,合理的控制store和analyze了。 



template设定也有多种方法。最简单的就是和存储数据一样POST上去。长期的办法,就是写成json文件放在配置路径里。其中,default配置放在/etc/elasticsearch/下,其他配置放在/etc/elasticsearch/templates/下。举例我现在的一个templates/template-logstash.json内容如下:

  1. {
  2. "template-logstash" : {
  3. "template" : "logstash*",
  4. "settings" : {
  5. ,
  6. ,
  7. "index" : {
  8. "store" : {
  9. "compress" : {
  10. "stored" : true,
  11. "tv": true
  12. }
  13. }
  14. }
  15. },
  16. "mappings" : {
  17. "_default_" : {
  18. "properties" : {
  19. "dynamic" : "true",
  20. },
  21. },
  22. "loadbalancer" : {
  23. "_source" : {
  24. "compress" : true,
  25. },
  26. "_ttl" : {
  27. "enabled" : true,
  28. "default" : "10d"
  29. },
  30. "_all" : {
  31. "enabled" : false
  32. },
  33. "properties" : {
  34. "@fields" : {
  35. "dynamic" : "true",
  36. "properties" : {
  37. "client" : {
  38. "type" : "string",
  39. "index" : "not_analyzed"
  40. },
  41. "domain" : {
  42. "type" : "string",
  43. "index" : "not_analyzed"
  44. },
  45. "oh" : {
  46. "type" : "string",
  47. "index" : "not_analyzed"
  48. },
  49. "responsetime" : {
  50. "type" : "double",
  51. },
  52. "size" : {
  53. "type" : "long",
  54. "index" : "not_analyzed"
  55. },
  56. "status" : {
  57. "type" : "string",
  58. "index" : "not_analyzed"
  59. },
  60. "upstreamtime" : {
  61. "type" : "double",
  62. },
  63. "url" : {
  64. "type" : "string",
  65. "index" : "not_analyzed"
  66. }
  67. }
  68. },
  69. "@source" : {
  70. "type" : "string",
  71. "index" : "not_analyzed"
  72. },
  73. "@timestamp" : {
  74. "type" : "date",
  75. "format" : "dateOptionalTime"
  76. },
  77. "@type" : {
  78. "type" : "string",
  79. "index" : "not_analyzed",
  80. "store" : "no"
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }

注意:POST 发送的 json 内容比存储的 json 文件内容要少最外层的名字,因为名字是在 url 里体现的。 



mapping简介 

上面template中除了index/shard/replica之外的部分,就是mapping了,大家注意到其中的dynamic,默认情况下,index会在第一条数据进入的时候自动分析这条数据的情况,给每个value找到最恰当的type,然后以此为该index的mapping。之后再PUT上来的数据,格式如果不符合mapping的,也能存储成功,但是就无法检索了。 



mapping中关于store和compress的部分。建议是 disable 掉 _all,但是 enable 住 _source!! 如果连 _source 也 disable 掉的话,一旦你重启进程,整个 index 里除了 _id,_timestamp 和 _score 三个默认字段,啥都丢了…… 



API简介 

ES的API,最基本的就是CRUD操作了,这部分是标准的REST,就不说了。 



然后还有三个API比较重要且常用,分别是: bulk/count/search。 



Bulk顾名思义,把多个单条的记录合并成一个大数组统一提交,这样避免一条条发送的header解析,索引频繁更新,indexing速度大大提高 

Count根据POST的json,返回命中范围内的总条数。当然没POST时就直接返回该index的总条数了。 

Search根据POST的json或者GET的args,返回命中范围内的数据。这是最重要的部分了。下面说说常用的search API: 



query 

一旦使用search,必须至少提供query参数,然后在这个query的基础上进行接下来其他的检索。query参数又分三类: 



"match_all" : { } 直接请求全部; 

"term"/"text"/"prefix"/"wildcard" : { "key" : "value" } 根据字符串搜索(严格相等/片断/前缀/匹配符); 

"range" : { "@timestamp" : { "from" : "now-1d", "to" : "now" } } 根据范围搜索,如果type是时间格式,可以使用内置的now表示当前,然后用-1d/h/m/s来往前推。 



filter 

上面提到的query的参数,在filter中也都存在。此外,还有比较重要的参数就是连接操作: 



"or"/"and" : [{"range":{}}, {"prefix":""}] 两个filter的查询,交集或者合集; 

"bool" : ["must":{},"must_not":{},"should":{}] 上面的and虽然更快,但是只能支持两个,超过两个的,要用 bool 方法; 

"not"/"limit" : {} 取反和限定执行数。注意这个limit和mysql什么的有点不同:它限定的是在每个shards上执行多少条。如果你有5个shards,其实对整个index是limit了5倍大小的设定值。 

另一点比较关键的是:filter结果默认是不缓存的,如果常用,需要指定 "_cache" : true。 



facets 

facets接口可以根据query返回统计数据,最基础的是terms和statistical两种。不过在日志分析的情况下,最常用的是: 



"histogram" : { "key_field" : "", "value_field" : "", "interval" : "" } 根据时间间隔返回柱状图式的统计数据; 

"terms_stats" : { "key_field" : "", "value_field" : "" } 根据key的情况返回value的统计数据,类似group by的意思。 

这里就涉及到前面mapping里为什么针对每个field都设定type的原因了。因为 histogram 里的 key_field 只能是 dateOptionalTime 格式的,value_field 只能是 string 格式的;而 terms_stats 里的 key_field 只能是
string 格式的,value_field 只能是 numberic 格式的。 



而我们都知道,http code那些200/304/400/503神马的,看起来是数字,我们却需要的是他们的count数据,不是算他们的平均数。所以不能由ES动态的认定为long,得指定为string。 



内存和打开的文件数 

如果你的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里有一个巨大的延时。

elasticsearch 使用事项的更多相关文章

  1. docker上安装elasticsearch和ik分词器插件和header,实现分词功能

    docker run -di --name=tensquare_es -p 9200: -p 9300:9300 elasticsearch:5.6.8 创建elasticsearch容器(如果版本不 ...

  2. Elasticsearch之curl创建索引库和索引时注意事项

    前提, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 注意事项 1.索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号 2.如果没有明确指定索引 ...

  3. 基于Elasticsearch开发时的注意事项备忘

    记录一些自己在Elasticsearch开发过程的琐碎知识点 1.使用ScriptFields时,需在yml配置文件中添加配置(script.disable_dynamic: false)开启动态脚本 ...

  4. springboot elasticsearch 集成注意事项

    文章来源: http://www.cnblogs.com/guozp/p/8686904.html 一 elasticsearch基础 这里假设各位已经简单了解过elasticsearch,并不对es ...

  5. elasticsearch中client.transport.sniff的使用方法和注意事项

    https://blog.csdn.net/J_bean/article/details/79507559

  6. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  7. Elasticsearch 教程--数据

    在Elasticsearch中,每一个文档都有一个版本号码.每当文档产生变化时(包括删除),_version就会增大.在<版本控制>中,我们将会详细讲解如何使用_version的数字来确认 ...

  8. elasticsearch之python备份

    一:elasticsearch原理 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功 ...

  9. 使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践--转载

    原文地址:https://wsgzao.github.io/post/elk/ 另外可以参考:https://www.digitalocean.com/community/tutorials/how- ...

随机推荐

  1. AJAX 创建表格

    <html><head> <meta http-equiv="Content-Type" content="text/html; chars ...

  2. 【Machine Learning in Action --4】朴素贝叶斯分类

    1.概述 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验 概率计算出其后验概率(即该对象属于某一类的概 ...

  3. mysql备份并自动压缩命令

    #! /bin/bash mysqldump -uroot -p'password' databasename | gzip > /home/backup/database_`date +%Y% ...

  4. CentOS安装配置Tomcat7

    1.下载apache-tomcat-7.0.62.tar.gz 2.解压:tar -zxvf apache-tomcat-7.0.62.tar.gz 3.配置环境变量: 进入安装目录:(/usr/lo ...

  5. 网络模块(net, http)小解

    net模块可用来创建TCP服务器来接收网络请求,它提供了创建客户端以及服务端的方法 服务端: 创建服务器: net.createServer([,options], connectionListene ...

  6. JQuery简介及HelloWorld

    一.JQuery是什么: -JQuery是一个JavaScript框架. 二.JQuery的优点: –轻量级 –强大的选择器 –出色的 DOM 操作的封装 –可靠的事件处理机制 –完善的 Ajax – ...

  7. Ubuntu上用mod_wsgi部署Django出现的一些问题

    1 编码问题 直接运行Django没问题,但通过Apache+mod_wsgi上传中文字符的文件时出错: UnicodeEncodeError: 'ascii' codec can't encode ...

  8. how to use tar?

    In UNIX, tar is the most useful tool to compress files (just like zip in Windows.) To compress, inpu ...

  9. Hadoop2.6.0 动态增加节点

    本文主要从基础准备,添加DataNode和添加NodeManager三个部分详细说明在Hadoop2.6.0环境下,如何动态新增节点到集群中. 基础准备 在基础准备部分,主要是设置hadoop运行的系 ...

  10. HDU 5963 博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=5963 题目大意:中文题 思路:看ICPC camp好了,简单易懂:https://async.icpc-camp ...