Day2: 利用nested object缩减mapping大小
Advent • 三斗室 发表了文章 • 0 个评论 • 7548 次浏览 • 2015-12-05 12:00
我们都知道,Elasticsearch 宣传中是 schemaless 的。但实际使用中,并不是完全的随意。比如过多的 kv 切割,会导致 mapping 大小暴涨,对集群稳定性是个不小的挑战。
以 urlparams 为例,下面这段 urlparams 直接通过 logstash-filter-kv 切割得到的结果,需要在 mapping 中占用 4 个字段的定义。
"urlparams" : {
"uid" : "1234567890",
"action" : "payload",
"t" : "1449053032000",
"pageid" : "v6"
}如果哪个开发一时想不开(我真的碰到过),把 urlparams 写成 uid=123456789&action=payload&1449053032000=t&pageid=v6,那基本上整个 ES 集群就会被过于频繁的 mapping 更新搞挂了。这时候,我们修改一下 mapping 定义:
{
"accesslog" : {
"properties" : {
"urlparams" : {
"type" : "nested",
"properties" : {
"key" : { "type" : "string", "index" : "not_analyzed", "doc_values" : true },
"value" : { "type" : "string", "index" : "not_analyzed", "doc_values" : true }
}
}
}
}
}同时在 Logstash 的 filter 配置中添加一段:if [urlargs] {
ruby {
init => "@kname = ['key','value']"
code => "event['urlparams'] = event['urlargs'].split('&').collect {|i| Hash[@kname.zip(i.split('='))]}"
remove_field => [ "urlargs","uri","request" ]
}
}生成的 JSON 数据变成这个样子:"urlargs": [
{ "key": "uid", "value": "1234567890" },
{ "key": "action", "value": "payload" },
{ "key": "1449053032000", "value": "t" },
{ "key": "pageid", "value": "v6" }
]这样,再错乱的 urlparams,也不会发生 mapping 变更,导致集群故障了!想了解更全面的 ELK Stack 知识和细节,欢迎购买我的《ELK Stack权威指南》,也欢迎加 QQ 群:315428175 哟。
Day1: 怎样让Logstash每次都从头读文件?
Advent • 三斗室 发表了文章 • 1 个评论 • 13499 次浏览 • 2015-12-05 11:56
今天是 12 月 1 日,第一天,开天辟地,让我们也从最简单而又容易被忽略的一个小技巧开始吧!
每个上手 ELK 的新用户,肯定都需要测试一下读取文件输出到终端这步。在 Logstash 中,也就是配置这样一段:
input {
file {
path => ["/data/test.log"]
}
}
output {
stdout {
codec => rubydebug
}
}不过很多新人的测试随后就卡在第二步了:当你修改一下配置,准备添加一段 filter 配置再重复运行 logstash 命令时,发现终端一直停滞没有输出。这是因为:Logstash 会记录自己读取文件内容的偏移量到一个隐藏文件里,默认情况下,下次启动,他会从这个偏移量继续往后读,避免重复读取数据。
这个隐藏文件,叫做 $HOME/.sincedb_****。过去很多文档,在解释了这个原理后,都会告诉大家解决办法:每次重新运行 logstash 命令之前,删除掉家目录下的 sincedb 隐藏文件。
但是这种办法很笨,不是么?
今天告诉大家一个更方便的办法,改用下面这段 Logstash 配置:
input {
file {
path => ["/data/test.log"]
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
output {
stdout {
codec => rubydebug
}
}要点就在这行 sincedb_path => "/dev/null" 了!该参数用来指定 sincedb 文件名,但是如果我们设置为 /dev/null这个 Linux 系统上特殊的空洞文件,那么 logstash 每次重启进程的时候,尝试读取 sincedb 内容,都只会读到空白内容,也就会理解成之前没有过运行记录,自然就从初始位置开始读取了!好了,第一天就是这样。更多内容,敬请期待。
想了解更全面的 ELK Stack 知识和细节,欢迎购买我的《ELK Stack权威指南》,也欢迎加 QQ 群:315428175 哟。
mapper-attachments这个插件怎么用啊
Elasticsearch • kangly 回复了问题 • 2 人关注 • 16 个回复 • 6975 次浏览 • 2016-11-11 10:34
elasticsearch logstash kibana beats 资料分享
资料分享 • abcdef 发表了文章 • 1 个评论 • 9756 次浏览 • 2015-12-02 14:40
请问kibana有中文版么?
Kibana • redfree 回复了问题 • 13 人关注 • 10 个回复 • 39297 次浏览 • 2018-01-25 14:10
es2.0 mapping删除的问题
Elasticsearch • redhat 回复了问题 • 5 人关注 • 2 个回复 • 10686 次浏览 • 2017-11-11 16:04
es 1.7.x版本下 可以往已有的mapping添加一个属性么?
Elasticsearch • wangjueying 回复了问题 • 2 人关注 • 2 个回复 • 5837 次浏览 • 2015-12-01 10:47
点击visualize的时候告警:Visualize:java.lang.lllegalStateException:Field daVisualize
Kibana • velion 回复了问题 • 2 人关注 • 2 个回复 • 17739 次浏览 • 2015-12-13 13:18
elasticsearch动态映射字段类型
Elasticsearch • medcl 回复了问题 • 3 人关注 • 1 个回复 • 7417 次浏览 • 2015-12-03 10:59
elasticsearch 启动错误
Elasticsearch • sddbdw 回复了问题 • 3 人关注 • 1 个回复 • 10504 次浏览 • 2015-11-28 16:39
携带有通配符的query_string查询结果解析问题
Elasticsearch • shiyuan 回复了问题 • 4 人关注 • 2 个回复 • 12711 次浏览 • 2017-04-04 21:42

