es强制段合并实验

这篇具有很好参考价值的文章主要介绍了es强制段合并实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

es强制段合并实验 – 消失的夜丶

1. 问题

由于集群的磁盘空间限制,我们删除了超过10亿的数据,但是发现删除后,磁盘的可使用空间并有快速上升。原因在于es的删除文档并不是物理删除,只是标记为"删除状态"。当发生merge时,才会物理意义上的删除。

一个索引如果deleted状态的索引过多,会影响到查询的效率。根据这篇文章显示1,超过50%的文档被标记为deleted,会导致搜索性能下降约30%。

Because deleted documents remain in the index, they must still be decoded from the postings lists and then skipped during searching, so there is added search cost. To test how much, I ran a search performance test for varying queries using the 100 M document index with no deletions as the baseline, and the same index with 50% deleted documents (i.e., 150 M documents with 50M deleted). Both indices were single-segment. Here are the results:

Query QPS StdDev QPS with deletes StdDev with deletes % change
Int Range query 1.2 (5.1%) 0.6 (1.8%) 46%
Prefix query 5.7 (5.0%) 3.4 (2.3%) 41%
Wildcard 5.3 (4.4%) 3.2 (2.2%) 39%
And High+Low 91.1 (2.0%) 59.5 (2.1%) 34%
Med Phrase 36.2 (2.8%) 24.4 (1.3%) 32%
And High+Med 16.6 (1.5%) 11.2 (1.0%) 32%

……

The bad news is there is clearly a non-trivial performance cost to deleted documents, and this is something we can work to reduce over time (patches welcome!). The good news is the cost is typically quite a bit lower than the percentage deletes (50% in this test) because these documents are filtered out at a low level before any of the costly query matchers and scorers see them. The more costly queries (Phrase, Span) tend to see the lowest impact, which is also good because it is the slow queries that determine node capacity for most applications.

但是由于强制合并会导致集群负载过高,所以首先对一个小的索引做了测试。

2. 强制合并小索引

小索引占用如下

 
 
 

1

docs.count docs.deleted store.size

2

6176077350    417260277      1.4tb

1. 首先执行写入刷新

刷新写入,直至没有failed产生。

 
 
 

1

POST index_business_v1/_flush/synced

2. 关闭索引写入权限

 
 
 

1

PUT index_business_v1/_settings

2

{

3

  "index": {

4

    "blocks.write": true

5

  }

6

}

3. 执行强制合并

ES8.x可以加wait_for_completion=false不必阻塞响应,only_expunge_deletes=true表示只合并包含一定数量deleted的segment。这个一定数量是由index.merge.policy.expunge_deletes_allowed进行控制,默认是10.0,代表如果一个分片deleted/total超过10%,则会对该分片进行合并操作。

 
 
 

1

POST /index_business_v1/_forcemerge?only_expunge_deletes=true

4. 查看任务进度

 
 
 

1

GET _tasks?detailed=true&actions=*forcemerge&human

2

或者 POST _tasks/rZqBdGdSTGy2qdyZAtDD6Q:3358737

3

 

4

rZqBdGdSTGy2qdyZAtDD6Q:3604476

3. 更改合并方案

在启用only_expunge_deletes=true参数后,默认情况下,合并结果:

deleted减少了3亿,通过计算,实际腾出空间约70GB。所以默认情况下的,强制合并能大幅度降低磁盘占用率,deleted占比越高,降低的占用率幅度就越大。

但,由于生产环境的索引过大,需要进行拆分,所以在拆分之前,先把deleted文档尽可能的删除掉,通过设置参数,提高被删除的比率:

 
 
 

1

PUT base_domain/_settings

2

{

3

  "index.merge.policy.expunge_deletes_allowed": "5.0"

4

}
 
 
 

1

index    docs.count    docs.deleted   store.size

2

ip       12503736313   4207846666     40.2tb

通过计算:4207846666/(4207846666+12503736313)∗40≈10��,可得至少可以释放10TB数据。再加上标记deleted也需要耗费磁盘空间,所以估计最终可以释放12TB。

合并过程中,会经历一个反复的磁盘使用率升高->磁盘使用率降低的过程。本次测试中,40TB膨胀到44TB,然后开始下降。所以做合并时,需要根据索引情况预留一部分空间,不然会直接失败。

耗时约1.1天后,合并完成,磁盘使用由40TB降至22TB,释放了18TB空间。但是每个分片出现了一些比较大的segment,最大的达到了40GB。

4. 查看segment信息

1. 查看当前哪些索引在合并

 
 
 

1

GET /_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r
index segmentsCount segmentsMemory memoryTotal mergesCurrent mergesCurrentDocs storeSize p r
domain 22766 7.5gb 12.2gb 48 21343329 87.5tb 160 0
ip 14270 13.3gb 50.7gb 47 18168708 40.4tb 160 0
dns 2220 2.8gb 15.8gb 0 0 3.7tb 60 0

