elasticsearch,garbage-collection,Java,elasticsearch,Garbage Collection" /> elasticsearch,garbage-collection,Java,elasticsearch,Garbage Collection" />

Java 清空垃圾收集器时Elasticsearch不可用?

Java 清空垃圾收集器时Elasticsearch不可用?,java,elasticsearch,garbage-collection,Java,elasticsearch,Garbage Collection,我有一个由两个节点组成的Elasticsearch集群。(实时)网站直接使用此群集,在my 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

我有一个由两个节点组成的Elasticsearch集群。(实时)网站直接使用此群集,在my 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?)?或者这是否意味着服务器和数据有问题

提前多谢

有关群集配置的一些信息

  • Elasticsearch 1.6.0群集由2个节点组成(5个碎片,1个副本)
  • 该群集包含约1000万个文档,约占30 Gb
  • 每个节点都是一个64Gb RAM服务器,最大堆大小设置为31g
  • 该网站每秒运行约300次搜索查询,每秒运行约100次索引查询
  • JVM堆的使用率始终在50%到75%之间,从来没有超过50%

由于GC运行时堆的大小从21.9gb变为4.9gb,我怀疑堆的使用率是否在50%到75%之间,最有可能的是GC在75%时触发,然后下降到约15%。 如果您没有安装Marvel,请安装它并监视诸如段计数和堆使用率之类的参数。要降低段数,请在写操作很少或没有写操作的索引上运行优化()。
如果GC运行时继续减速,请尝试降低堆大小。我知道这听起来适得其反,但在这种情况下,这是有道理的。弹性站点上的主题有一个良好的writeup-

是的,在旧GC期间,GC运行的节点被冻结。这就是它对Java的看法。关于调优,这并不容易:-)。有很多东西要看,你不容易分享这些东西。如果堆使用率总是在50%到75%之间,垃圾收集器不应该运行那么长时间(从你发布的日志来看,当GC运行6秒时,堆看起来几乎满了)。为堆分配更多的RAM会有所帮助,但可能还有其他因素在起作用,首先会导致使用如此多的RAM。这些因素将很难跟踪和/或修复。此外,如果可能,请确保始终运行最新的Java和Elasticsearch版本。感谢您的回复。我确信我正在运行最新的ES和Java版本。如果这种停机在节点级别是不可避免的,我如何确保整个集群保持正常运行?我认为添加一个节点可以解决这个问题,但似乎节点级停机总是会变成集群级停机。。。因此,我的问题是在节点前面放一个负载平衡器。ES文档()说最大堆大小不应该超过31GB:您认为我仍然可以增加它吗?