如何为logstash+elasticsearch配置索引模板?

在使用logstash收集日志的时候,我们一般会使用logstash自带的动态索引模板,虽然无须我们做任何定制操作,就能把我们的日志数据推送到elasticsearch索引集群中,但是在我们查询的时候,就会发现,默认的索引模板常常把我们不需要分词的字段,给分词了,这样以来,我们的比较重要的聚合统计就不准确了: 举个例子,假如有10台需要的监控的机器,他们的机器名如下:

Java代码

  1. search-0-170
  2. search-1-171
  3. search-2-172
  4. search-3-173
  5. search-4-174
  6. search-5-175
  7. search-6-176
  8. search-7-177
  9. search-8-178
  10. search-9-179

如果使用的是logstash的默认模板,它会按-切分机器名,这样以来想统计那台机器上的收集日志最多就有问题了,所以这时候,就需要我们自定义一些索引模板了: 在logstash与elasticsearch集成的时候,总共有如下几种使用模板的方式: (1)使用默认自带的索引模板 ,大部分的字段都会分词,适合开发和时候快速验证使用 (2)在logstash收集端自定义配置模板,因为分散在收集机器上,维护比较麻烦 (3)在elasticsearc服务端自定义配置模板,由elasticsearch负责加载模板,可动态更改,全局生效,维护比较容易 以上几种方式: 使用第一种,最简单,无须任何配置 使用第二种,适合小规模集群的日志收集,需要在logstash的output插件中使用template指定本机器上的一个模板json路径, 例如 template => "/tmp/logstash.json" 使用第三种,适合大规模集群的日志收集,如何配置,主要配置logstash的output插件中两个参数:

Java代码

  1. manage_template => false//关闭logstash自动管理模板功能
  2. template_name => "crawl"//映射模板的名字

如果使用了,第三种需要在elasticsearch的集群中的config/templates路径下配置模板json,在elasticsearch中索引模板可分为两种: (一):静态模板 适合索引字段数据固定的场景,一旦配置完成,不能向里面加入多余的字段,否则会报错 优点:scheam已知,业务场景明确,不容易出现因字段随便映射从而造成元数据撑爆es内存,从而导致es集群全部宕机 缺点:字段数多的情况下配置稍繁琐 一个静态索引模板配置例子如下:

Json代码

  1. {
  2. "crawl" : {
  3. "template": "crawl-*",
  4. "settings": {
  5. "index.number_of_shards": 3,
  6. "number_of_replicas": 0
  7. },
  8. "mappings" : {
  9. "logs" : {
  10. "properties" : {
  11. "@timestamp" : {
  12. "type" : "date",
  13. "format" : "dateOptionalTime",
  14. "doc_values" : true
  15. },
  16. "@version" : {
  17. "type" : "string",
  18. "index" : "not_analyzed",
  19. "doc_values" : true
  20. },
  21. "cid" : {
  22. "type" : "string",
  23. "index" : "not_analyzed"
  24. },
  25. "crow" : {
  26. "type" : "string",
  27. "index" : "not_analyzed"
  28. },
  29. "erow" : {
  30. "type" : "string",
  31. "index" : "not_analyzed"
  32. },
  33. "host" : {
  34. "type" : "string",
  35. "index" : "not_analyzed"
  36. },
  37. "httpcode" : {
  38. "type" : "string",
  39. "index" : "not_analyzed"
  40. },
  41. "message" : {
  42. "type" : "string"
  43. },
  44. "path" : {
  45. "type" : "string"
  46. },
  47. "pcode" : {
  48. "type" : "string",
  49. "index" : "not_analyzed"
  50. },
  51. "pro" : {
  52. "type" : "string",
  53. "index" : "not_analyzed"
  54. },
  55. "ptype" : {
  56. "type" : "string",
  57. "index" : "not_analyzed"
  58. },
  59. "save" : {
  60. "type" : "string",
  61. "index" : "not_analyzed"
  62. },
  63. "t1" : {
  64. "type" : "string",
  65. "index" : "not_analyzed"
  66. },
  67. "t2" : {
  68. "type" : "string",
  69. "index" : "not_analyzed"
  70. },
  71. "t3" : {
  72. "type" : "string",
  73. "index" : "not_analyzed"
  74. },
  75. "url" : {
  76. "type" : "string"
  77. }
  78. }
  79. }
  80. }
  81. }
  82. }

