首页 > 其他分享 >ElasticSearch的优化

ElasticSearch的优化

时间:2024-07-30 20:50:43浏览次数:16  
标签:RAID 索引 ElasticSearch 分片 磁盘 优化 节点 ES

1、硬件选择

Elasticsearch 的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体存储的路径可在 ES 的配置文件../config/elasticsearch.yml 中配置,如下:
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /path/to/data
#
# Path to log files:
#
#path.logs: /path/to/logs
磁盘在现代服务器上通常都是瓶颈。Elasticsearch 重度使用磁盘,你的磁盘能处理的吞吐量越大,你的节点就越稳定。这里有一些优化ES I/O 的技巧:
  • 使用 SSD(固态硬盘)。就像其他地方提过的, 他们比机械磁盘优秀多了。
  • 使用 RAID 0。条带化 RAID 会提高磁盘 I/O,代价显然就是当一块硬盘故障时整个就故障了。不要使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能。
    • RAID全称是独立磁盘冗余阵列(Redundant Array of Independent Disks),基本思想是把多个磁盘组合起来,组合一个磁盘阵列组,使得性能大幅提高。RAID可以充分发挥出多块硬盘的优势,可以提升硬盘速度,增大容量,提供容错功能够确保数据安全性。最常用的四种RAID为 RAID 0、RAID 1、RAID 5、RAID 10,
    • RAID0称为条带化存储,将数据分段存储在各个磁盘中,读写均可以并行处理,因此读写速率为单个磁盘的N倍,没有冗余功能,任何一个磁盘的损坏就会导致的数据不可用。
    • 参考:https://www.cnblogs.com/Chary/p/17942784
  • 另外,使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上面。
  • 不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰的。

 

2、合理设置分片数

分片和副本的设计为 ES 提供了支持分布式和故障转移的特性,但并不意味着分片和副本是可以无限分配的。而且于索引的路由机制,在索引创建之后就无法再改变分片的数量。

分片数不能设置太大,分片对资源是有消耗的:

  • 一个分片的底层即为一个 Lucene 索引,会消耗一定文件句柄、内存、以及 CPU 运转。
  • 每一个搜索请求都需要命中索引中的每一个分片,如果每一个分片都处于不同的节点还好,但如果多个分片都需要在同一个节点上竞争使用相同的资源就有些糟糕了。
  • 用于计算相关度的词项统计信息是基于分片的。如果有许多分片,每一个都只有很少的数据会导致很低的相关度。

一个业务索引具体需要分配多少分片可能需要架构师和技术人员对业务的增长有个预先的判断,横向扩展应当分阶段进行。为下一阶段准备好足够的资源。一般来说,分片数设置遵循以下原则:

  • 控制每个分片占用的硬盘容量不超过 ES 的最大 JVM 的堆空间设置(一般设置不超过 32G,参考下文的 JVM 设置原则),因此,如果索引的总容量在 500G 左右,那分片大小在 16 个左右即可;当然,最好同时考虑原则 2。
  • 考虑一下 node(节点) 数量,一般一个节点有时候就是一台物理机,如果分片数过多,大大超过了节点数,很可能会导致一个节点上存在多个分片,一旦该节点故障,即使保持了 1 个以上的副本,同样有可能会导致数据丢失,集群无法恢复。所以 一般都设置分片数不超过节点数的 3 倍。
  • 主分片,副本和节点最大数之间数量,我们分配的时候可以参考以下关系:节点数<=主分片数*(副本数+1)

 

3、推迟分片分配

对于节点瞬时中断的问题,默认情况,集群会等待一分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。这样就可以减少 ES 在自动再平衡可用分片时所带来的极大开销。

通过修改参数 delayed_timeout ,可以延长再均衡的时间,可以全局设置,也可以在索引级别进行修改。如下配置某个索引的推迟分配时间:

PUT /_all/_settings 
{
   "settings": {
       "index.unassigned.node_left.delayed_timeout": "5m" 
   }
}

 

4、带 routing(文档 _id)查询

