如何确定我的Elasticsearch服务器的内存需求

19

我这里有一个情境,

一个大约有1.4TB数据的Elasticsearch数据库,其中包含,

 _shards": {
     "total": 202,
     "successful": 101,
     "failed": 0
}

每个索引大小约为3 GB到30 GB,在不久的将来,预计每天会有30GB的文件大小。

操作系统信息:

 NAME="Red Hat Enterprise Linux Server"
 VERSION="7.2 (Maipo)"
 ID="rhel"
 ID_LIKE="fedora"
 VERSION_ID="7.2"
 PRETTY_NAME="Red Hat Enterprise Linux Server 7.2 (Maipo)"

该系统有32GB的RAM,文件系统为2TB(1.4TB已使用)。我已经为Elasticsearch服务器配置了最大15GB的RAM。但是这对于我查询这个数据库来说还不够。服务器在单个查询命中时会挂起。

我将在该服务器上增加1TB的文件系统,以便总可用文件系统大小将达到3TB。我还计划将内存增加到128GB,这是一个近似的估计。

请问是否有人能帮我计算确定至少需要多少RAM才能使服务器同时响应50个请求?

如果您能建议任何工具/公式来分析此要求,我们将不胜感激。如果您能给出任何其他数字场景,我可以使用它来确定我的资源需求,那将非常有帮助。


1
增加RAM/堆在你的情况下不会有太大帮助,你可能需要超过一个服务器。不过,如果不知道你正在运行的查询和索引映射,很难告诉你更多信息。 - Val
3个回答

4
如果您需要一个经验法则,我会建议在现代ES和Java上,每TB数据需要10-20GB的堆内存(我考虑的是典型的ELK用例)。乘以2,这就是每TB需要20-40GB的总RAM

现在来看详细答案 :) 这里有两种相关的内存:

  • JVM堆内存
  • 操作系统缓存(操作系统会使用空闲内存来缓存索引文件)

操作系统缓存取决于您的IO需求(查询会进行大量的小随机IO)。如果您有一个查询密集型的用例(例如电子商务),您将希望将整个索引都适配到操作系统缓存中(或者至少大部分)。对于日志和其他时间序列数据,通常具有更昂贵、更罕见的查询。在那里,如果您有一个本地SSD,则可以只使用一部分数据来完成缓存。我曾经看到过32GB操作系统缓存的4TB磁盘空间服务器。

JVM堆内存也可以分为两部分:

  • 静态内存,即使服务器处于空闲状态也需要
  • 瞬时内存,用于进行索引/搜索操作

如果您访问_nodes/stats端点,您将看到大部分静态内存。最好使用Elasticsearch监控工具绘制这些内存。您将在其中看到segments_memory和各种缓存。对于最新版本的Elasticsearch(例如7.7或更高版本),没有像这样的内存很多 - 至少对于大多数用例而言是如此。我见过的ELK部署处理多个TB数据的情况下,静态内存使用不到10GB的RAM。尽管如此,您可以通过不存储不需要的信息来减少它。例如,不要对您不搜索的字段进行索引。

短暂内存主要取决于查询的频率和复杂度。一次性的复杂查询往往更加危险,因此避免使用过多层次的聚合、大型 size 值或扩展到太多术语的查询(通配符、模糊等)。为了适应这些需求,您只需要堆内存。需要多少?这实际上是一个监视和调整的问题。
旁注:我不赞同普遍建议以任何代价都要保持低于32GB。使用Java 11+和G1GC,我看到了超过100GB的堆的部署,它们运行得非常好。未压缩oops的开销并不是文档中建议的每30GB就有10-20GB - 这是一个最坏情况下的推断。根据我的经验,在许多部署中,每30GB大约是几个GB,例如许多部署大约是10%。这并不意味着你必须使用100GB的堆,只是如果您的集群需要大量堆,您不必拥有数百个节点(您可以拥有较少但更大的节点)。

谈到垃圾回收机制(GC),如果运行许多不是非常昂贵的查询,则可能会落后。即使您有足够的空间,也会耗尽堆空间。监视应该告诉您这一点,因为完整的GC最终将使用大暂停清理堆(读取:集群不稳定)。在这里,Java 11与G1GC和低-XX:GCTimeRatio(例如3)应该解决此问题。


4
你需要使用多个节点进行扩展以保持效率。 Elasticsearch 每个节点的内存最佳状态为 64GB,其中32GB留给 ES。点击此处查看更多细节。如果你正在使用 Elasticsearch 处理重要信息,那么该书是一本非常好的读物。

你指的是哪本书? - Edenshaw
1
@Edenshaw 他的意思是通过共享链接获取官方文档。 - Srikanta
所以,如果你有32 GB的RAM,就给16 GB给ES。根据elastic/memory-link的建议:“将(不到)一半的内存分配给Lucene”。 - dr0i
1
现在内存的描述在这里:https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html - heroin

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接