如何解决Easysearch节点磁盘不足问题
在使用Easysearch的过程中,节点磁盘空间不足是一个常见问题。为了避免索引把磁盘空间占满,Easysearch采用了磁盘水位线来管理磁盘空间。之前有文章介绍过不同水位线的作用,以及如何借助INFINI Console提前发出告警,方便及时处理问题。这篇文章主要处理在收到告警后,提前处理磁盘不足问题的具体方法。
一、扩充资源来解决磁盘不足
如果有足够的资源,给Easysearch集群扩充资源是个不错的选择。可以从下面两个方面入手:
添加新的数据节点
添加新的数据节点后,集群会自动平衡数据。想要查看数据平衡的进度,可以用下面这个命令:
GET /_cat/shards?v&h=state,node&s=state
运行这个命令后,如果响应结果里分片的状态显示为“RELOCATING”,那就表明分片还在移动,数据平衡还没完成。
扩充现有数据节点的磁盘容量
扩充完现有数据节点的磁盘容量后,我们需要查看磁盘利用率有没有下降。可以使用下面的命令:
GET _cat/allocation?v&s=disk.avail&h=node,disk.percent,disk.avail,disk.total,disk.used,disk.indices,shards
通过这个命令,能清楚地了解到每个节点的磁盘使用情况,判断扩充容量的操作是否有效。
二、释放磁盘空间
要是没有额外的资源可添加,那就得想办法减少磁盘的消耗了,具体可以这么做:
删除无用索引
为了更好地管理索引,建议使用索引生命周期。它能自动删除那些过期的索引,这样就能节省不少磁盘空间。
删除多余副本
有些业务索引可能会存在多个副本。如果磁盘空间紧张,可以适当减少副本数量。在操作之前,可以用这个命令查看索引的副本数量和主存储大小,并按照从大到小的顺序排列:
GET _cat/indices?v&s=rep:desc,pri.store.size:desc&h=health,index,pri,rep,store.size,pri.store.size
根据查询结果,再决定是否缩减副本数。
利用可搜索快照
对于那些平时不怎么用,但又需要长期保存的数据,可以使用可搜索快照功能。这个功能能在保证数据可查询的同时,降低磁盘的消耗。
三、优化索引空间
除了上面的方法,还可以对索引空间进行优化:
启用ZSTD压缩及source_reuse功能
Easysearch支持ZSTD和source_reuse功能。和默认的压缩算法相比,这两个功能能大幅减少磁盘的占用。
可以在创建索引的时候启用这两个功能,也能通过索引模板来设置。下面是一个在创建索引时启用的示例:
PUT test-index { "settings": { "index.codec": "ZSTD", "index.source_reuse": "true" } }
不过要注意,如果索引里包含nested类型的映射,或者插件提供的特殊数据类型(比如knn索引),那就不能启用source_reuse功能。
索引优化
- mapping优化:尽量别用默认的mapping类型。因为字符串类型的数据使用默认mapping时,会同时得到text和keyword两种类型的mapping,这可能会浪费磁盘空间。
- 字段优化:可以通过命令统计指定索引每个字段的访问次数,命令如下:
GET metrics/_field_usage_stats
还能分析指定索引各个字段占用磁盘的大小,使用这个命令:
POST metrics/_disk_usage?run_expensive_tasks=true
根据这两个命令的结果,进一步优化各个字段,比如关闭一些不用的功能。
- 使用rollup功能:在处理时序场景的数据时,往往会有大量详细的聚合指标。随着时间推移,数据存储量会不断增加。rollup功能可以把旧的、细粒度的数据汇总成粗粒度的格式进行长期存储。这样一来,历史数据的存储成本就能大大降低。
Easysearch的rollup功能有独特的优势,它能自动对rollup索引进行滚动,不需要依赖其他API单独设置。而且在进行聚合查询时,还能直接搜索原始索引,对业务端的搜索代码完全兼容,用户基本感觉不到差异。更多详细内容可以查看官网文档:https://infinilabs.cn/docs/latest/easysearch 。通过这些方法,能有效应对Easysearch节点磁盘不足的问题,你学会了吗?