如何在一个非常强大的机器上平衡elasticsearch(java)?

在16核心XEON类,128GB内存RHEL服务器我想部署elasticsearch

什么是更好的性能明智?

  1. 有一个巨大的弹性search过程来使用本地主机上的所有资源?
  2. 将主机分成4个相同的虚拟机(KVM),并在每个虚拟机上部署带有elasticsearch实例的elasticsearch集群。
  3. 在本地主机上创builddocker容器并在其上部署elasticsearch集群。

谢谢!

选项4:在同一台机器上运行多个厚度/节点。

这就像选项2和3一样,除非更简单,因为没有虚拟化或集装箱化。 它全部在主机上运行。

这里有一些注意事项和build议(从这里 )。

  • 每个节点实例的最大堆大小应该<32Gb。 这是因为32Gb以上的堆大小实际上会适得其反,因为JVM会停止压缩指针。
  • 将50%的内存留给Lucene的文件系统caching。
  • 虽然您可能有足够的RAM在同一台计算机上运行多个实例,但请testing是否有足够的CPU /处理能力。
  • 您还需要检查以确保多节点实例不争夺磁盘空间或磁盘IO。 我们的build议是给机器上的所有节点一个raid0,下面有大量的磁盘,或者每个节点有一个专用的磁盘。
  • 降低处理器设置相应。 每个ES节点检测机器上可用的内核数量(不知道其他节点存在)。 在同一台机器上有多个节点的情况下,每个节点都可以认为它具有对机器上所有内核的专用访问权限(这可能会导致默认线程池大小的问题)。 所以你需要明确地指定通过处理器设置可用的内核数量,以便最终不会超出线程池的位置。 例如,对于每个节点,粗略的# of cores / # of nodes可以很好地开始configuration。
  • 请记住,多个节点还意味着networking连接,操作系统文件描述符,mmap文件限制也将在节点之间共享,因此您需要确保有足够的带宽,并且将限制设置得足够高以容纳节点。
  • 在机器上拥有的节点越多,如果单个服务器出现故障,节点就会一次失败。 另外,你也要确保你不会在同一台机器上得到一个碎片的所有副本。 您可以通过将settingcluster.routing.allocation.same_shard.host为true来防止此问题。 详情请看这里 。
  • 为了确保集群的稳定性,每个专用的主节点实例应该在自己的机器上(当然可以是一个小得多的机器,例如4Gb的RAM) – 请记住,机器上的多个节点意味着更多的pipe理复杂性例如跟踪不同的端口,configuration文件等)。 pipe理多个实例的configuration的一个好方法是为每个实例创build一个单独的elasticsearch.yml文件,例如。 您可以传入-Des.config参数以在启动时为每个实例指定yml文件:

     $ bin/elasticsearch -Des.config=$ES_HOME/config/elasticsearch.1.yml $ bin/elasticsearch -Des.config=$ES_HOME/config/elasticsearch.2.yml 
  • 每个yml将指向相同的群集名称。
  • 指定有意义的节点名称会很有帮助
  • 为每个节点使用明确的端口号,以便它们是可预测的(例如, http.porttransport.tcp.port )。
  • 每个节点都应该有自己的path.*目录(例如path.datapath.logpath.workpath.plugins ),这样节点不会因为数据,插件,日志等文件夹的位置而出现冲突。

正如在另一个答案中提到的,您不希望每个实例使用多于32GB的数据,而且您也不希望将所有RAM用于Java堆。 相反,最好把50%的文件留给操作系统进行文件系统caching。

Elastic的这篇博客文章中,为什么会出现这样的情况?

2和3是最好的select,因为文档build议为每个节点分配32GB的最大内存。