首页 > 系统相关 >Elasticsearch 学习-Elasticsearch优化,硬件选择,分片策略,写入优化,内存设置,重要配置

Elasticsearch 学习-Elasticsearch优化,硬件选择,分片策略,写入优化,内存设置,重要配置

时间:2023-04-02 15:25:38浏览次数:46  
标签:Lucene 索引 Elasticsearch 内存 分片 优化 节点 ES

Elasticsearch 学习-Elasticsearch 优化,硬件选择,分片策略,写入优化,内存设置,重要配置

6.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 重度使用磁盘,你的磁盘能处理的吞吐量越大,你的节点就越稳定。这里有一些优化磁盘 I/O 的技巧:

 使用 SSD。就像其他地方提过的, 他们比机械磁盘优秀多了。
 使用 RAID 0。条带化 RAID 会提高磁盘 I/O,代价显然就是当一块硬盘故障时整个就故障了。不要
使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能。
 另外,使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上
面。
 不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰
的。

6.2 分片策略

6.2.1 合理设置分片数

​ 分片和副本的设计为 ES 提供了支持分布式和故障转移的特性,但并不意味着分片和副本是可以无限分配的。而且索引的分片完成分配后由于索引的路由机制,我们是不能重新修改分片数的。

​ 可能有人会说,我不知道这个索引将来会变得多大,并且过后我也不能更改索引的大小,所以为了保险起见,还是给它设为 1000 个分片吧。但是需要知道的是,一个分片并不是没有代价的。需要了解:

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

一个业务索引具体需要分配多少分片可能需要架构师和技术人员对业务的增长有个预先的判断,横向扩展应当分阶段进行。为下一阶段准备好足够的资源。 只有当你进入到下一个阶段,你才有时间思考需要作出哪些改变来达到这个阶段。一般来说,我们遵循一些原则:

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

6.2.2 推迟分片分配

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

​ 通过修改参数 delayed_timeout ,可以延长再均衡的时间,可以全局设置也可以在索引

级别进行修改:

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

6.3 路由选择

当我们查询文档的时候,Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?它

其实是通过下面这个公式来计算出来:

shard = hash(routing) % number_of_primary_shards

routing 默认值是文档的 id,也可以采用自定义值,比如用户 id。

6.4 写入速度优化

​ ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实际使用时,我们需要根据公司要求,进行偏向性的优化。

​ 针对于搜索性能要求不高,但是对写入要求较高的场景,我们需要尽可能的选择恰当写优化策略。综合来说,可以考虑以下几个方面来提升写索引的性能:

 加大 Translog Flush ,目的是降低 Iops、Writeblock。
 增加 Index Refresh 间隔,目的是减少 Segment Merge 的次数。
 调整 Bulk 线程池和队列。
 优化节点间的任务分布。
 优化 Lucene 层的索引建立,目的是降低 CPU 及 IO。

6.4.1 批量数据提交

​ ES 提供了 Bulk API 支持批量操作,当我们有大量的写任务时,可以使用 Bulk 来进行批量写入。

​ 通用的策略如下:Bulk 默认设置批量提交的数据量不能超过 100M。数据条数一般是根据文档的大小和服务器性能而定的,但是单次批处理的数据大小应从 5MB~15MB 逐渐增加,当性能没有提升时,把这个数据量作为最大值。

6.4.2 优化存储设备

ES 是一种密集使用磁盘的应用,在段合并的时候会频繁操作磁盘,所以对磁盘要求较高,当磁盘速度提升之后,集群的整体性能会大幅度提高

6.4.3 合理使用合并

​ Lucene 以段的形式存储数据。当有新的数据写入索引时,Lucene 就会自动创建一个新的段。

​ 随着数据量的变化,段的数量会越来越多,消耗的多文件句柄数及 CPU 就越多,查询效率就会下降。

​ 由于 Lucene 段合并的计算量庞大,会消耗大量的 I/O,所以 ES 默认采用较保守的策略,让后台定期进行段合并

6.4.4 减少 Refresh 的次数

​ Lucene 在新增数据时,采用了延迟写入的策略,默认情况下索引的 refresh_interval 为1 秒。

​ Lucene 将待写入的数据先写到内存中,超过 1 秒(默认)时就会触发一次 Refresh,然后 Refresh 会把内存中的的数据刷新到操作系统的文件缓存系统中。

​ 如果我们对搜索的实效性要求不高,可以将 Refresh 周期延长,例如 30 秒。

​ 这样还可以有效地减少段刷新次数,但这同时意味着需要消耗更多的 Heap 内存。

6.4.5 加大 Flush 设置

Flush 的主要目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到512MB 或者 30 分钟时,会触发一次 Flush。

index.translog.flush_threshold_size 参数的默认值是 512MB,我们进行修改。

增加参数值意味着文件缓存系统中可能需要存储更多的数据,所以我们需要为操作系统的文件缓存系统留下足够的空间。

6.4.6 减少副本的数量

ES 为了保证集群的可用性,提供了 Replicas(副本)支持,然而每个副本也会执行分析、索引及可能的合并过程,所以 Replicas 的数量会严重影响写索引的效率。

当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越

慢。

如 果 我 们 需 要 大 批 量 进 行 写 入 操 作 , 可 以 先 禁 止 Replica 复 制 , 设 置index.number_of_replicas: 0 关闭副本。在写入完成后,Replica 修改回正常的状态。

6.5 内存设置

​ ES 默认安装后设置的内存是 1GB,对于任何一个现实业务来说,这个设置都太小了。

如果是通过解压安装的 ES,则在 ES 安装文件中包含一个 jvm.option 文件,添加如下命

