【搜索引擎】提高Apache Solr 性能

news2024/11/19 2:41:10

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

语境


在过去的 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。最初,您的磁盘空间将至少占用以下空间:

3c1c3bf52990e290a7ef1a598c9c476f.png

分片


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


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


索引/更新过程


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

Zookeeper


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


我们有足够的内存吗?


理论


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


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


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

f2d6ebc4e45e1668047919021751a0c3.png

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


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


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

87b646bd8087b6f7670eb1370639fb49.png

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

9c3c8e8c97d1a50006051f34616976c9.png

缓存证据


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

  • queryResultCache 的命中率为 0.01

  • filterCache 的命中率为 0.43

  • documentCache 的命中率为 0.01

垃圾收集器和堆


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

608382354b0b7dc79508f873665f11d4.png

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


磁盘活动 — AWS IOPS

91264c0396d93a0ae1ba1b4500197064.png

开始解决问题


搜索结果容错


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

  • NRT 副本:在 SolrCloud 中处理复制的旧方法。

  • TLOG replicas:它使用事务日志和二进制复制。

  • PULL 副本:仅从领导者复制并使用二进制复制。

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


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


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


调整 Solr 内存


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

4135c5fe6a7f04fa8ae3237b748c327a.png

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


缓存结果


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

4f7e63806fb804e5afefda0faebcf492.png

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

  • queryResultCache 的命中率为 0.01

  • filterCache 的命中率为 0.99

  • documentCache 的命中率为 0.02

垃圾收集器结果


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

1347b58347c60413e194ca86a1d81ecf.png

磁盘活动结果


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

8ef47694b822a9461d042548d67de35a.png

外部服务结果


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

df12d42b08e4567a4450e44a05c72db6.png

调整 Solr 集群


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


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


结论


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

本文 :https://architect.pub/improving-solr-performance
讨论:知识星球【首席架构师圈】或者加微信小号【ca_cto】或者加QQ群【792862318】
公众号
 
【jiagoushipro】
【超级架构师】
精彩图文详解架构方法论,架构实践,技术原理,技术趋势。
我们在等你,赶快扫描关注吧。
微信小号
 
【ca_cea】
50000人社区,讨论:企业架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化.
 

QQ群
 
【285069459】深度交流企业架构,业务架构,应用架构,数据架构,技术架构,集成架构,安全架构。以及大数据,云计算,物联网,人工智能等各种新兴技术。
加QQ群,有珍贵的报告和干货资料分享。

视频号【超级架构师】
1分钟快速了解架构相关的基本概念,模型,方法,经验。
每天1分钟,架构心中熟。

知识星球【首席架构师圈】向大咖提问,近距离接触,或者获得私密资料分享。 

喜马拉雅【超级架构师】路上或者车上了解最新黑科技资讯,架构心得。【智能时刻,架构君和你聊黑科技】
知识星球认识更多朋友,职场和技术闲聊。知识星球【职场和技术】
领英Harryhttps://www.linkedin.com/in/architect-harry/
领英群组领英架构群组https://www.linkedin.com/groups/14209750/
微博‍‍【超级架构师】智能时刻‍
哔哩哔哩【超级架构师】

抖音【cea_cio】超级架构师

快手【cea_cio_cto】超级架构师

小红书【cea_csa_cto】超级架构师 

网站CIO(首席信息官)https://cio.ceo
网站CIO,CTO和CDOhttps://cioctocdo.com
网站架构师实战分享https://architect.pub   
网站程序员云开发分享https://pgmr.cloud
网站首席架构师社区https://jiagoushi.pro
网站应用开发和开发平台https://apaas.dev
网站开发信息网https://xinxi.dev
网站超级架构师https://jiagou.dev
网站企业技术培训https://peixun.dev
网站程序员宝典https://pgmr.pub    
网站开发者闲谈https://blog.developer.chat
网站CPO宝典https://cpo.work
网站首席安全官https://cso.pub    ‍
网站CIO酷https://cio.cool
网站CDO信息https://cdo.fyi
网站CXO信息https://cxo.pub

谢谢大家关注,转发,点赞和点在看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【docker】它们之间如何通信和阻止,以及容器的基本概念

此篇文章主要是简单讲解,docker之间的通信方式以及和如何阻止docker之间的通信 目录 1、如何docker通信1.1、网络连接1.2、链接(Linking)1.3、共享数据卷(Shared Volumes)1.4、服务发现和负载均衡 2、阻止docker通信2.…

微信公众号搭建内网穿透骨灰级教程

微信公众号是我们日常使用的小工具,很多企业都会去申请微信公众号,但为了及时获取推送消息,需要开发者自己去调用微信公共号接口进行功能扩展和对接, 接下来演示如何使用神卓互联内网穿透服务来生成公网访问地址,以便…

【运维工程师学习五】数据库之MariaDB

【运维工程师学习五】数据库 1、常用的关系型数据库2、C/S结构3、MariaDB图形客户端4、安装MariaDB5、启动MariaDB及验证启动是否成功6、验证启动——端口7、验证启动——进程8、MariaDB配置文件路径主配置文件解读: 9、MariaDB的配置选项10、MariaDB客户端连接1、在…

MWeb Pro for Mac(苹果电脑最好用的Markdown编辑器)安装教程

MWeb Pro是一款专业的Mac平台上的Markdown编辑器,可以帮助用户更加高效地书写和排版文本内容,支持多种文本格式的导入和导出,如HTML、RTF、PDF等,还支持实时预览和代码高亮等功能,为用户提供了非常优秀的Markdown编辑体…

