Elasticsearch集群内存占用高?用这招!

这篇具有很好参考价值的文章主要介绍了Elasticsearch集群内存占用高?用这招!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、freeze index冻结索引介绍

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

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

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

Elasticsearch集群内存占用高?用这招!

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

Elasticsearch集群内存占用高?用这招!

二、索引冻结

索引冻结以后除了保存一些必要的元数据信息意外,将不再占用系统负载,索引将会变成只读,不再提供写入的能力,类似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"    
            }
        }
    }
}' "http://localhost:9200/order?pretty"

结果如下

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

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

curl http://localhost:9200/_cat/indices/order?v

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   order JWeddPjZQF2-W5PD2EZn0w   1   1          0            0       208b           208b

冻结的API格式如下:

POST /<index>/_freeze

我们使用API冻结order索引:

curl -X POST http://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 'http://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”,以确保最佳性能。文章来源地址https://www.toymoban.com/news/detail-458166.html

到了这里,关于Elasticsearch集群内存占用高?用这招!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • centos查看内存、cpu占用、占用前10,前X

    这会显示系统的物理内存和交换空间使用情况,以人类可读的方式显示。 参数说明 total 总物理内存 used 已经使用的内存 free 没有使用的内存 shared 多进程共享内存 buff/cache 读写缓存内存 available 应用程序可用物理内存 top命令用来监控linux的系统状况,比如cpu、内存的使用 输入

    2024年02月08日
    浏览(51)
  • 获取对象占用内存

    添加依赖 添加vm启动参数 编写测试代码

    2024年02月09日
    浏览(35)
  • linux运维(二)内存占用分析

    1.1: free 命令是 free最常规的查看内存占用情况的命令 1.2: 参数说明 top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令。 按 q 退出 top命令也可以用来查内存 输入top命令 按x,高亮排序列,默认应该是%CPU,按CPU占用排序。 按shift +M (或 按

    2024年02月09日
    浏览(47)
  • 如何计算一个实例占用多少内存?

    我们都知道CPU和内存是程序最为重要的两类指标,那么有多少人真正想过这个问题:一个类型(值类型或者引用类型)的实例在内存中究竟占多少字节?我们很多人都回答不上来。其实C#提供了一些用于计算大小的操作符和API,但是它们都不能完全解决我刚才提出的问题。本

    2024年02月07日
    浏览(30)
  • MySQL连接会话数占用内存

    MySQL 的内存占用与连接数之间的关系是复杂的,具体取决于多个因素,包括配置设置、查询负载、数据大小和使用的存储引擎等。每个连接都需要一定的内存资源来维护连接状态、缓存查询结果和执行计划等。 以下是一些常见的内存占用因素: 连接内存:每个连接需要一定

    2024年02月07日
    浏览(40)
  • SpringBoot 项目启动内存占用过高优化以及内存查看

    在使用SpringBoot 开发过程中,发现不管是本地还是测试环境只要一启动,动不动就占用1G内存,然而本地和测试环境的访问量却并没有多少,导致资源浪费; 2.1、启动命令示例(具体配置可根实际情况调整) nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Xms128m -Xmx128m -Xmn

    2024年02月03日
    浏览(43)
  • 性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出详解

    含义:内层泄露是程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。(换言之,GC回收不了这些不再被使用的对象,这些对象的生命周期太长) 危害:当应用程序长时间连续运行时,会导致严重的性能下降;OOM;偶尔会耗尽连接对象;可

    2024年01月19日
    浏览(66)
  • Linux中buff/cache内存占用过高,手动释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图:(可以看到总内存就251G,buff/cache占用了174G) 什么是buff buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。 什么是cache cache(Page

    2024年02月12日
    浏览(46)
  • 【ES】ES内存占用高,扩内存,重启服务注意事项

    一、参考资料 Elasticsearch内存占用分析与管理 | Tink\\\'s Blog Elasticsearch JVM 堆内存使用率飙升,怎么办? - 腾讯云开发者社区-腾讯云 ES集群重启注意事项_deng942861的博客-CSDN博客_es 重启 ElasticSearch性能优化实践(JVM调优+ES调优) - 简书 

    2024年02月11日
    浏览(51)
  • 享元模式:减少内存占用的诀窍

    享元模式(Flyweight Pattern)是一种结构型设计模式,它主要通过共享对象来降低系统中对象的数量,从而减少内存占用和提高程序性能。这听起来有点像单例模式,但它们在实现和用途上有很大的区别。享元模式的核心是把一个对象的状态分成内部状态和外部状态,内部状态

    2024年02月08日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包