`
qindongliang1922
  • 浏览: 2184475 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117546
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125936
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59929
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71305
社区版块
存档分类
最新评论

Elasticsearch里面的segment合并

    博客分类:
  • ELK
阅读更多



通过前面的文章,我们已经知道在elasticsearch中每个shard每隔1秒都会refresh一次,每次refresh都会生成一个新的segment,按照这个速度过不了多久segment的数量就会爆炸,所以存在太多的segment是一个大问题,因为每一个segment都会占用文件句柄,内存资源,cpu资源,更加重要的是每一个搜索请求都必须访问每一个segment,这就意味着存在的segment越多,搜索请求就会变的更慢。


那么elaticsearch是如何解决这个问题呢? 实际上elasticsearch有一个后台进程专门负责segment的合并,它会把小segments合并成更大的segments,然后反复这样。在合并segments的时候标记删除的document不会被合并到新的更大的segment里面,所有的过程都不需要我们干涉,es会自动在索引和搜索的过程中完成,合并的segment可以是磁盘上已经commit过的索引,也可以在内存中还未commit的segment:

(1)在索引时refresh进程每秒会创建一个新的segment并且打开它使得搜索可见

(2)merge进程会在后台选择一些小体积的segments,然后将其合并成一个更大的segment,这个过程不会打断当前的索引和搜索功能。





(3)一旦merge完成,旧的segments就会被删除,流程如下:
````
3.1 新的segment会被flush到磁盘

3.2 然后会生成新的commit point文件,包含新的segment名称,并排除掉旧的segment和那些被合并过的小的segment

3.3 接着新的segment会被打开用于搜索

3.4 最后旧的segment会被删除掉
````





至此原来标记伪删除的document都会被清理掉,如果不加控制,合并一个大的segment会消耗比较多的io和cpu资源,同时也会搜索性能造成影响,所以默认情况下es已经对合并线程做了资源限额以便于它不会搜索性能造成太大影响。

api如下:
````
PUT /_cluster/settings
{
    "persistent" : {
        "indices.store.throttle.max_bytes_per_sec" : "100mb"
    }
}
````
或者不限制:
````
PUT /_cluster/settings
{
    "transient" : {
        "indices.store.throttle.type" : "none" 
    }
}
````




es的api也提供了我们外部发送命令来强制合并segment,这个命令就是optimize,它可以强制一个shard合并成指定数量的segment,这个参数是:max_num_segments ,一个索引它的segment数量越少,它的搜索性能就越高,通常会optimize成一个segment。需要注意的是optimize命令不要用在一个频繁更新的索引上面,针对频繁更新的索引es默认的合并进程就是最优的策略,optimize命令通常用在一个静态索引上,也就是说这份索引没有写入操作只有查询操作的时候是非常适合用optimize来优化的,比如说我们的一些日志索引,基本都是按天,周,或者月来索引的,只要过了今天,这周或这个月就基本没有写入操作了,这个时候我们就可以通过optimize命令,来强制合并每个shard上索引只有一个segment,这样查询性能就能大大提升,api如下:
````
POST /logstash-2014-10/_optimize?max_num_segments=1 
````


注意,由外部发送的optimize命令是没有限制资源的,也就是你系统有多少IO资源就会使用多少IO资源,这样可能导致某一段时间内搜索没有任何响应,所以如果你计划要optimize一个超大的索引,你应该使用shard allocation功能将这份索引给移动到一个指定的node机器上,以确保合并操作不会影响其他的业务或者es本身的性能。

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
0
0
分享到:
评论

相关推荐

    Elasticsearch 存储方式和管理优化细节1

    在Elasticsearch中,数据存储的基本单位是段(segment),每个段都是一个倒排索引,由Lucene生成。每次数据写入后,Elasticsearch会将数据缓冲到内存中的buffer,并同时记录在translog日志中。数据写入后,经过一定...

    Elasticsearch.docx

    查询优化策略包括使用routing加速特定维度数据的查询,限制搜索结果集大小,增加node query cache以缓解heap压力,合理分配shard备份以平衡查询并发,以及通过合并segment来减少碎片。另外,unique constraint如_id...

    ElasticSearch写入原理及优化.docx

    Elasticsearch(ES)是一种流行的分布式搜索引擎和分析引擎,它以高效、实时的特性而闻名。本文主要探讨了Elasticsearch的写入、读取、检索数据的底层原理以及性能调优策略。 **Elasticsearch 写入数据流程** 1. ...

    Elasticsearch 28道面试题和答案.docx

    Elasticsearch 是一个分布式、开源的全文检索引擎,广泛用于实时数据分析和大规模搜索应用。以下是一些关于 Elasticsearch 的关键知识点,基于提供的面试题和答案: 1. **节点分片策略**:遵循官方建议,一个节点...

    Elasticsearch-深入理解索引原理1

    在深入理解Elasticsearch(简称ES)的索引原理前,我们需要先明白基本概念。ES是一种分布式全文搜索引擎,它将数据存储在索引中,这些索引类似于关系型数据库中的数据库,但具备更高的可扩展性和实时性。索引可以...

    ES主分片和副本数据大小不一样的情况

    在Elasticsearch (ES) 中,主分片和副本分片的数据大小可能不一致,这主要是由于它们内部的segment数量和结构差异所引起的。在理解这个问题之前,我们需要先了解一下ES的基本概念。 Elasticsearch 是一个分布式、...

    把多次用nutch_crawl获得的所有目录合并在一起

    Nutch将爬取的网页存储在名为“segment”的文件夹中,每个segment包含一批网页的数据。`nutch mergesegs`命令用于将不同爬取任务的segments合并到新的segments目录下,保证所有网页数据都在同一目录下。 4. **更新...

    es5.0高手进阶篇

    - **Segment merging**: 分段合并策略被优化,降低了磁盘空间的占用并提高了索引性能。 ##### 2. 更强的安全性 - **X-Pack**: X-Pack在5.0版本中被集成进来,提供了安全认证、监控等功能。 - **SSL/TLS support**:...

    面试指南-Lucene:ES篇.md

    - **段管理**:Elasticsearch使用段(segment)的概念来管理索引,每个段都是一个完整的倒排索引。 - **缓存机制**:通过内存缓冲区(Buffer)暂存新写入的数据,定期刷新到磁盘。 - **刷新机制**:通过调整`refresh_...

    4-8+Druid原理及产险实践.pdf

    Elasticsearch则擅长全文检索和实时分析,提供完整的ELK(Elasticsearch、Logstash、Kibana)技术栈,但在处理高基数维度和大规模数据时,性能可能会下降。 SQL on Hadoop技术,如Hive和Presto,利用MPP(大规模...

    druid的使用

    在与其他技术的竞品分析中,Druid与ES(ElasticSearch)、KVStore(如Hbase、Cassandra、OpenTSDB)以及SQL on Hadoop(如Impala/Drill/Spark/Presto)等数据处理技术相比,有其独特的优缺点。例如,与ES相比,Druid...

    Druid平台的原理及实践.docx

    Elasticsearch则因其全文搜索引擎和分析能力而知名,但数据量扩展性和对原始数据的保存不足,导致其在某些场景下不如Druid适合。最终,Druid因其优秀的实时分析性能、扩展性和容错性(通过Broker、Realtime和...

    lucene基础资料

    对于大规模数据,可以利用Solr或Elasticsearch这样的分布式搜索平台,它们基于Lucene构建,提供了集群部署、负载均衡和自动故障恢复等功能。 ### 八、优化与合并段 为了提高搜索性能,Lucene会定期进行段合并...

    最热门的Java 分布式面试题汇总

    26. Segment合并:定期合并小Segment为大Segment,减少I/O操作。 27. Elasticsearch优化:索引分片优化、JVM调优、硬件选择等。 28. HBase Region切分:根据Region大小和负载自动切分,保持负载均衡。 29. 读写...

    汇编-第3课.pdf

    在Windows操作系统中,由于采用保护模式,4个段(CS, SS, DS, ES)被合并在一个线性地址空间中,不再像DOS那样严格区分。 4. **处理器指令执行流程**: - **1. 取指令**:从内存中取出下一条待执行的指令。 - **...

    微机原理、汇编与接口技术(朱定华 编著)第三章习题参考答案四

    **题目要求:**编写程序将两个已排序的数组中的元素合并,并确保合并后的数组也是有序的且无重复元素。 **解答分析:** 此题要求学生掌握如何处理两个已排序数组的合并操作,并且需要考虑如何避免重复元素。这个...

Global site tag (gtag.js) - Google Analytics