02LINGO基本操作

某公司新购置了某种设备 6 台,欲分配给下属的4 个企业,已知各企业获得这种设备后年创利润如表 1.1 所示,单位为千万元。问应如何分配这些设备能使年创总利润最大,最大利润是多少? 甲乙丙丁1423426455376764788657986671086 甲公…

【Java进阶之路】LinkedList源码分析

概述 LinkedList也是我们经常使用的集合,本文就LinkedList的几个主要方法展开介绍,并结合几个图片来介绍几个重要操作。 基础属性 transient int size 0; //节点数量/*** Pointer to first node.* Invariant: (first null && last null) |…

windows上安装Vmware及Linux系统

Linux系统的安装 一、windows上安装Vmware 第一步:复制VMware软件包到Windows系统中 第二步:双击VMware安装包,进行软件的安装 第三步:勾选软件的许可协议 第四步:设置VMware安装路径以及勾选增强型的键盘程序 第五步…

Three.js环境光,平行光,点光源,聚光灯的创建和灯光辅助线的使用

Three.js中的灯光API使用 1.环境光(AmbientLight)2.平行光(directionalLight)3.PointLight(点光源) 4.聚光灯(SpotLight)5.材质平面(PlaneGeometry)用于接收(平行光和聚…

【边缘计算】【第一章 什么是边缘计算】

边缘计算 序第一章 什么是边缘计算概念章鱼说应用场景数据单位转换边缘计算的前世今生CDN(Content Delivery Network)内容分发网络微云(Cloudlet)雾计算——雾是接近地面的云MEC边缘计算大事记 边缘计算核心技术概述1 网络技术2 隔…

explain 是干嘛的

explain 是干嘛的 1.explain的作用 在MySQL中,EXPLAIN是一个用于查询优化的关键字。它可以用于分析查询语句的执行计划,帮助开发人员和数据库管理员理解查询的执行方式、查询涉及的表和索引、连接类型、查询优化器的决策等信息。 通过使用EXPLAIN关键…

智慧团建登录或忘记密码刷不出验证码

问题如下: 忘记密码和登录时没有验证码 原因:智慧团建的服务器端只放行不带“www.”的域名,一般zf或者其他jg系统都会限制万维网的进入 解决办法: 删掉“www.”,然后重新回车访问或者直接点我下边的链接:…

PyTorch翻译官网教程6-AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRAD

官网链接 Automatic Differentiation with torch.autograd — PyTorch Tutorials 2.0.1cu117 documentation 使用TORCH.AUTOGRAD 自动微分 当训练神经网络时,最常用的算法是方向传播算法。在该算法中,根据损失函数与给定参数的梯度来调整模型参数&…

机器学习---定义、用途、算法的分类、假设空间与归纳偏好、奥卡姆剃刀原则

1. 机器学习的定义 基于历史经验的,描述和预测的理论、方法和算法。 从历史数据中,发现某些模式或规律(描述),利用发现的模式和规律进行预测。 2. 机器学习能做什么 机器学习已经有了十分广泛的应用,例…

pdf文件大小如何压缩?pdf文件怎么压缩得更小?

日常生活和工作中,经常用到图片,但是有时候需要将图片压缩指定大小来符合各种规定,比如图片压缩到200kb,那么有没有简单方便的图片压缩( https://www.yasuotu.com/imagesize)的方法呢?下面就拿压…

【测试开发】案例分析

目录 一. 模拟弱网 二. 接口测试 三. 对冒泡排序进行测试 四. 对于 Linux 命令进行测试 五. 微信发送朋友圈设计测试用例 六. 补充 一. 模拟弱网 模拟弱网环境可以借助 Fiddler 来进行; 1. 先要打开 Simulate Modem Speeds 选项; 2. 打开 Customize R…

一起学SF框架系列5.8-模块Beans-注解bean解析1-解析入口

前面跟踪了Spring框架如何解析xml模式配置的bean解析(参见“一起学SF框架系列5.7-模块Beans-BeanDefinition解析”),本文主要解析注解bean(详见“一起学SF框架系列5.2-模块Beans-bean的元数据配置”)是如何被Spring框架…

scripy其他

持久化 # 爬回来,解析完了,想存储,有两种方案 ## 方案一:一般不用 parse必须有return值,必须是列表套字典形式--->使用命令,可以保存到json格式中,csv中scrapy crawl cnblogs -o cnbogs.j…

IEEE WCCI-2020电动汽车路由问题进化计算竞赛的基准集

引言 交通一直是二氧化碳排放的主要贡献者。由于全球变暖、污染和气候变化,联邦快递、UPS、DHL和TNT等物流公司对环境变得更加敏感,他们正在投资于减少作为其日常运作的一部分而产生的二氧化碳排放的方法。毫无疑问,使用电动汽车(…

JavaWeb——Linux的常用命令

目录 一、Linux优点 二、Linux常用命令 1、ls (1)、语法 (2)、功能 (3)、常用选项 例: 2、pwd (1)、语法 (2)、功能 例: 3、cd (1&am…

Doc as Code (1):起源

作为技术传播从业者,你一定听说过Doc as Code,中文大家叫做文档代码化。 近年来,这个词在技术传播行业传开了。也许是在某个大会上,也许是在某篇文章中,再或者是在与同行的讨论群里,不管是从哪里&#xff…