Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【搜索引擎】提高 Solr 性能

【搜索引擎】提高 Solr 性能

作者头像
架构师研究会
发布于 2022-06-08 07:49:49
发布于 2022-06-08 07:49:49
7480
举报
文章被收录于专栏:超级架构师超级架构师

这是一个关于我们如何设法克服搜索和相关性堆栈的稳定性和性能问题的简短故事。

语境

在过去的 10 个月里,我很高兴与个性化和相关性团队合作。我们负责根据排名和机器学习向用户提供“个性化和相关的内容”。我们通过一组提供三个公共端点的微服务来做到这一点,即 Home Feed、Search 和 Related items API。我记得加入团队几个月后,下一个挑战是能够为更大的关键国家提供优质服务。目标是保持我们在较小国家/地区已经拥有的完美性能和稳定性。

我们使用 Zookeeper 在 Openshift 上的 AWS 中使用 SolrCloud (v 7.7)。在撰写本文时,我们很自豪地提到,该 API 每分钟服务约 15 万个请求,并每小时向我们最大区域的 Solr 发送约 21 万个更新。

基线

在我们最大的市场中部署 Solr 后,我们必须对其进行测试。我们使用内部工具进行压力测试,我们可以大致获得所需的流量。我们相信 Solr 配置良好,因此团队致力于提高客户端的性能并针对 Solr 设置更高的超时时间。最后我们同意我们可以稍微松散地处理交通。

迁移后

服务以可接受的响应时间进行响应,Solr 客户端表现非常好,直到由于超时而开始打开一些断路器。超时是由 Solr 副本响应时间过长的明显随机问题产生的,这些问题在没有信息显示的情况下更频繁地影响前端客户端。以下是我们遇到的一些问题:

  • 高比例的副本进入恢复并且需要很长时间才能恢复
  • 副本中的错误无法到达领导者,因为它们太忙了
  • 领导者承受过多的负载(来自索引、查询和副本同步),这导致它们无法正常运行并导致分片崩溃
  • 对“索引/更新服务”的怀疑,因为减少其到 Solr 的流量会阻止副本停止或进入恢复模式
  • 完整的垃圾收集器经常运行(老年代和年轻代)。
  • 运行在 CPU 之上的 SearchExecutor 线程,以及垃圾收集器
  • SearchExecutor 线程在缓存预热时抛出异常 (LRUCache.warm)
  • 响应时间从 ~30 ms 增加到 ~1500 ms
  • 发现某些 Solr EBS 卷上的 IOPS 达到 100%

处理问题

分析

作为分析的一部分,我们提出了以下主题

Lucene 设置

Apache Solr 是一个广泛使用的搜索和排名引擎,经过深思熟虑并在后台使用 Lucene 进行设计(也与 ElasticSearch 共享)。Lucene 是所有计算背后的引擎,并为排名和 Faceting 创造了魔力。是否可以对 Lucene 进行数学运算并检查设置?我可以根据大量文档和论坛阅读资料分享一个近似结果,但是它的配置不如 Solr 的数学那么重。 调整 Lucene 是可能的,前提是您愿意牺牲文档的结构。真的值得努力吗?不,当您进一步阅读时,您会发现更多信息。

文档与磁盘大小

假设我们有大约 1000 万个文档。假设平均文档大小为 2 kb。最初,您的磁盘空间将至少占用以下空间:

分片

一个集合拥有多个分片并不一定会产生更具弹性的 Solr。当一个分片出现问题而其他分片无论如何都可以响应时,时间响应或阻塞器将是最慢的分片。

当我们有多个分片时,我们将文档总数除以分片数。这减少了缓存和磁盘大小并改进了索引过程。

索引/更新过程

是否有可能我们有一个过度杀伤的索引/更新过程?鉴于我们的经验,这并不过分。我将把这个问题的分析留给另一篇文章。否则,这将过于广泛。在我们的主要市场,我们已经达到每小时 21 万次更新(高峰流量)。

Zookeeper

Apache Zookeeper 在此环境中的唯一工作是尽可能准确地保持所有节点的集群状态可用。如果副本恢复过于频繁,一个常见问题是集群状态可能与 Zookeeper 不同步。这将在正在运行的副本之间产生不一致的状态,并且尝试恢复的副本最终会进入一个可能持续数小时的长循环。Zookeeper 非常稳定,它可能仅由于网络资源而失败,或者更好地说是缺少它。

我们有足够的内存吗?

理论