(二):动态模板 适合字段数不明确,大量字段的配置类型相同的场景,多加字段不会报错 优点:可动态添加任意字段,无须改动scheaml, 缺点:如果添加的字段非常多,有可能造成es集群宕机 如下的一个logstash的动态索引模板,只设置message字段分词,其他的字段默认都不分词

Json代码

  1. {
  2. "template" : "crawl-*",
  3. "settings" : {
  4. "index.number_of_shards": 5,
  5. "number_of_replicas": 0
  6. },
  7. "mappings" : {
  8. "_default_" : {
  9. "_all" : {"enabled" : true, "omit_norms" : true},
  10. "dynamic_templates" : [ {
  11. "message_field" : {
  12. "match" : "message",
  13. "match_mapping_type" : "string",
  14. "mapping" : {
  15. "type" : "string", "index" : "analyzed", "omit_norms" : true,
  16. "fielddata" : { "format" : "disabled" }
  17. }
  18. }
  19. }, {
  20. "string_fields" : {
  21. "match" : "*",
  22. "match_mapping_type" : "string",
  23. "mapping" : {
  24. "type" : "string", "index" : "not_analyzed", "doc_values" : true
  25. }
  26. }
  27. } ],
  28. "properties" : {
  29. "@timestamp": { "type": "date" },
  30. "@version": { "type": "string", "index": "not_analyzed" },
  31. "geoip" : {
  32. "dynamic": true,
  33. "properties" : {
  34. "ip": { "type": "ip" },
  35. "location" : { "type" : "geo_point" },
  36. "latitude" : { "type" : "float" },
  37. "longitude" : { "type" : "float" }
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }

总结: 定制索引模板,是搜索业务中一项比较重要的步骤,需要注意的地方有很多,比如: (1)字段数固定吗 (2)字段类型是什么 (3)分不分词 (4)索引不索引 (5)存储不存储 (6)排不排序 (7)是否加权 除了这些还有其他的一些因素,比如,词库的维护改动,搜索架构的变化等等。 如果前提没有充分的规划好,后期改变的话,改动其中任何一项,都需要重建索引,这个代价是非常大和耗时的,尤其是在一些数据量大的场景中。

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2016-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

关于解决emoji表情的存储

近段时间处理,由于工作需求,需要使得用户插入的emoji表情能够正常显示及使用,所以做个总结,以备后用。 说明:本方法只在mysql环境中测试 1.首先程序在连...

33610
来自专栏Java后端技术

Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)

(1).点击如下图所示的下拉按钮,弹出Edit Configurations...后点击该项。

783
来自专栏程序员同行者

优化mysql服务器

1182
来自专栏猿天地

solr or es 结合弥补mongodb的全文检索功能

最近将公司的solr集群升级到了最新的6.5版本。 之前用了N年的是3点多的版本,那个时候solr还不支持自带的集群,集群方式都是自己实现的。 公司里用的最多的...

45414
来自专栏杨建荣的学习笔记

datapump简介(一) (r6笔记第2天)

datapump是在10g之后推出的新特性,无论从功能还是性能上,都有一定的改进,可以说在功能上丰富了很多,在性能上也提升了很多。可以说exp/imp中能实现的...

2605
来自专栏Eternally运维

个人认为比较重要的MySQL—innodb参数详解

innodb_io_capacity:脏页的刷新的数量,可以动态调整,默认是200,该参数的设置取决于硬盘的IOPS的大小,IOPS就是每秒的读写次数。

1996
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用PostgreSQL 10设置逻辑复制

在为生产设置应用程序时,准备好多个数据库副本通常很有用。保持数据库副本同步的过程称为复制。复制可以为大量同时读取操作提供高可用性水平扩展,同时减少读取延迟。它还...

2805
来自专栏维C果糖

详述 MySQL 导出数据遇到 secure-file-priv 的问题

ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv opti...

3356
来自专栏LanceToBigData

MySQL集群(一)之主从复制

前面学完了JDBC,接下来带大家感受一下MySQL集群!其实什么是MySQL集群?简单的说就是一群机器(服务器)的集合,它们连在一起来工作。 其实各种数据库都有...

2585
来自专栏FreeBuf

搭建属于你自己的维基站点:MediaWiki

MediaWiki 是一个全球著名的开源的,运行于 PHP+MySQL 环境下的 wiki 程序 。例如,全球最大的 wiki 项目 维基百科,就是使用 Med...

5096

扫码关注云+社区

领取腾讯云代金券