Elasticsearch里面的segment合并

通过前面的文章,我们已经知道在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就会被删除,流程如下:

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

api如下:

或者不限制:

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

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

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2018-03-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑白安全

Web安全测试基础

概念:通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,实现控制用户浏览器行为的一种攻击方式。

1674
来自专栏杨建荣的学习笔记

海量数据迁移之误操作和防范建议(r3笔记第22天)

在生产环境的数据迁移中,发生误操作真是很不愿意看到,今天自己总结了一下,从个人的经验来看有以下的几种操作或者是失误导致的问题。有一些错误自己已经犯过。 外键 ...

3498
来自专栏编程

java缓存技术总结

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的,...

5005
来自专栏zhangdd.com

zabbix监控-清理zabbix 历史数据

zabbix运行一段时间之后,会留下大量的历史 数据,会发现zabbix的数据库一直在增大。运行3个月后笔者的数据库达到了5.7G,可能造成系统性能下降,查看历...

3051
来自专栏数据库

mybatis 框架实战,实现数据库的增删改查

温馨提示:本问阅读需要4分钟,建议收藏后阅读! 好的各位小伙伴 今天我们来做一个实战 实现数据库的增删改查 先来熟悉一个ORM的概念 ORM (OBJECT-R...

2178
来自专栏学习有记

SQL Server 代理进阶 - Level 2 :作业步骤和子系统

1104
来自专栏架构师之路

多库多事务降低数据不一致概率

一、案例缘起 我们经常使用事务来保证数据库层面数据的ACID特性。 举个栗子,用户下了一个订单,需要修改余额表,订单表,流水表,于是会有类似的伪代码: star...

3065
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch入门介绍

ES是一个高扩展的、开源的、全文检索的搜索引擎,它提供了近实时的索引、搜索、分析功能。 ES文档翻译与总结参考:ES知识汇总 应用场景 1 它提供了强大...

2209
来自专栏企鹅号快讯

分享 java缓存技术详解

一、缓存是什么? Cache 高速缓冲存储器,其中复制了频繁使用的数据以利于快速访问。 位于速度相差较大的两种硬件/软件之间,用于协调两者数据传输速度差异的结构...

3549
来自专栏运维一切

MESOS的验证和分角色执行 转

我的这个post大约介绍的是一个简单的mesos的翻译:http://domain.coding.io/?p=121 但是实际操作我发现mesos对框架验证支...

690

扫码关注云+社区

领取腾讯云代金券