令来设置 ES 的堆大小,Xms 表示堆的初始大小,Xmx 表示可分配的最大内存,都是 1GB。

​ 确保 Xmx 和 Xms 的大小是相同的,其目的是为了能够在 Java 垃圾回收机制清理完

堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。

​ 假设你有一个 64G 内存的机器,按照正常思维思考,你可能会认为把 64G 内存都给

ES 比较好,但现实是这样吗, 越大越好?虽然内存对 ES 来说是非常重要的,但是答案

是否定的!

因为 ES 堆内存的分配需要满足以下两个原则:

 不要超过物理内存的 50%:Lucene 的设计目的是把底层 OS 里的数据缓存到内存中。
Lucene 的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系
统也会把这些段文件缓存起来,以便更快的访问。
如果我们设置的堆内存过大,Lucene 可用的内存将会减少,就会严重影响降低 Lucene 的全文本查
询性能。
 堆内存的大小最好不要超过 32GB:在 Java 中,所有对象都分配在堆上,然后有一个 Klass Pointer 指
针指向它的类元数据。
这个指针在 64 位的操作系统上为 64 位,64 位的操作系统可以使用更多的内存(2^64)。在 32 位
的系统上为 32 位,32 位的操作系统的最大寻址空间为 4GB(2^32)。
但是 64 位的指针意味着更大的浪费,因为你的指针本身大了。浪费内存不算,更糟糕的是,更大的
指针在主内存和缓存器(例如 LLC, L1 等)之间移动数据的时候,会占用更多的带宽。

最终我们都会采用 31 G 设置

-Xms 31g

-Xmx 31g

假设你有个机器有 128 GB 的内存,你可以创建两个节点,每个节点内存分配不超过 32 GB。 也就是说

不超过 64 GB 内存给 ES 的堆内存,剩下的超过 64 GB 的内存给 Lucene

6.6 重要配置

标签:Lucene,索引,Elasticsearch,内存,分片,优化,节点,ES
From: https://www.cnblogs.com/atao-BigData/p/17280520.html

相关文章

  • Elasticsearch 学习- 分片原理,倒排索引,文档搜索,文档分析,内置分析器,指定分词器,IK分词器
    Elasticsearch学习-分片原理4.6分片原理​ 分片是Elasticsearch最小的工作单元。但是究竟什么是一个分片,它是如何工作的?​ 传统的数据库每个字段存储单个值,但这对全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值的能力。最好的支......
  • Elasticsearch 学习-Elasticsearch进阶-索引,文档,字段,映射,分片,副本,分配,系统架构,分片控
    Elasticsearch学习-Elasticsearch进阶4.1核心概念4.1.1索引(Index)​ 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个......
  • Elasticsearch 学习-Linux单机和集群安装
    Elasticsearch学习-Linux单机和集群安装3.3linux集群安装3.3.1软件下载软件下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-03.3.2软件安装1)解压软件将下载的软件解压缩#解压缩tar-zxvfelasticsearch-7.8.0-linux-x86_64.tar......
  • 开发一个二方包,优雅地为系统接入ELK(elasticsearch+logstash+kibana)
    去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入各个自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易。这篇文章主要介绍如何编写二方包,并整合到各个系统中。先介绍整个ELK日志......
  • 外贸官方网站优化的核心要点与技巧
    作为一个从事外贸行业多年的业内人士,我深知优化官方网站在提升业务竞争力和吸引国际客户方面的重要性。在这篇文章中,我将分享一些关于外贸官方网站谷歌SEO优化的核心要点与技巧,帮助您更好地理解如何在Google搜索引擎中取得优势。首先,链接建设是谷歌SEO优化的关键一环。GPB外链作为......
  • 3.优化器模式的选择
    1优化器的模式1.1.RULE模式  Oracle将使用RBO来解析目标SQL,统计信息将失去作用1.2.CHOOSE模式  Oracle9i中OPTIMIZER_MODE的默认值,表示Oracle在解析目标SQL到底使用RBO还是CBO,如果该SQL涉及的表存在统计信息,Oracle解析SQL就会使用CBO,如果所有表对象没有统计信息,用RBO......
  • 2.基于成本的优化器
    1.集的势   定义:是指指定集合所包含的记录数,即是结果集的行数,cardinality表示对目标SQL的某个具体执行步骤的执行结果所包含的记录数的估算。如果是针对整个SQL,此时cardinality是指SQL最终结果所包含记录行数2.可选择率   定义:是指施加指定谓词条件后返回结果集的......
  • 1.基于规则的优化器
    1.创建测试环境--建表createtableemp_tempasselect*fromemp;createindexidx_mgr_temponemp_temp(mgr);createindexidx_deptno_temponemp_temp(deptno);--查询数据库select*fromemp_tempwheremgr>100anddeptno>10;EMPNOENAMEJOB ......
  • 通过 OG 标签优化网站在社交媒体上的显示效果
    介绍OG标签是OpenGraphProtocol的缩写,是一种由Facebook所定义和推广的元数据协议,用于在社交媒体上显示网页的预览内容。OG标签允许网站管理员控制他们网站页面在Facebook、Twitter、LinkedIn等社交媒体上的展示形式,可以设置网页的标题、描述、图像、URL等元素......
  • mycat写库分片
    之前的读写分离(一主一从)https://www.cnblogs.com/zwh0910/p/17267627.html架构如下:从该系统架构中,可以看出:(1)、数据库从之前的单节点变为多节点提供服务(2)、主节点数据,同步到从节点数据(3)、应用程序需要连接到2个数据库节点,并且在程序内部实现判断读写操作但是上面的架构存在......