当前位置:首页 > 投稿 > 正文

Elasticsearch集群内存占用高用这招(elasticsearch 存储量)


一、freeze index冻结索引介绍

Elasticsearch为了能够实现高效快速搜索,在内存中维护了一些数据结构,当索引的数量越来越多,那么这些数据结构所占用的内存也会越来越大,这是一个不可忽视的损耗。

在实际的业务开展过程中,我们会发现,有些索引的数据是“热”数据,经常被查询,这些索引对应的数据结构维护在内存中以提供快速查询是非常正确的,而有些“温”数据(例如随时时间推移的历史数据),可能很久才需要被查询到,这时候一直维持在内存中就有些得不偿失了。

为了解决这种情况,Elasticsearch提出了freeze index冻结索引的功能。一个被冻结的索引的每个shard在被搜索时,Elasticsearch会创建一个临时的数据结构,一旦搜索完成将会立刻丢掉这个数据结构,由于不长期维持这些临时数据结构在内存,冻结索引比正常索引消耗更少的堆内存,在集群的性能表现上更好。

总结来说索引的冻结是Elasticsearch提供的一个用于减少内存开销的操作,这个功能在7.14版本中被标记为Deprecated,在Version 8以后,已经对堆内存的使用进行了改进,冻结和解冻的功能不再适用,但在Version 8以前的版本中不失为一个可行的优化方案。

二、索引冻结

索引冻结以后除了保存一些必要的元数据信息意外,将不再占用系统负载,索引将会变成只读,不再提供写入的能力,类似force merge等操作也将无法执行。

注意,当前正在写的索引不能被冻结,并且执行了冻结操作以后,会将索引先进行close,然后再open,在这段时间内,可能导致主分片没有被分配,集群可能短暂出现red状态,open结束后恢复。

我们来全程演示一下(基于7.14版本),首先创建一个索引:

curl -X PUT -H 'Content-Type:application/json' --data '{settings:{number_of_shards:1,number_of_replicas:1},mappings:{properties:{name:{type:text},phone:{type:keyword},orderId:{type:keyword},amount:{type:text},time:{type:keyword},merchantsType:{type:keyword},gender:{type:keyword},age:{type:keyword},channel:{type:keyword}}}}' https://localhost:9200/order?pretty

结果如下

{acknowledged : true,shards_acknowledged : true,index : order}

此时适用cat API查看索引的状态,可以看到索引的状态是open。

curl https://localhost:9200/_cat/indices/order?vhealth status index uuid                   pri rep docs.count docs.deleted store.size pri.store.sizeyellow open   order JWeddPjZQF2-W5PD2EZn0w   1   1          0            0       208b           208b

冻结的API格式如下:

POST /<index>/_freeze

我们使用API冻结order索引:

curl -X POST https://localhost:9200/order/_freeze{acknowledged:true,shards_acknowledged:true}

往order索引中写入文档,发现响应如下,提示order索引处于block状态,禁止写入(注意,如果使用cat API能看到的状态仍然是open的)。

{error: {root_cause: [{type: cluster_block_exception,reason: index [order] blocked by: [FORBIDDEN/8/index write (api)];}],type: cluster_block_exception,reason: index [order] blocked by: [FORBIDDEN/8/index write (api)];},status: 403}

三、索引解冻

需求解冻的过程中,同样会将索引先进行close,然后再open,在这段时间内,索引不可查询,集群可能短暂出现red状态,open结束后恢复。

API格式如下:

POST /<index>/_unfreeze

以下为索引解冻操作的代码案例:

curl -X POST localhost:9200/order/_unfreeze?pretty{acknowledged : true,shards_acknowledged : true}

再次写入文档:

curl -X POST 'https://192.168.56.11:9200/order/_doc/' --header 'Content-Type: application/json' --data '{name:Lucas,phone:13535567890,orderId:388830293548545433,amount:999.99}'

能够正常写入成功:

{_index: order,_type: _doc,_id: NfM9c4YBYouGktFdy0Fv,_version: 1,result: created,_shards: {total: 2,successful: 1,failed: 0},_seq_no: 0,_primary_term: 6}

特别注意,在再次冻结索引之前,一定要运行“force_merge”,以确保最佳性能。

#头条创作挑战赛#