ELK Tips 主要介绍一些 ELK 使用过程当中的小技巧,内容主要来源为 Elastic 中文社区。html
INFO [monitoring] 1og/log.go:124 Non-zero metrics in the last 30s
;filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
output.elasticsearch:
hosts: ["https://localhost:9200"]
username: "filebeat_internal"
password: "YOUR_PASSWORD"
enabled: true
复制代码
input 和 output 下 enabled 属性默认值为 true,所以怀疑另有其因。java
output {
if [type] == "typeA"{
elasticsearch {
hosts => "127.0.0.1:9200"
index => "log_%{+YYYY_MM}"
}
}
}
复制代码
按照日的原理相似:%{+YYYY.MM.dd}git
Filebeat 实现了相似 Logstash 中 filter 的功能,叫作处理器(processors),processors 种类很少,尽量在保持 Filebeat 轻量化的基础上提供更多经常使用的功能。github
下面列几种经常使用的 processors:算法
add_cloud_metadata
:添加云服务器的 meta 信息;add_locale
:添加本地时区;decode_json_fields
:解析并处理包含 Json 字符串的字段;drop_event
:丢弃符合条件的消息事件;drop_fields
:删除符合条件的字段;include_fields
:选择符合条件的字段;rename
:字段重命名;add_kubernetes_metadata
:添加 k8s 的 meta 信息;add_docker_metadata
:添加容器的 meta 信息;add_host_metadata
:添加操做系统的 meta 信息;dissect
:相似与 gork 的正则匹配字段的功能;dns
:配置 filebeat 独立的 dns 解析方式;add_process_metadata
:添加进程的元信息。processors 的使用方式:docker
- type: <input_type>
processors:
- <processor_name>:
when:
<condition>
<parameters>
...
复制代码
exec {
codec => plain { }
command => "curl ftp://server/logs.log"
interval => 3000}
}
复制代码
在 docker-compose 中使用 user 选项设置使用 root 用户启动 docker,能解决权限问题。apache
$ cat docker-compose.yml
version: '2'
services:
logstash:
image: docker.elastic.co/logstash/logstash:6.4.2
user: root
command: id
复制代码
将一条消息拆分为多条消息。编程
# 原始信息
{
type => "type A"
metric1 => "value1"
metric2 => "value2"
}
# 配置信息
filter {
metricize {
metrics => [ "metric1", "metric2" ]
}
}
# 最终输出
{ {
type => "type A" type => "type A"
metric => "metric1" metric => "metric2"
value => "value1" value => "value2"
} }
复制代码
Lucene 的倒排索引都是按照字段(field)来存储对应的文档信息的,若是 docName 和 docContent 中有“苹果”这个 term,就会有这两个索引链,以下所示:json
docName:
"苹果" -> "doc1, doc2, doc3..."
docContent:
"苹果" -> "doc2, doc4, doc6..."
复制代码
RestHighLevelClient 是官方组件,会一直获得官方的支持,且会与 ES 保持同步更新,推荐使用官方的高阶 API。api
Jest 因为是社区维护,因此更新会有必定延迟,目前最新版对接 ES6.3.1,近一个月只有四个 issue,说明总体活跃度较低,所以不推荐使用。
此外推荐一份 TransportClient 的中文使用手册,翻译的很不错:github.com/jackiehff/e…。
常规状况下 ES 单分片使用 From/Size 是不会遇到数据重复的,数据重复的可能缘由有:
对于多分片,推荐添加 preference 参数来实现分页结果的一致性。
ES 在调用 setSource 的时候传入 Json 对象后会报错:The number of object passed must be even but was [1],此时能够推荐将 Json 对象转为 Map 集合,或者把 Json 对象转为 json 字符串,不过传入字符串的时候须要设置类型。
IndexRequest indexRequest = new IndexRequest("index", "type", "id");
JSONObject doc = new JSONObject();
//indexRequest.source(jsonObject); 错误的使用方法
//转为 Map 对象
indexRequest.source(JSONObject.parseObject((String) doc.get("json"), Map.class));
//转为 Json 字符串(声明字符串类型)
indexRequest.source(JSON.toJSONString(doc), XContentType.JSON);
复制代码
ES 6.X 原生支持跨集群搜索,具体配置请参考:www.elastic.co/guide/en/ki…
PUT _cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"cluster_one": {
"seeds": [
"127.0.0.1:9300"
]
},
"cluster_two": {
"seeds": [
"127.0.0.1:9301"
]
},
"cluster_three": {
"seeds": [
"127.0.0.1:9302"
]
}
}
}
}
}
复制代码
ES 6.5 推出了新功能,跨集群同步(Cross-cluster replication),感兴趣的能够自行了解。
GET /_search
{
"sort" : [
{ "price" : {"missing" : "_last"} }
],
"query" : {
"term" : { "product" : "chocolate" }
}
}
复制代码
使用相对低配的大磁盘机器配置为 ES 的 Warm Nodes,能够经过 index.routing.allocation.require.box_type
来设置索引是冷数据或者热数据。若是索引极少使用,能够 close 索引,而后在须要搜索的时候 open 便可。
对于大文本的去重,能够参考 SimHash 算法,经过 SimHash 能够提取到文档指纹(64位),两篇文章经过 SimHash 计算海明距离便可判断是否重复。海明距离计算,能够经过插件实现:github.com/joway/elast…
"collect_mode": "breadth_first"
;"min_doc_count": 10
来限制最小匹配文档数;include
和 exclude
来过滤 Term;两个系统链接同一个 ES 服务,配置和代码彻底一致,同一个搜索条件,一个可以搜索出来东西,一个什么都搜索不出来,排查结果是由于其中一个系统的 tomcat 配置有问题,致使请求的时候乱码了,因此搜不到数据。
默认状况下,若是字段不指定分词器,ES 或使用 standard 分词器进行分词;能够经过下面的设置更改默认的分词器。
2.X 支持设置默认的索引分词器(default_index)和默认的查询分词器(default_search),6.X 已经再也不支持。
PUT /index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "ik_max_word",
"tokenizer": "ik_max_word"
}
}
}
}
}
复制代码
若是你对排序没有特别的需求,推荐使用 _doc 进行排序,例如执行 Scroll 操做时。
Rollup job 有个 delay 参数控制 job 执行的延迟时间,默认状况下不延迟执行,这样若是某个 interval 的数据已经聚合好了,该 interval 迟到的数据是不会处理的。
好在 rollup api 能够支持同时搜索裸索引和 rollup 过的索引,因此若是数据常常有延迟的话,能够考虑设置一个合适的 delay,好比 1h、6h 甚至 24h,这样 rollup 的索引产生会有延迟,可是能确保迟到的数据被处理。
从应用场景上看,rollup 通常是为了对历史数据作聚合存放,减小存储空间,因此延迟几个小时,甚至几天都是合理的。搜索的时候,同时搜索最近的裸索引和历史的 rollup 索引,就能将二者的数据组合起来,在给出正确的聚合结果的状况下,又兼顾了性能。
Rollup 是实验性功能,不过很是有用,特别是使用 ES 作数据仓库的场景。
ES2.x 版本中,在聚合查询时,经过设置 setSize(0)
就能够获取全部的聚合结果,在ES6.x 中直接设置 setSize(Integer.MAX_VALUE)
等效于 2.x 中设置为 0。
常常会遇到 ES 与业务集成时出现 Jar 包冲突问题,推荐的解决方法是使用 maven-shade-plugin
插件,该插件经过将冲突的 Jar 包更换一个命名空间的方式来解决 Jar 包的冲突问题,具体使用能够参考文章:www.jianshu.com/p/d9fb7afa6…。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.guava</pattern>
<shadedPattern>net.luculent.elasticsearch.guava</shadedPattern>
</relocation>
<relocation>
<pattern>com.fasterxml.jackson</pattern>
<shadedPattern>net.luculent.elasticsearch.jackson</shadedPattern>
</relocation>
<relocation>
<pattern>org.joda</pattern>
<shadedPattern>net.luculent.elasticsearch.joda</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>net.luculent.elasticsearch.common</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.thirdparty</pattern>
<shadedPattern>net.luculent.elasticsearch.thirdparty</shadedPattern>
</relocation>
</relocations>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
复制代码
ES 采用 djb2 哈希算法对要索引文档的指定(或者默认随机生成的)_id
进行哈希,获得哈希结果后对索引 shard 数目 n 取模,公式以下:hash(_id) % n
;根据取模结果决定存储到哪个 shard 。
Kibana 的 Discovery 界面默认只显示 time 和 _source 两个字段,这个界面的左半部分,在 Popular 下面展现了不少,你只须要在你须要展现的字段后面点击 add 便可将自定义的字段添加到 discovery 界面。
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一块儿前行。