热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch索引(写入)速度优化

1.缩减索引字段es中只保留必要字段,缩减字段能有效缩减文档大小,提高写入速度。2.合理设置分片数和副本数7.*默认1个分片1和副本。Elasti

1.缩减索引字段

es中只保留必要字段,缩减字段能有效缩减文档大小,提高写入速度。


2.合理设置分片数和副本数

7.*默认1个分片1和副本。Elasticsearch官方建议一个分片的大小应该在20到40 GB左右,分片个数建议 >= 集群节点的个数,但是当索引较小时(写入性能需求 > 搜索性能需求时),可以使用1个分片,过多的分片也会影响写入性能。

分片大小对于搜索查询非常重要。


  • 一方面, 如果分配给索引的分片太多,则Lucene分段会很小,从而导致开销增加。 当同时进行多个查询时,许多小分片也会降低查询吞吐量。
  • 另一方面,太大的分片会导致搜索性能下降和故障恢复时间更长。

在批量索引文档前可以将副本数设置为0,索引完成后恢复原来的值。

"number_of_replicas":1
"number_of_shards":1

3.索引刷新间隔refresh_interval

默认情况下refresh_interval为1s,数据写入1秒后就可以被搜索到,每次索引的refresh会产生一个新的Lucene段,Lucene段即为segment,segment在复合一定条件后,会自动合并,因此这会导致频繁的segment merge行为,如果不需要特别高的搜索实时性,应该降低索引refresh周期。-1:禁止刷新。在批量索引文档前可以将refresh_interval设置为-1,完成后修改为默认值。由于我的场景是每天都会全量同步,此处将refresh_interval设置为120s

"refresh_interval": "120s"

假如refresh_interval设置为-1,只是es中的定时任务不会执行。但是es会根据一个versionMap去强制做一次refresh操作,缓冲区满的时候也会触发refresh操作。每30秒有个定时器去检查shardIndexingBufferSize大小,最终调用updateShardBuffers方法去refresh


4.translog设置

随着translog文件越来越大时要考虑把内存中的数据刷新到磁盘中,这个过程称为flush。在默认设置下,translog的持久化策略为: request,每个请求 都“flush”,配置异步刷新,刷新时间120s。

"index.translog.durability": "async"
"index.translog.sync_interval": "120s"

5.线程池队列

当写入队列满时,es会拒绝接受索引事件,适当增加写入队列大小,默认为200。线程池大小官方不建议进行修改。

thread_pool.write.queue_size: 500

6.使用es自动生成的id

无更新操作时,尽量使用es自动生成的id,当你index一个document使用特定的id,ES需要去检查是否在同一个shard存在相同的ID的文档,这是一个相当昂贵的操作,并且随着文档数量的增加,花费呈指数增长。如果使用自动生成id,ES会跳过这个检查,使得Index速度更快。但是当需要更新操作时不适用。


7.Indexing 缓冲大小

在执行大量的索引操作时,indices.memory.index_buffer_size的默认 设置可能不够,这和可用堆内存、单节点上的shard数量相关,可以考虑适当增大该值,增大该值,减少segment,就会减少merge。默认大小为10% 48mb

indices.memory.index_buffer_size: 20%
indices.memory.min_index_buffer_size: 96mb

8.jvm.options

Xmx和Xms的大小默认为1g,可以适当增加该值。

-Xms2g
-Xmx2g

9.禁用swapping

在ES的官方文档上,要求Disabled Swapping。执行swapoff -a暂时禁用,机器重启后会恢复。要永久的关闭swapping,需要编辑/etc/fstab文件,将包含swap的行的注释掉。

参考文档:


  1. https://www.cnblogs.com/eviltuzki/p/8439036.html
  2. https://blog.csdn.net/wmj2004/article/details/80804411
  3. https://blog.csdn.net/u012133048/article/details/93408374?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
  4. https://blog.csdn.net/HaixWang/article/details/80846749?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
  5. https://www.cnblogs.com/MyOceansWeb/p/12653965.html
  6. https://blog.csdn.net/laoyang360/article/details/85109769
  7. https://blog.csdn.net/laoyang360/article/details/97695931
  8. 7.*官方文档

推荐阅读
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 本文介绍了如何通过维持两个堆来获取一个数据流中的中位数。通过使用最大堆和最小堆,分别保存数据流中较小的一半和较大的一半数值,可以保证两个堆的大小差距为1或0。如果数据流中的数量为奇数,则中位数为较大堆的最大值;如果数量为偶数,则中位数为较大堆的最大值和较小堆的最小值的平均值。可以使用优先队列来实现堆的功能。本文还提供了相应的Java代码实现。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • RingBuffer,或者说CircularBuffer,是一个长度固定的缓冲区,当从一端插入元素超过指定的最大长度时,缓冲区另一端的元素 ... [详细]
author-avatar
Ray依依
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有