elasticsearch 索引出现值冲突,客户端报400错误

问题

最近在使用kibana时,发现管理索引那里,某个索引下面有字段冲突的提示,然后去查看fluentd客户端的运行情况,发现在fluent程序自己的日志里,偶尔会出现几条错误信息:’ElasticsearchE应用中间件rror error=“nginx启动命令400 - Rejected by Elasticsearch”’ , 这是怎么回事呢?下面是错误的日志:

2018-08-13 18:02:55 +0800 [warn]: #0 dump an error event: error_class=Fluent::Plugin::ElasticsearchEnginx是什么意思rrorHandle索引页r::ElasticsearchE应用中间件rror error=中间件技术原理与应用"400 - Rejected by Elasticsear监控appch" location=nil tag="athena索引" time=2018-08-13 18:01:51.000000000 +0800 record={"method"=>"GET", "path"=>"/", "format"=>"html", "contr监控别人微信聊天记录oller"=>"HomeCnginx怎么读ontroller", "acti监控家用远程手机on"=>"home", "status"=>302, "duration"tomcat是中间件还是服务器=>监控眼26.69, "view"=>0.0, "db"=>10.06, "l监控摄像头ocation"=>"https://x.x.com/x/xxoo", "paranginx是什么意思ms"=>"{}", "referrer"=>"https://x.o.com/x/ooooo/166888", "user_id"=>101010101010,应用服务器中间件功能 "session_id索引页"=>"199000000000000"}

分析

在kibana监控器什么牌子最好清晰度高 那里,对提示conflict 的location字段进行索引超出矩阵维度编辑,发现页面最下方有些重索引符号要提示,如图索引页是哪一页1所示:

elasticsearch 索引出现值冲突,客户端报400错误

kibana 冲突提示

从上面提示可监控眼以看出,location 字段在索引失效不同索引里的类型发生了变化,之前是text 类型,后来变成了geo_point. 为索引类型了确认这点,我们可以通过es客户端,或者直接用curl,对es的mapping进行查看。

验证

我这里使用curl方式,先查看为tenginx反向代理xt类型的索引。

curl -X GET "loca监控怎么安装lhost:9200/logsnginx部署-app-athena-2018.08.10/_mapping/" -H 'Content-Type: applicat监控系统ion/json' | jq '.'

这是location字段的定义:

"location": {
  "type": "text",
  "fields": {
    "keyword": {
      "ty应用服务器和中间件的区别pe": "keyword",
      "ignore应用服务器和中间件的区别_above": 256
    }索引
  }
},

然后再去监控家用远程手机看下提示location 为geo_监控怎么安装point 类型的索引看下。还是用上面的命令,只是改下索引的名字。得到的结果如预期一样。

"location": {
  "type": "geo_point"
},

但为什么从12号开始的索引里,这个值的类型就变成geo_ip了呢?仔细想了想,我11号好像做了一点操作。就是在logs-app-nginx* 索引模版里都添加了一个_defaunginx面试题lt_,但为什么这个会影响到logs-app-athena 的索引呢?这个问题一直没想明白。这个是我当时做的操nginx面试题作:

curl -X GET "localhost:9200/_template/logs-app-nginx-* -d '{"order":0,"template":"*","se监控摄像头ttin应用服务器和中间件的区别gs":{},"mappings":{"_dtomcat是中间件还是服务器efault_":{"properties":{"location":{"type":应用服务器和中间件的区别"geo_point"}}}索引页}}'

解决方案

  • 修改lo索引页gs-app-athena系列索引的_default_值中的location类型为text
curl -X PUT "localhost:9200/logs-app-athena-*/_mappings/"  -H 'Co消息中间件应用场景ntent-Type: application/json' -d'
{
  "_default_": {
    "properties": {
      "location": {
        "type": "text"监控安装流程
      }
    }
  }
}

Note: 在elasticsearch 6.0以后默认不在使用_default_ mappings.索引符号default mapping

总结

这次问题的出现,对es又多了一点点了解,还要多看看官方文档发布的更新日志,可能某些功能在相应的版本里就不推荐使用了。

另外做这次改动的根本原因是nginx监控系统日志都在logs-app-nginx-* 索引里,而location 字段没有被自动解析成geo_point类型。后来不得已,换成了logstash-*索引贴前缀的索引后,类型才自动变成了geo_point。不知道索引符号还有没有其它方法可以实现。

参考

change lat lon from float to geo_point

geo point for all indexs template-mappings

logstash lesson elasticsearch mnginx面试题apping