干货|eBay的Elasticsearch性能调优实践(上)
Posted eBay技术荟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货|eBay的Elasticsearch性能调优实践(上)相关的知识,希望对你有一定的参考价值。
Elasticsearch 是什么?
它是一个基于 Apache Lucene 的开源搜索和分析引擎,允许用户近实时地存储、搜索和分析数据。在Elasticsearch性能调优实践上,我们的技术达人王佩,分别从研究现状、面临挑战和解决方案这三方面,给出了答案。
颜值与才华担当!
9年文档存储、索引、搜索领域软件行业从业经验,使用ElasticSearch约3年。目前在eBay 的ElasticSearch管理平台Pronto项目组工作,主要方向是ElasticSearch集群的部署和性能调优。
Pronto 是 eBay 托管 Elasticsearch 集群的平台,使 eBay 内部客户易于部署、运维和扩展 Elasticsearch 以进行全文搜索、实时分析和日志事件监控。今天 Pronto 管理着 60 多个 Elasticsearch 集群,达 2000 多个节点。日采集数据量达到 180 亿个文档,日均查询量达到 35 亿。该平台提供了创建、修复、安全、监控、告警和诊断的一整套功能。
虽然 Elasticsearch 专为快速查询而设计,但其性能在很大程度上取决于应用程序的场景、索引的数据量以及应用程序和用户查询数据的速度。本文总结了 Pronto 团队面临的挑战以及应对挑战所构建的流程和工具,还给出了对几种配置进行基准测试的一些结果。
迄今遇到的 Pronto/Elasticsearch 使用场景所面临的挑战包括:
高吞吐量:一些集群每天采集的数据高达 5TB,一些集群每天的搜索请求超过 4 亿。如果 Elasticsearch 无法及时处理这些请求,上游的请求将发生积压。
低搜索延迟:对于性能比较关键的集群,尤其是面向线上的系统,低搜索延迟是必需的,否则用户体验将受到影响。
最佳设置不可控:由于数据或查询是可变的,所以最佳设置也是变化的。不存在所有情况都是最佳的设置。例如,将索引拆分成更多的分片对于费时的查询是有好处的,但是这可能会影响其他查询性能。
为了帮助我们的客户应对这些挑战,Pronto 团队为用户案例上线和整个集群生命周期,针对性能测试、调优和监控构建了一套策略方法。
Pronto 团队为每种类型的机器和每个支持的 Elasticsearch 版本运行基准测试,收集性能数据,然后结合客户提供的信息,估算群集初始大小,包括:索引吞吐量、文档大小、搜索吞吐量、查询类型、热点索引文档数量、保留策略、响应时间需求、SLA 级别。
在开始索引数据和运行查询之前,我们先考虑一下。索引到底表示什么?Elastic 的官方答案是“具有某种相似特征的文档集合”。因此,下一个问题是“应该使用哪些特征来对数据进行分组?应该把所有文档放入一个索引还是多个索引?”,答案是,这取决于使用的查询。以下是关于如何根据最常用的查询组织索引的一些建议。
如果查询有一个过滤字段并且它的值是可枚举的,那么把数据分成多个索引。例如,你有大量的全球产品信息被采集到 Elasticsearch 中,大多数查询都有一个过滤条件“地区”,并且很少有机会运行跨地区查询。如下查询体可以被优化:
在这种情况下,如果索引按照美国、欧盟等地区分成几个较小的索引,可以从查询中删除过滤子句,查询性能会更好。如果我们需要运行一个跨地区查询,我们可以将多个索引或通配符传递给 Elasticsearch。
如果查询有一个过滤字段并且它的值是不可枚举的,建议使用路由。通过使用过滤字段值作为路由键,我们可以将具有相同过滤字段值的文档索引至同一个分片,并移除过滤子句。
例如,Elasticsearch 集群中存有数以百万记的订单数据,大多数查询都包含有买方 ID 作为限定从句。为每个买家创建索引是不可能的,所以我们不能通过买方 ID 将数据拆分成多个索引。一个合适的解决方案是,使用路由将具有相同买方 ID 的所有订单放入相同分片中。然后几乎所有的查询都可以在匹配路由键的分片内完成。
如果查询具有日期范围过滤子句,则按日期建立数据。这适用于大多数日志记录和监控场景。我们可以按天、周或月组织索引,然后可以获得指定的日期范围内的索引列表,这样,Elasticsearch 只需要查询一个较小的数据集而不是整个数据集。另外,当数据过期时,删除旧的索引也很容易。
明确设置映射。虽然 Elasticsearch 可以动态创建映射,但创建的映射可能并不适用于所有场景。例如,Elasticsearch 5.x 中的默认字符串字段映射是“keyword”和“text”类型。这在很多情况下是没有必要的。
如果文档使用用户定义的 ID 或路由进行索引,要避免造成分片不平衡。 Elasticsearch 使用随机 ID 生成器和散列算法来确保文档均匀地分配给分片。当使用用户定义的 ID 或路由时,ID 或路由键可能不够随机,造成一些分片明显比其他分片大。在这种情况下,这个分片上的读 / 写操作会比其他的慢得多。我们可以优化 ID/ 路由键。确保分片均匀分布在节点上。一个节点如果比其他节点的分片多,则会比其他节点承担更多的负载,成为整个系统的瓶颈。
下期技术干货预告:
eBay的Elasticsearch性能调优实践(下)
以上是关于干货|eBay的Elasticsearch性能调优实践(上)的主要内容,如果未能解决你的问题,请参考以下文章
ElasticsearcheBay上的Elasticsearch性能调优实践
Elasticsearch 性能调优指南——推荐实战 DSL