ELK Tips 主要介绍一些 ELK 使用过程当中的小技巧,内容主要来源为 Elastic 中文社区。编程
如下配置将 message
内容按照 \t
进行切分,为了使 \t
生效须要将 logstah.yml 中配置项 config.support_escapes
设置为 true,当设置为 true 时,带引号的字符串将处理转义字符,默认值为 false。json
filter {
mutate {
split => {"message" => "\t"}
add_field => {
"ftimeold" => "%{[message][0]}"
}
}
}
复制代码
下面的配置将读取/home/txts/*
下的文件,并读取整个文件内容,而后将文件内容存储到 test-text
索引中,同时该条记录的 _id
为文档的文件名。这里须要注意的是,想读取到文档末尾时,分隔符需设置为 EOF
。bash
input {
file {
path => ["/home/txts/*"]
start_position => "beginning"
mode => "read"
delimiter => "EOF"
file_completed_action => "log"
file_completed_log_path => "/home/logs/file.log"
}
}
output {
elasticsearch {
hosts => ["http://192.168.3.214:9200/"] index => "test-text" document_id => "%{path}" } stdout {} } 复制代码
Ingest Node 可使用多种过滤器对数据进行处理,其中 Script 脚本的功能很是强大,下面的案例实现了将一个 Json 结构进行了 Flat 化:session
{
"script" : {
"lang" : "painless",
"source" : "def dict = ['result': new HashMap()]; for (entry in ctx['json'].entrySet()) { dict['result'][entry.getKey()] = entry.getValue(); } ctx['osquery'] = dict; ctx.remove('json');"
}
}
复制代码
sincedb_path => "/dev/null"
;sincedb_clean_after => "2 weeks"
来实现,sincedb_clean_after
表示当一个文件在设定的时间内没有发生过任何变化,则关于这个文件的扫描记录将不会存储到 sincedb 里面,简单来讲就是一条记录的过时时间。为了保证用户每次查询结果的一致性(文档在结果中的顺序),能够在查询 url 里添加 preference=<some string>
这个参数,其中<some string>
能够是用户的 session ID,这样某一个用户查询的时候,查询会被固定在某几个 shard。app
jump,hop,leap
;leap,hop => jump
;"cat => cat,pet",
"kitten => kitten,cat,pet",
"dog => dog,pet"
"puppy => puppy,dog,pet"
复制代码
index.blocks.write
设置为 true 来禁止对索引的写操做,但索引的 metadatra 能够正常写。less
PUT indexName/_settings
{
"index.blocks.write": true
}
复制代码
这个是建立 mapping 的时候超时了,默认是 30s 应该是集群处理不过来了。索引文件太多,使得集群的状态数据过多过大,在每一个小时新建索引和设置索引 mapping 的时候,就产生集群状态更新任务交给 master 处理,master 在变动状态数据的时候是单线程处理的,若是集群总的状态数据很大,master处理这些任务就容易出现超时。dom
解决办法:elasticsearch
这种状况通常在索引时候加入了路由字段(routing),那么在 get,delete,update 操做中都必须使用路由字段。ui
PUT my_index/my_type/1?routing=user1&refresh=true
{
"title": "This is a document"
}
GET my_index/my_type/1?routing=user1
复制代码
把 5.x 集群中的索引按不一样 type 拆分 reindex 到 6.x 集群索引中,而后将拆分出来的多个索引使用别名进行组织;例如 5.x 集群中有索引 IndexA,该索引上有 typeA 和 typeB,reindex 到 6.x 集群IndexA_TypeA
和IndexB_TypeB
,reindex 语句以下所示:url
POST _reindex
{
"source": {
"index": "IndexA",
"type": "TypeA",
"size": 10000
},
"dest": {
"index": "IndexA_TypeA"
}
}
复制代码
最后给 6.x 集群的IndexA_TypeA
和IndexB_TypeB
添加别名 IndexA,用户查询时使用的索引名称就不用变化。
POST _aliases
{
"actions": [
{"add": {"index": "IndexA_TypeA", "alias": "IndexA"}},
{"add": {"index": "IndexA_TypeB", "alias": "IndexA"}}
]
}
复制代码
须要在 reindex 以前为新索引从新设置 mapping ,reindex 只是经过相似 scroll 的方式把数据 bulk 到新的索引,不会自动同步原索引的 mappings 信息。
只须要配置主节点(master)地址便可。
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
复制代码
想最大程度发挥磁盘读写 io,仍是推荐 RAID0。
使用多路径不必定会提高读写速度,和集群 shard 的数量有关系;主要是由于一个 shard 对应的文件,只会放到其中一块磁盘上,不会跨磁盘存储。好比一个极端的场景,集群 shard 数量比较少,每一个结点上就一个shard,那么读写只会有一块磁盘发挥做用,其余磁盘都空闲的。
多路径对读写有提高比较大的场景,是每一个结点上 shard 数量至少比盘的数量多,而且 shard 大小也差异不太多;shard 数量比较少,shard 大小差异太大,可能产生读写热点问题,即有的磁盘磁盘很忙,有的很闲。
ES 不会将一个索引的主副分片分配到同一台机器,因此即便一台机器的 RAID0 坏了,不会致使数据丢失,仅仅是副本没有了。
用 RAID0 的负面影响主要是磁盘损坏的时候,须要恢复的数据比较多;多路径磁盘,坏一块只会丢一部分数据,恢复数据会比较快;可是他也有缺陷,好比容易出现读写热点问题以及磁盘空间使用不均匀问题。
# 推荐
GET /_cat/shards/<index_name>?v
GET /_cluster/state/routing_table
复制代码
boolQuery().should(matchQuery(field, keyword))
的一种简化,简单说就是一个关键词,匹配多个字段,匹配方式为 matchQuery,正常的全文匹配。简单来讲:_source 字段用于存储最原始的 JSON 文档内容(建立索引时传递的),这个字段不能被搜索,它能够在 get 或者 search 请求阶段进行返回;此外它会参与字段高亮计算、文档的更新等操做,通常不推荐关闭 _source 字段。
在设计表格的时候直接点击须要排序的那一列,而后让它按照倒序或者正序排序,而后点击保存便可,这样这个表格默认就是按照这一列倒序或者正序排列的。
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一块儿前行。