总结edit

本小节涵盖了许多基本理论以及很多深入的技术问题。聚合给 Elasticsearch 带来了难以言喻的强大能力和灵活性。桶(bucket)与度量(metric)的嵌套能力,基数(cardinality)与百分位数(Percentiles)的快速估算能力,定位信息中统计异常的能力, 所有的这些都在近乎实时的情况下操作的,而且全文搜索是并行的,它们改变了很多企业的游戏规则。

聚合有这样一个特点:一旦我们开始使用它,我们就能找到很多其他的可用场景。实时报表与分析对于很多组织来说都是核心功能(无论是应用于商业智能还是服务器日志)。

Elasticsearch 默认给 大多数 字段启用 doc values,所以在一些搜索场景大大的节省了内存使用量,但是需要注意的是只有不分词的字符串(unanalyzed string) 类型的字段才能使用这种特性。

内存的管理形式可以有多种形式,这取决于我们特定的应用场景:

  • 在规划时,组织好数据,使聚合运行在 not_analyzed 字符串而不是 analyzed 字符串,这样可以有效的利用 doc values 。
  • 在测试时,验证分析链不会在之后的聚合计算中创建 高基数(high cardinality) 字段。
  • 在搜索时,合理利用近似聚合(approximate aggregations)和数据过滤。
  • 在节点层,设置硬内存大小以及动态的断熔限制。
  • 在应用层,通过监视内存使用情况和控制缓慢的垃圾收集周期,可以向集群中添加更多的节点

大多数实施会应用到以上一种或几种方法。确切的组合方式与我们特定的系统环境高度相关。

无论采取何种方式,对于现有的选择进行评估,并同时创建短期和长期计划,都十分重要。先决定当前内存的使用情况和需要做的事情(如果有),通过评估数据增长速度,来决定未来半年或者一年的集群的规划,使用何种方式来扩展。

最好提前计划好集群的这些生命周期,而不是在凌晨3点因为集群的堆利用率达到90%而惊慌失措。