Solr 性能最重要的驱动因素之一是 RAM。Solr 需要足够的内存用于 Java 堆,并需要可用内存用于 OS 磁盘缓存。

强烈建议 Solr 在 64 位 Java 上运行,因为 32 位 Java 被限制为 2GB 堆,这可能会导致更大的堆不存在的人为限制(在本文后面部分讨论) .

让我们快速了解一下 Solr 是如何使用内存的。首先,Solr 使用两种类型的内存:堆内存和直接内存。直接内存用于缓存从文件系统读取的块(类似于 Linux 中的文件系统缓存)。Solr 使用直接内存来缓存从磁盘读取的数据,主要是索引,以提高性能。

当它被暴露时,大部分堆内存被多个缓存使用。

JVM 堆大小需要与 Solr 堆需求估计相匹配,以及更多用于缓冲目的。堆和操作系统内存设置的这种差异为环境提供了一些空间来适应零星的内存使用高峰,例如后台合并或昂贵的查询,并允许 JVM 有效地执行 GC。例如,在 28Gb RAM 计算机中设置 18Gb 堆。

让我们记住我们一直在为 Solr 改进的方程式,与内存调整最相关的领域如下:

虽然下面的解释很长而且很复杂,但是为了建立另一个帖子,我仍然想分享我们一直在研究的数学。我们在解决问题之初就使用了自己的计算器,只是为了实现后来在线社区共享的类似问题。 此外,我们确保在启动 Solr 时在 JVM Args 中正确启用垃圾收集器。

缓存证据

我们根据 Solr 管理面板中的证据调整缓存,如下所示:

  • queryResultCache 的命中率为 0.01
  • filterCache 的命中率为 0.43
  • documentCache 的命中率为 0.01

垃圾收集器和堆

使用 New Relic,我们可以检查实例上的内存和 GC 活动,并注意到 NR 代理由于内存阈值而频繁打开其断路器(浅红色竖线):20%;垃圾收集 CPU 阈值:10%。此行为是实例上可用内存问题的明确证据。

我们还可以监控一些高 CPU 实例进程,发现在 searcherExecutor 线程使用 100% 的 CPU 时占用了大约 99% 的堆。使用 JMX 和 JConsole,我们遇到了包含以下内容的异常: …org.apache.solr.search.LRUCache.warm(LRUCache.java:299) …作为堆栈跟踪的一部分。上述异常与缓存设置大小和预热有关。

磁盘活动 — AWS IOPS

开始解决问题

搜索结果容错

为前端客户端提供搜索结果的第一个想法是始终让 Solr 副本仍然存在以响应查询,以防集群由于副本处于恢复甚至消失状态而变得不稳定。Solr 7 引入了在领导者及其副本之间同步数据的新方法:

  • NRT 副本:在 SolrCloud 中处理复制的旧方法。
  • TLOG replicas:它使用事务日志和二进制复制。
  • PULL 副本:仅从领导者复制并使用二进制复制。

长话短说,NRT 副本可以执行三个最重要的任务,索引、搜索和引导。另一方面,TLOG 副本将以稍微不同的方式处理索引,搜索和引导。差异因素在于 PULL 副本,它只为带有搜索的查询提供服务。

通过应用这种配置,我们可以保证只要分片有领导者,PULL 副本就会响应,从而大大提高可靠性。此外,这种副本不会像处理索引过程的副本那样频繁地进行恢复。

当索引服务满负荷时,我们仍然面临问题,导致 TLog 副本进入恢复。

调整 Solr 内存

基于这个问题我们是否有足够的 RAM 来存储文档数量?,我们决定进行实验。最初的担忧是为什么我们在文档的“单位”中配置这些值,如下所示:

根据之前共享的公式,考虑到我们有 700 万份文档,估计的 RAM 约为 3800 Gb。但是,假设我们有 5 个分片,那么每个分片将处理大约 140 万个直接影响副本的文档。我们可以估计,使用该分片配置,所需的 RAM 约为 3420 Gb。这不会产生根本性的变化,所以我们继续前进。

缓存结果

从缓存证据中,我们可以看到只有一个缓存被使用得最好,即 filterCache。测试的解决方案如下:

通过之前的缓存配置,我们获得了以下结果:

  • queryResultCache 的命中率为 0.01
  • filterCache 的命中率为 0.99
  • documentCache 的命中率为 0.02

垃圾收集器结果

在本节中,我们可以看到 New Relic 提供的垃圾收集器指标。我们没有老年代活动,通常会导致 New Relic 代理打开它的断路器(内存耗尽)。

