Elasticsearch存储空间体系结构及空间异常增长问题分析

1. 基本概念和原理

1.1.document(文档)

数据记录,与关系数据库中的表记录类似。
document由字段构成,每个字段有其特点的type,如integer, long, boolean, ip,  keyword, text等等。

1.2.index(索引)

index是document的集合,与关系数据库中的table类似。
index有静态特性和动态特性;
静态特性在创建时指定,创建后不可修改,如index.number_of_shards(索引主分片的数量);
动态特性在创建后可以修改,如index.number_of_replicas(副本数)。

1.3.node(节点)

一个node即一个ES实例,一般情况下一台服务器(虚拟机或物理机)部署一个node;如果服务器配置较高(内存128G以上),建议部署2个以上node。

ES实例的内存结构

ES实例消耗的内存分为两块:1、java堆内存,2、lucene使用的OS cache
java堆内存大小不要超过31G

原因:32位操作系统下最多可用4G内存,64位操作系统下无此限制,但64位指针会导致内存极大的浪费,也增加CPU缓存与内存之间的带宽消耗,因此 java通过内存指针压缩技术(compressed oops)实现32位的指针在64位操作系统平台下引用内存;但这种技术有限制,最多只能管理32G内存;如果JVM堆大小超过32G,将自动不使用该技术,直接使用64位的指针来引用内存,从而带来大量的额外消耗。
lucene管理了大量的segement,每个segment对应一个操作系统文件,对segment处理时需要消耗大量OS cache,因此除了JVM堆,还要预留足够的操作系统内存。
总之:

  1. 如果服务器内存低于64G,只部署一个node,JVM不超过31G,剩下的给预留给lucene;
  2. 如果服务器内存高于128G,可以考虑每64G部署一个node,每个node的JVM不超过31G;
  3. 如果一台服务器部署2个以上的node,确保设置cluster.routing.allocation.same_shard.host:true,这将阻止同一个分片的副本分布在同一个服务器上的多个节点上,从而确保多副本的高可用。

1.4.shard(分片)

一个index分为多个shard,以便将数据分布到不同的node,提高index容量和并行读写能力;
shard分为primary(主分片)和replica(副本分片),数据写入主分片,自动向副本分片同步;
副本作用:数据容灾、提升读性能(类似mysql读写分离);
下图中一个index分布在3个node,包含10个shard(5个主分片,5个副本分片),同一个shard的主分片与副本分片分布在不同的node。

document分发到shard的规则
shard = hash(routing) % number_of_primary_shards
routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

1.5.segment(段)

segment生成过程
一个document写入到ES后,先写入buffer,默认每秒将buffer中的记录刷新到segment;
数据刷新到segment后,数据才可以被读取到,因此ES是准实时的,默认最大延迟1秒;
事务日志(translog)确保数据尽可能不丢失,默认5秒刷新一次translog,因此ES宕机最多可能丢5秒数据;

segment合并
每个segment是一个倒排索引,每个请求需要遍历所有segment;
一个shard内每秒生成一个segment,segment数量太多,搜索性能会很差,因此需要将segment合并。
merge进程会在后台选择一些小体积的segments,然后将其合并成一个更大的segment。

2.阿里云ES空间使用率异常增长分析

2.1.现象

三台ES组成集群:172.16.92.222/223/224,磁盘空间初始各100G,5月11日20:00磁盘各扩容至200G。
222磁盘空间使用率从5月10日9:30开始增长,直到磁盘扩容才下降;
224磁盘空间使用率从5月10日9:30开始增长,期间大幅增长并恢复初始值,扩容后大幅下降;
223磁盘空间使用率无波动,扩容后大幅下降

数据使用大小,从183G增长到196G,最终回落到178G

2.2.分析

5月11日18:15,segment数量出现明显波动,最终大幅下降,说明后台在进行深度segment merge;
期间磁盘空间大幅增加,224完成segment merge后空间正常回收,223磁盘空间卡在80%。

数量增长幅度正常,说明空间增长不是因为数据量增加导致

 诊断报告显示出现了磁盘空间使用85%的情况,但上述磁盘空间趋势图中并未体现,可能是监控未捕捉到申请磁盘空间的时间点。

 2.3.总结

深度segment merge过程中,临时需要大量额外的磁盘空间;
222节点merge过程中,磁盘空间增长到85%,无法继续申请空间,导致merge过程挂起,直到扩容后才申请到新的空间,最终顺利merge,并释放空间;
这种场景的解决方案:

  • 适当增加磁盘空间,使得资源满足segment merge的需求;
  • 如无法增加磁盘空间,可适当增加low disk watermark [85%],也可达到目的。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值