Elasticsearch 是通过以下公式知道一个文档存放在哪个分片中的:(具体解释参考:https://www.cnblogs.com/wenxuehai/p/18141760#_label4_0

shard = hash(routing) % number_of_primary_shards

当不带 routing 查询时,因为不知道要查询的数据具体在哪个分片上,所以会先计算出该数据存储在哪个节点上,然后再将请求分发到具体节点。但当你带 routing 查询时,即指定了文档存储的分片,通过这种方式,ES 只会在相关的分片上执行查询,从而能提高查询效率。

 

标签:RAID,索引,ElasticSearch,分片,磁盘,优化,节点,ES
From: https://www.cnblogs.com/wenxuehai/p/18333338

相关文章

  • 深度模型中的优化 - 优化策略和元算法篇
    序言在人工智能与机器学习的快速发展中,深度模型作为核心技术之一,其优化问题至关重要。深度模型通过构建多层神经网络来模拟人脑的学习与推理过程,处理复杂数据模式与任务。然而,这些强大能力的背后,离不开高效的优化策略与元算法的支撑。优化旨在通过调整模型参数,最小化预设的......
  • ofd轻阅读超大文件优化方案
    本人使用Typescript开发了一款ofd阅读器,参见文章《ofd轻阅读》。web端实现阅读功能有两种方案: ofd转svg;使用h5canvas。两种方案各有优劣,本人采用了canvas方案,劣势:开发难点较大,需要处理更多的细节(比如:文字选中)。优势:对细节掌控能力更强,能满足用户更苛刻的需求。打开超大文件......
  • Jmeter+Ant生成优化HTML的接口测试报告
    为什么要这么做?在实际测试场景遇到这样一种情况,开发重构了接口实现逻辑,该接口主要用于查询操作,接口的入参有上千种可能,查询出来的内容很多,需要与原来接口比对,检查是否一致那此时,单纯用jmeter跑一遍的话,很难直观的看到测试之后的结果,所以就需要这样一种报告来展示,供开发修改在这......
  • elasticsearch单机版—安装详细教程
    一、ES介绍 Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene™基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:(1).分布式实时文件存储,并将每一个字段都编入索引,使......
  • HTTP/1.1 优化
    避免发送HTTP请求对于一些具有重复性的HTTP请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,通过缓存技术减少请求次数。客户端会把第一次请求以及响应的数据保存在本地磁盘上,其中将请求的URL作为key,而响应作为value,两者形成映射关系......
  • 前端实现【 批量任务调度管理器 】demo优化
    一、前提介绍我在前文实现过一个【批量任务调度管理器】的demo,能实现简单的任务批量并发分组,过滤等操作。但是还有很多优化空间,所以查找一些优化的库,主要想优化两个方面,上篇提到的:针对3,其实可以自己手写一个,也可以依靠如什么来实现。针对2,最难的是根据【当前系统负......
  • 回归预测|基于灰狼优化BP神经网络的多特征输入单输出的数据回归预测Matlab程序GWO-BP
    文章目录一.灰狼优化BP神经网络基本原理二.灰狼优化BP神经网络Matlab程序2.1实验结果2.2Matlab程序一.灰狼优化BP神经网络基本原理灰狼优化(GreyWolfOptimization,GWO)结合BP神经网络进行数据回归预测是一种结合了优化算法和神经网络的方法,适用于多......
  • 优化 GitHub 体验的浏览器插件「GitHub 热点速览」
    上周,GitHub有个“安全问题”——CFOR(CrossForkObjectReference)冲上了热搜,该问题的表现是:远程仓库的提交内容任何人可以访问,即使已被删除。只需要拿到commitID+源/Fork的项目地址,任何人都能访问之前提交到远程仓库的内容。下面有3个演示,可以复现该问题:演示一:Fork项目......
  • 如何进行PHP性能优化?
    PHP性能优化是一个复杂且多方面的过程,涉及从代码层面到服务器配置的多个方面。以下是一些关键的优化技巧和最佳实践:选择合适的数据结构(如数组、对象等)可以显著提高程序的运行效率。缓存是提升PHP性能的有效手段之一。可以通过页面缓存、数据缓存、内存缓存等方式来减少重复计......
  • 提高 z3 优化问题的求解器速度
    我正在尝试使用Z3(Python)解决包含线性整数模理论的SMT问题。该问题类似于Knuth的可满足性书第14f页上的“学习布尔函数”示例。我的问题有一组布尔值公式(数百个),每个公式包含要求解的同一组未知整数和布尔变量(数十个),优化目标是最大化真实公式的数量作为这些公式的函数未......