2. 查看某个索引各个segment情况

 
 
 

1

GET _cat/segments?index=sumap_domain*&v&s=docs.deleted:desc
index shard prirep ip segment generation docs.count docs.deleted size size.memory committed searchable version compound
domain_index 36 p 172.16.80.1 _stmt 1344773 161171 692426 4.3gb 1181094 true true 8.2.0 true

3. 查看某个索引整体的deleted情况

 
 
 

1

GET _cat/indices?index=sumap_domain*&v&h=index,docs.count,docs.deleted,store.size
index docs.count docs.deleted store.size
domain 2683311417 943551705 87.5tb

5. 强制合并导致的问题

强制合并会导致>=5GB的段,不太清楚一个段的大小达到100GB后,会导致什么结果。通过查询得到资料,目前会导致:

  1. 如果继续对该段进行update写入,则后台合并不会去关心>=5GB的段,这时需要手动执行forcemerge

参考


1 How Do Deleted Documents Affect Search Performance?文章来源地址https://www.toymoban.com/news/detail-509951.html

到了这里,关于es强制段合并实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 租用游艇问题 石子合并问题 动态规划实验

    实验名称:                动态规划                          一、实验预习 1、实验目的 1. 理解并掌握动态规划方法的设计思想; 2. 提高应用动态规划方法解决问题和设计算法的能力; 3. 通过编程实现租用游艇问题和石子合并问题,进一步理解动态规划方

    2024年02月07日
    浏览(48)
  • git分布式管理-头歌实验合并远程分支、rebase、储藏

    任务描述 在软件开发中,通常会在版本库中创建多个不同的分支进行开发。例如,最基本的可以有一个测试版分支和一个正式版分支,其中测试版分支用来完成最新功能代码的开发与测试,正式版则用于管理即将发布的版本。 如果某个版本通过了测试,就需要将其推到正式

    2024年03月12日
    浏览(64)
  • 实验5 MapReduce初级编程实践(1)——编程实现文件合并和去重操作

    通过实验掌握基本的MapReduce编程方法; 掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04) Hadoop版本:3.1.3 编程实现文件合并和去重操作 对于两个输入文件,即文件A和文件B,请编写MapReduce程序,

    2023年04月15日
    浏览(50)
  • 数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(62)
  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(70)
  • git代码提交规范、强制git代码提交规范、强制代码进行格式化

    1、安装commitizen和cz-customizable npm install -g commitizen@4.2.4 npm i cz-customizable@6.3.0 --save-dev 2、在package.json中进行新增 \\\"config\\\": {   \\\"commitizen\\\": {     \\\"path\\\": \\\"node_modules/cz-customizable\\\"   } } 3、初始化完成之后 将.cz-config.js配置文件 拖到根目录下 4、之后就可以用 git cz 来代替 git commit    (在

    2024年02月13日
    浏览(58)
  • Win11和Win10怎么禁用驱动程序强制签名? 关闭Windows系统驱动强制签名的技巧?

    驱动程序签名又叫做驱动程序的数字签名,它是由微软的Windows硬件设备质量实验室完成的。硬件开发商将自己的硬件设备和相应的驱动程序交给该实验室,由实验室对其进行测试,测试合格后实验室将在其驱动程序中添加数字签名。由于数字签名是由微软完成的。 Win11设备只

    2024年02月06日
    浏览(72)
  • 华为手机怎么刷机忘记密码强制刷机方法被锁定怎么刷掉ID账户强制解除教程

    华为手机例分享,这个台手机是用户公司手机,由于前使用者离职后未能退出手机的华为账号和锁屏密码,导致手机无法使用。 自己通过简单的恢复出厂设置后,发现手机有华为账号锁无法激活手机,这才联系到刷机爱好者技术人员,给予远程强制刷机移除华为手机账号建议

    2024年02月04日
    浏览(129)
  • 如何强制git pull

    如果你想强制 git pull 来覆盖本地的更改,你需要注意这个过程会删除所有你在本地做的更改,并将你的本地分支同步到远程分支。如果你想要这样做,可以使用以下的命令: 在上面的 branch_name 中填写你想要同步的远程分支的名字。比如,如果你想要同步的分支是 master ,你

    2024年02月12日
    浏览(34)
  • 整数0 强制转化为指针

    在工程中看到以下代码: -的优先级高于。 因此 ((type*)0)-member)的解释为先进行: (type*)0)-member 取得member成员的运算,然后再进行取地址 运算 举例测试: 得到如下结果: 总结: 通过上述例子了解该代码目的: 1、(unsigned long)(((Msg*)0)-b))获取结构体成员b 相对于结构体地址首

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包