ELK Tips 主要介绍一些 ELK 使用过程中的小技巧,内容主要来源为 Elastic 中文社区。
一、Logstash
1、Filebeat 设置多个 output
在 6.0 之前,Filebeat 可以设置多个输出(必须是不同类型的输出);从 6.0 开始已经禁止多输出了,只能拥有一个输出,如果想实现多输出,可以借助 logstash 等中间组件进行输出分发。
二、Elasticsearch
1、ES 用户占用的内存大于为 ES 设置的 heapsize
ES 是 Java 应用,底层存储引擎是基于 Lucene 的,heapsize 设置的是 Java 应用的内存;而 Lucene 建立倒排索引(Inverted Index)是先在内存里生成,然后定期以段文件(segment file)的形式刷到磁盘的,因此 Lucene 也会占用一部分内存。
2、ES 使用别名插入数据
ES 可以通过索引的方式向索引插入数据,但是同时只能有一个索引可以被写入,而且需要手动设置,未设置的情况下会报错:no write index is defined for alias [xxxx], The write index may be explicitly disabled using is_write_index=false
or the alias points to multiple indices without one being designated as a write index。
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test",
"alias" : "alias1",
"is_write_index" : true
}
}
]
}
3、ES 设置 G1 垃圾回收
修改 jvm.options
文件,将下面几行:
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
改为
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
即可。
其中 -XX:MaxGCPauseMillis
是控制预期的最高 GC 时长,默认值为 200ms,如果线上业务特性对于 GC 停顿非常敏感,可以适当设置低一些。但是这个值如果设置过小,可能会带来比较高的 cpu 消耗。
4、ES 和 Zipkin 集成时设置验证信息
java -DKAFKA_ZOOKEEPER=10.14.123.117:2181
-DSTORAGE_TYPE=elasticsearch
-DES_HOSTS=http://10.14.125.5:9200
ES_USERNAME=xxx ES_PASSWORD=xxx
-jar zipkin.jar
5、ES 集群部署报错
问题 1 报错信息如下:
Received message from unsupported version:[2.0.0] minimal compatible version is:[5.6.0]
经排查是集群中存在低版本的 ES 实例,将低版本实例移除即可。
问题 2 报错信息如下:
with the same id but is a different node instance
删除对应节点 elsticsearch 文件夹下的 data 文件夹下的节点数据即可。
6、海量中文分词插件
海量分词是天津海量信息技术股份有限公司自主研发的中文分词核心,经测试分词效果还是不错的,值得一试。
7、查询一个索引下的所有 type 名
通过下面的 API,即可获取全部的 type,下面的例子中 doc 就是 indexName 索引下的一个 type:
GET http://es127.0.0.1:9200/indexName/_mappings
-----------------------------------------------
{
indexName: - {
mappings: - {
doc: - {
_all: + {... },
dynamic_date_formats: + [... ],
dynamic_templates: + [... ],
properties: + {... }
}
}
}
}
8、索引模板中根据字段值设置别名
设置索引模板的时候,别名可以使用 Query 条件来进行匹配。
PUT _template/template_1
{
"index_patterns" : ["te*"],
"settings" : {
"number_of_shards" : 1
},
"aliases" : {
"alias2" : {
"filter" : {
"term" : {"user" : "kimchy" }
},
"routing" : "kimchy"
},
"{index}-alias" : {}
}
}
9、索引模板设置默认时间匹配格式
ES 默认是不会将 yyyy-MM-dd HH:mm:ss 识别为时间的,可以通过在索引模板进行如下设置实现多种时间格式的识别:
"mappings": {
"doc": {
"dynamic_date_formats": ["yyyy-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis"],
10、ES 中 Merge 相关设置
Merge 是非常耗费 CPU 的操作;而且如果不是 SSD 的话,推荐将 index.merge.scheduler.max_thread_count 设置为 1;否则 ES 会启动 Math.min(3, Runtime.getRuntime().availableProcessors() / 2) 个线程进行 Merge 操作;这样大部分机械硬盘的磁盘 IO 都很难承受,就可能出现阻塞。
"index": {
"refresh_interval": "5s",
"number_of_shards": "3",
"max_result_window": 10000,
"translog": {
"flush_threshold_size": "500mb",
"sync_interval": "30s",
"durability": "async"
},
"merge": {
"scheduler": {
"max_merge_count": "100",
"max_thread_count": "1"
}
},
11、mapping 中 enabled store index 参数
- enabled:默认是true,只用于 mapping 中的 object 字段类型;当设置为 false 时,其作用是使 es 不去解析该字段,并且该字段不能被查询和 store,只有在 source 中才能看到,设置 enabled 为 false,可以不设置字段类型,默认类型为 object;
- store:默认 false,store 参数的功能和 source 有一些相似,我们的数据默认都会在 source 中存在,但我们也可以将数据 store 起来;当我们使用
copy_to
参数时,copy_to
的目标字段并不会在 source 中存储,此时 store 就派上用场了; - index:默认是 true,当设置为 false,表明该字段不能被查询,如果查询会报错。
12、ES 图片搜索
- 可以借助局部敏感 LSH 或者 pHash 来实现:https://stackoverflow.com/questions/32785803
- Github 也有一个开源项目使用了多种 Hash 算法借助 ES 来实现图片搜索:https://github.com/usc-isi-i2/elasticsearch-image-features
13、Term 聚合根据子聚合结果排序
GET /_search
{
"aggs" : {
"genres" : {
"terms" : {
"field" : "genre",
"order" : { "playback_stats.max" : "desc" }
},
"aggs" : {
"playback_stats" : { "stats" : { "field" : "play_count" } }
}
}
}
}
三、社区文章精选
本文地址:http://searchkit.cn/article/6163