【发布时间】:2015-07-01 13:21:53
【问题描述】:
我有一个由两个节点组成的 Elasticsearch 集群。一个(实时)网站直接使用这个集群,在我的 ES 集群上持续运行搜索和索引查询。
我的问题是,在定期(且不可预测)的基础上,当其中一个节点清空垃圾收集器时,整个集群变得不可用。我从节点日志中得到的消息看起来像
[2015-07-01 06:43:19,525][INFO ][monitor.jvm] [my_node] [gc][old][205450][116]
duration [5.7s], collections [1]/[6.3s], total [5.7s]/[1m],
memory [22.3gb]->[4.9gb]/[30.9gb],
all_pools {[young] [392.9mb]->[17.2mb]/[665.6mb]}
{[survivor] [29.1mb]->[0b]/[83.1mb]}
{[old] [21.9gb]->[4.9gb]/[30.1gb]}
据我了解(我不是 java 人),这行表明 ES 正在清空其垃圾收集器。因此,在这 5.7 秒内,节点没有响应,我的集群也没有响应,我的网站也没有。这种停机时间每天发生 5 到 10 次。
我在这里做错了什么,或者这种停机时间是不可避免的吗?我是否应该将 Elasticsearch 负载均衡器(即 data=false、master=false 的节点)添加到集群并让我的网站指向这个负载均衡器?或者我应该在我的节点前添加另一种负载均衡器(HAProxy?)?或者这是否意味着服务器、数据有问题?
提前非常感谢
关于集群配置的一些信息
- 由 2 个节点(5 个分片,1 个副本)组成的 Elasticsearch 1.6.0 集群
- 集群包含约 1000 万个文档,占用约 30 Gb。
- 每个节点都是一个 64Gb RAM 服务器,MAX_HEAP_SIZE 设置为 31g
- 网站每秒运行约 300 个搜索查询和每秒约 100 个索引查询
- JVM 堆使用率始终在 50% 到 75% 之间,从不超过
【问题讨论】:
-
是的,在旧 GC 期间,运行 GC 的节点被冻结。这就是Java的情况。关于调整这并不容易:-)。有很多东西要看,你不容易分享这些东西。
-
如果堆使用率始终在 50% 到 75% 之间,则垃圾收集器不应运行那么长时间(从您发布的日志来看,当 GC 运行 6 次时堆几乎已满秒)。为堆分配更多的 RAM 会有所帮助,但可能还有其他因素在起作用,导致一开始就使用了如此多的 RAM。这些因素将难以追踪和/或修复。
-
另外,如果可能,请确保始终运行最新的 Java 和 Elasticsearch 版本。
-
感谢您的回复。我确信我正在运行最新的 ES 和 Java 版本。如果这种停机时间在节点级别是不可避免的,我如何确保整个集群保持正常运行?我认为添加一个节点可以解决这个问题,但似乎节点级停机时间总是变成集群级停机时间......因此我的问题是将负载均衡器放在节点前面
-
ES 文档 (elastic.co/guide/en/elasticsearch/guide/current/…) 说最大堆大小不应超过 31 GB:你认为我还能增加它吗?
标签: java elasticsearch garbage-collection