我想要在 16 核 XEON 类、128GB RAM 的 RHEL 服务器上部署 elasticsearch。
从性能角度来看什么是更好的?
- 是否有庞大的elasticsearch进程使用本机主机上的所有资源?
- 将主机拆分为例如 4 个相等的虚拟机(KVM),并在每台 VM 上部署一个带有 elasticsearch 实例的 elasticsearch 集群。
- 在本机主机上创建docker容器,并在其上部署elasticsearch集群。
谢谢你!
答案1
选项 4:在同一台机器上运行多个实例/节点。
这类似于选项 2 和 3,但更简单,因为没有虚拟化或容器化。一切都在主机上本地运行。
以下是这样做时的注意事项和建议列表(来自这里)。
- 每个节点实例的最大堆大小应小于 32Gb。这是因为超过 32Gb 的堆大小实际上会适得其反,因为 JVM 将停止压缩指针。
- 将 50% 的内存留给 Lucene 的文件系统缓存。
- 虽然您可能有足够的 RAM 在同一台机器上运行多个实例,但请测试是否有足够的 CPU/处理能力。
- 您还需要检查以确保多个节点实例不会争用磁盘空间或磁盘 IO。我们建议为机器上的所有节点提供一个 raid0,并在其下放置大量磁盘,或者为每个节点提供一个专用磁盘。
- 降低处理器 相应地设置。每个 ES 节点都会检测机器上可用的核心数(不知道是否存在其他节点)。如果同一台机器上有多个节点,每个节点都可以认为它对机器上的所有核心都有专用访问权限(这可能会有问题,因为默认线程池大小就是从这里派生出来的)。因此,您需要通过处理器设置明确指定可用的核心数,这样就不会过度分配线程池。例如,大致
# of cores / # of nodes
可以作为为每个节点配置的良好开端。- 请记住,多个节点还意味着网络连接、操作系统文件描述符、mmap 文件限制也将在节点之间共享,因此您需要确保有足够的带宽并且限制设置得足够高以容纳节点。
- 机器上的节点越多,如果单个服务器发生故障,则越多的节点会同时发生故障。此外,您需要确保不会在同一台机器上拥有分片的所有副本。您可以通过将其设置
settingcluster.routing.allocation.same_shard.host
为 true 来防止这种情况。请参阅 这里 了解详情。为了确保集群稳定性,每个专用主节点实例都应位于自己的机器上(当然可以是一台小得多的机器,例如,从 4Gb RAM 开始)-请记住,一台机器上的多个节点意味着管理的额外复杂性(例如,跟踪不同的端口、配置文件等)。管理多个实例配置的一个好方法是为每个实例创建一个单独的 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.port
和transport.tcp.port
)。- 每个节点都应该有自己的
path.*
目录(例如path.data
,,,)path.log
,这样节点最终就不会出现数据、插件、日志等文件夹位置冲突的情况。path.work
path.plugins
正如另一个答案中提到的,您不想为每个实例使用超过 32GB 的内存,也不想将所有 RAM 用于 Java 堆。相反,最好将至少 50% 的内存留给操作系统用于文件系统缓存。
有一个很好的解释为什么会出现这种情况这来自 Elastic 的博客文章。
答案2
2 和 3 是最佳选择,因为文档建议为每个节点分配最大 32GB 的内存。