`
m635674608
  • 浏览: 5028928 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

elasticsearch 使用事项

 
阅读更多

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

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

Java代码  收藏代码
  1. {  
  2.   "template-logstash" : {  
  3.     "template" : "logstash*",  
  4.     "settings" : {  
  5.       "index.number_of_shards" : 5,  
  6.       "number_of_replicas" : 1,  
  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里有一个巨大的延时。

 

http://rockelixir.iteye.com/blog/1888717

分享到:
评论

相关推荐

    elasticsearch-head 可视化界面

    5. **浏览器扩展**:虽然Elasticsearch-Head可以作为一个独立的服务运行,但题目提到的是在谷歌浏览器中作为扩展使用。这需要将解压后的文件上传至Chrome浏览器的扩展管理页面,然后启用该扩展。 ### 功能特性 1. ...

    最新版windows elasticsearch-7.10.0-windows-x86_64.zip

    以下是关于Elasticsearch 7.10.0在Windows上安装和使用的详细知识点: 1. **下载与安装**: - 从官方渠道下载"elasticsearch-7.10.0-windows-x86_64.zip",解压到你选择的目录。 - 确保你的系统满足运行Elastic...

    elasticsearch-head谷歌插件

    4. **节省资源**:作为独立的Web应用,Head插件不会占用Elasticsearch服务器的资源,避免了直接安装在ES上的潜在问题。 **二、使用Elasticsearch-Head谷歌插件** 1. **安装与配置**:由于是谷歌插件,用户可以通过...

    Elasticsearch head插件

    **Elasticsearch Head 插件详解** Elasticsearch Head 是一个非常实用的开源插件,专为 Elasticsearch 设计,提供了一个直观的用户界面,让用户能够方便地管理和监控 Elasticsearch 集群。它以其轻量级、易安装和即...

    Elasticsearch组件elasticsearch-head-master

    4. **启动服务**:使用`npm start`命令启动elasticsearch-head服务,通常它会在本地的9100端口上运行。 5. **连接Elasticsearch**:在浏览器中打开`http://localhost:9100/`,然后配置连接到你的Elasticsearch集群...

    elasticsearch-head插件

    - 鉴于安全考虑,建议仅在内部网络环境中使用Elasticsearch-Head,并确保ES集群的安全配置。 - 对于大型集群,过多的HTTP请求可能会增加ES服务器的负载,合理规划使用。 总的来说,Elasticsearch-Head是ES用户的一...

    elasticsearch-head-master安装及下载.rar

    这款工具无需安装,只需将其部署在运行Elasticsearch的服务器上,通过浏览器访问即可使用。以下是对"elasticsearch-head-master安装及下载"的详细步骤和相关知识点的说明。 **1. 下载Elasticsearch Head** 首先,你...

    elasticsearch-sql插件(es2.2.0版本)

    3. **安装插件**: 使用Elasticsearch的bin目录下的`elasticsearch-plugin`脚本来安装插件。命令格式通常是`./bin/elasticsearch-plugin install file:///path/to/downloaded/plugin.zip`,其中`file:///path/to/...

    elasticsearch-head-chrome-master.zip

    在处理敏感数据时,建议使用更安全的管理工具,并确保 Elasticsearch 配置有适当的认证和授权机制。 总的来说,"elasticsearch-head-chrome-master.zip" 提供了一个便捷的 Elasticsearch 监控解决方案,尤其适合...

    最新版linux elasticsearch-7.17.1-linux-x86_64.tar.gz

    **使用Elasticsearch:** 1. 数据索引:使用`PUT`或`POST`方法向指定索引添加文档。 2. 查询数据:使用`GET`方法从索引中检索数据,支持丰富的查询语法。 3. 更新与删除:使用`UPDATE`和`DELETE`操作修改或移除文档...

    elasticsearch-5.6.4-head.tar

    本篇将详细介绍如何安装和使用Elasticsearch 5.6.4以及`head`插件。 ### 安装Elasticsearch 5.6.4 首先,我们需要下载Elasticsearch的5.6.4版本。通常,可以从Elasticsearch官方网站或者通过wget命令在线下载。...

    elasticsearch-head-0.1.5.zip chrome插件

    Elasticsearch Head 是一款功能强大的开源工具,专为Elasticsearch(ES)设计,提供了一个用户友好的界面,用于可视化管理和操作ES集群。这款插件最初由Michael G. Ziller开发,版本号为0.1.5,它是一个压缩包文件...

    elasticsearch-head 1.0.8.zip

    在使用 `elasticsearch-head` 之前,你需要确保已经安装了 Elasticsearch。然后,你可以通过以下步骤安装和配置这个插件: 1. 下载 `elasticsearch-head 1.0.8.zip` 压缩包并解压。 2. 将解压后的文件夹移动到 ...

    elasticsearch数据库下载、配置、使用案例PPT模板

    ### Elasticsearch数据库的下载、配置与使用案例 #### 一、Elasticsearch数据库的下载与安装 **1.1 下载与解压** - **下载Elasticsearch:** - **官方网站下载:** 访问Elasticsearch官方网站...

    elasticsearch-head

    2. **获取源码**:从 GitHub 下载 `elasticsearch-head` 源码,或者使用 Git 命令克隆: ``` git clone https://github.com/mobz/elasticsearch-head.git ``` 3. **安装依赖**:进入 `elasticsearch-head` 目录...

    elasticsearch-6.2.2.rar

    1. **安装步骤**:下载完成后,解压"elasticsearch-6.2.2.rar",你可以使用`unrar x elasticsearch-6.2.2.rar`命令进行解压。解压后,你会看到包含的各个目录,如`bin`、`config`等,这些都是运行Elasticsearch必要...

    elasticsearch5.X 安装和head插件安装

    Elasticsearch(简称ES)是一款基于Lucene的开源全文搜索引擎,提供分布式、RESTful风格的搜索和数据分析功能。在5.x版本中,它增强了性能,优化了API,并引入了许多新特性。本文将详细介绍如何在本地环境中安装...

Global site tag (gtag.js) - Google Analytics