Elasticsearch 性能优化与集群配置指南
1. 单物理机运行多个 Elasticsearch 实例
在拥有大量内存和 CPU 核心的大型物理机上运行 Elasticsearch 既有优势也有挑战。若只运行单个 Elasticsearch 节点,迟早会遇到垃圾回收问题,单个节点上的大量分片会导致内部通信需要大量 I/O 操作,并且单个 JVM 进程的堆内存通常不应超过 31GB,因为无法使用压缩普通对象指针。
在这种情况下,有以下几种选择:
- 在同一裸机上运行多个 Elasticsearch 实例。
- 运行多个虚拟机,每个虚拟机内运行一个 Elasticsearch 实例。
- 使用 Docker 等容器运行 Elasticsearch。
也可以在不运行多个虚拟机的情况下,在单物理机上运行多个 Elasticsearch 服务器。选择使用虚拟机还是多个实例取决于个人偏好,但通常建议将大型服务器划分为多个虚拟机,不过要注意 I/O 子系统会在这些虚拟机之间共享,因此需要合理分配磁盘。
2. 防止分片及其副本位于同一节点
当将多个物理服务器划分为虚拟机时,确保分片及其副本不在同一物理机上至关重要。默认情况下,Elasticsearch 不会将分片及其副本放在同一实例上,但它不了解裸机情况,因此需要通过集群分配感知来告知它。
操作步骤如下:
1. 为每个物理服务器上的 Elasticsearch 节点定义node.server_name属性,并将其设置为服务器的标识符。例如,对于第一台物理服务器上的所有 Elasticsearch 节点,