磁盘活动结果

我们在磁盘活动方面也取得了惊人的成果,索引也大幅下降。

外部服务结果

其中一项访问 Solr 的服务在 New Relic 中的响应时间和错误率显着下降。

调整 Solr 集群

多分片模式的一个缺点是,如果任何副本被破坏,分片领导者将比其对等节点花费更多的时间来回答。这导致分片中最差的时间响应,因为 Solr 会在提供最终响应之前等待所有分片回答。

为了缓解上述问题并考虑到前面描述的结果,我们决定开始逐渐减少节点和分片的数量,这对降低内部复制因子有影响。

结论

经过数周的调查、测试和调优,我们不仅摆脱了最初暴露的问题,而且通过减少延迟提高了性能,通过设置更少的分片和更少的副本降低了管理复杂性,获得了对索引/更新的信任服务满负荷工作,并通过使用几乎一半的 AWS EC2 实例帮助公司减少开支。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 首席架构师智库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【搜索引擎】配置 Solr 以获得最佳性能
Apache Solr 是广泛使用的搜索引擎。有几个著名的平台使用 Solr;Netflix 和 Instagram 是其中的一些名称。我们在 tajawal 的应用程序中一直使用 Solr 和 ElasticSearch。在这篇文章中,我将为您提供一些关于如何编写优化的 Schema 文件的技巧。我们不会讨论 Solr 的基础知识,我希望您了解它的工作原理。 虽然您可以在 Schema 文件中定义字段和一些默认值,但您不会获得必要的性能提升。您必须注意某些关键配置。在这篇文章中,我将讨论这些配置,您可以使用它们在性能方面充分利用 Solr。 事不宜迟,让我们开始了解这些配置是什么。
架构师研究会
2022/05/25
1.6K0
【搜索引擎】配置 Solr 以获得最佳性能
如何做好 Elasticsearch 性能指标监控
声明:本文是较早的一篇关于Elasticsearch性能指标监控的博文,内容总结全面,作者 Emily Chang,原文地址:https://www.datadoghq.com/blog/monitor-elasticsearch-performance-metrics,由杨文波同学翻译。
大数据技术架构
2019/09/29
1.6K0
如何做好 Elasticsearch 性能指标监控
开源搜索引擎排名第一,Elasticsearch是如何做到的?
随着移动互联网、物联网、云计算等信息技术蓬勃发展,数据量呈爆炸式增长。如今我们可以轻易得从海量数据里找到想要的信息,离不开搜索引擎技术的帮助。
腾讯云开发者
2020/08/28
1.6K0
浅谈Solr和ElasticSearch建索引性能优化策略
由于Solr和ElasticSearch都是基于Lucene构建的,所以他们之间有很大程度的相似性,故而他们的一些优化策略基本也是通用的,面对越来越多的海量数据,如何优化全量索引的写入性能呢? 散仙简单总结了下面几个方向的优化策略,如有疑问,欢迎拍砖。 (一)硬件优化: (1)CPU加大,有利于并发写入 (2)内存提升,加大写入缓冲 (3)磁盘IO,使用SSD或者IO读写更快的磁盘 (4)网络IO,保证客户端与服务端的通信带宽充足 (二)服务端框架优化: (1)加大shard的数目,理论
我是攻城师
2018/05/14
1.3K0
Solr学习笔记 - 关于近实时搜索
本节中的设置是在solrconfig.xml中的<updateHandler>元素中配置的,可能会影响索引更新的性能。这些设置将影响如何在内部进行更新。<updateHandler>配置不影响RequestHandlers处理客户端的update请求的更高级的配置。
黎明你好
2020/08/01
4.6K1
全文搜索引擎Elasticsearch,这篇文章给讲透了
由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的以及它的使用和基本原理。
大数据技术架构
2019/08/16
9.9K3
全文搜索引擎Elasticsearch,这篇文章给讲透了
Neo4J性能优化指引
为了更好的管理服务,最好显示的去设置页面缓存和堆大小参数,否则Neo4j在启动时将根据可用资源计算默认值。
公号:咻咻ing
2022/06/08
3.6K0
Neo4J性能优化指引
Elasticsearch运维指南
地址: https://www.elastic.co/guide/en/kibana/current/xpack-monitoring.html
雨夜v1
2021/06/17
3K0
Elasticsearch运维指南
开源搜索引擎排名第一,Elasticearch是如何做到的?
随着移动互联网、物联网、云计算等信息技术蓬勃发展,数据量呈爆炸式增长。如今我们可以轻易得从海量数据里找到想要的信息,其中离不开搜索引擎技术的帮助。特别是其中的索引、检索和排序机制,我们无需深入了解背后复杂的信息检索原理,即可实现基本的全文检索功能。数据量达到十亿,百亿规模仍然可以秒级返回检索结果。对于系统容灾、数据安全性、可扩展性、可维护性等我们关注的实际问题,在开源搜索引擎领域排名第一的Elasticsearch里均能得到有效解决。
腾讯云大数据
2021/01/07
1.4K0
开源搜索引擎排名第一,Elasticearch是如何做到的?
【搜索引擎】Solr:提高批量索引的性能
几个月前,我致力于提高“完整”索引器的性能。我觉得这种改进足以分享这个故事。完整索引器是 Box 从头开始创建搜索索引的过程,从 hbase 表中读取我们所有的文档并将文档插入到 Solr 索引中。
架构师研究会
2022/05/30
6760
【搜索引擎】Solr:提高批量索引的性能
Elasticsearch集群规划及节点角色规划醉佳实践
Elasticsearch 和 Lucene 都是 Java 语言编写,这意味着我们必须注意堆内存的设置。
全栈程序员站长
2022/08/19
1.1K0
如何监控Elasticsearch
Elasticsearch是一个开源的分布式文档存储和搜索引擎,可以近乎实时地存储和检索数据结构,它很大程度上依赖于Apache Lucence--一个用Java编写的全文搜索引擎。
大蟒传奇
2018/07/31
1.6K0
如何监控Elasticsearch
Elasticsearch 生产环境集群部署最佳实践
在生产环境搭建或维护 Elasticsearch 集群和个人搭建集群的小打小闹有非常大的不同。
铭毅天下
2021/03/22
2.9K0
Elasticsearch 生产环境集群部署最佳实践
干货 | 吃透Elasticsearch 堆内存
1、什么是堆内存? Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。 在 Java 中,堆被划分成两个不同的区域: 新生代 ( Young )、 老年代 ( Old )。 新生代 ( Young ) 又被划分为三个区域 Eden、 From Survivor、 To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 2、堆内存的作用是什么? 在虚拟机启动时创建。 堆内存的唯一目的就是创建对象实例,所有的对象实例
铭毅天下
2018/04/24
3K0
不要将数据库中的“分库分表”理论盲目应用到 Elasticsearch
近期在优化索引时,我遇到了一些挑战。我们的环境是7节点16*32G的机器,我在尝试内存优化。当前的文档总量为5亿,然而mapping设计和shard设计都出现了问题。每个节点上有480个shard,这是一个相当离谱的数量。
铭毅天下
2023/08/18
3530
不要将数据库中的“分库分表”理论盲目应用到 Elasticsearch
干货 | Elasticsearch Top10 监控指标
Elasticsearch具有通用性,可扩展性和实用性的特点,集群的基础架构必须满足如上特性。合理的集群架构能支撑其数据存储及并发响应需求。相反,不合理的集群基础架构和错误配置可能导致集群性能下降、集群无法响应甚至集群崩溃。
铭毅天下
2019/05/16
6.8K0
干货 | Elasticsearch Top10 监控指标
Hi,Java工程师:关于全文搜索引擎,这篇文章不得不看!
最近项目组安排了一个任务,项目中用到了基于 Solr 的全文搜索,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步。
用户1093975
2019/01/23
1.8K0
Hi,Java工程师:关于全文搜索引擎,这篇文章不得不看!
热门通讯软件Discord万亿级消息存储架构
Discord 在创建之初采用的是一个单副本集的 MongoDB,没有使用 MongoDB 的分片,他们给出的理由是当时 MongoDB 分片很难用,而且不够稳定(这里就不去深究了)。消息数到达一亿条时,RAM 里已经存不下这么数据和索引,MongoDB 的延时开始变得不可控。
腾讯技术工程官方号
2023/10/23
8900
热门通讯软件Discord万亿级消息存储架构
搜索引擎solr和elasticsearch
搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。
全栈程序员站长
2021/04/07
7730
Elasticsearch索引、搜索流程及集群选举细节整理
最近在做搜索推荐相关的优化,在对elasticsearch进行优化时查阅了比较多的资料,现在对其中的一部分进行整理和翻译,做一个记录。主要分为三个部分:
山行AI
2021/08/18
1.8K0
推荐阅读
相关推荐
【搜索引擎】配置 Solr 以获得最佳性能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档