高可用性 Elasticsearch 集群设置指南
Elasticsearch 是一个功能强大的分布式搜索和分析引擎,专为可扩展性和弹性而设计。在生产环境中,确保持续运行和容错能力至关重要。本指南将引导您完成配置多个 Elasticsearch 节点以创建健壮的高可用性 (HA) 集群的关键步骤。遵循这些说明,您将学会如何设置集群,使其能够抵御节点故障并保持数据的可访问性,从而确保您的应用程序保持响应迅速,数据保持安全。
设置高可用性 Elasticsearch 集群涉及仔细规划节点角色、网络配置和数据复制策略。目标是将工作负载和数据冗余地分布到多台机器上,从而消除单点故障。本文将涵盖核心概念、实际配置步骤和最佳实践,帮助您构建适合严苛生产用例的弹性 Elasticsearch 基础设施。
理解 Elasticsearch 中的高可用性
Elasticsearch 中的高可用性是通过以下几个关键机制实现的:
- 分布式架构:Elasticsearch 固有地将数据和操作分布在多个节点上。
- 节点角色:不同的节点可以服务于不同的目的,从而实现专门的资源分配和故障隔离。
- 分片复制:每个索引都被划分为分片(shards),每个主分片(primary shard)可以有一个或多个副本分片(replica shards),存储在不同的节点上。
- 主节点选举:一个可靠的选举过程确保始终有主节点可用,以管理集群状态。
- Zen 发现机制 (Zen2):该模块处理节点发现和主节点选举,确保节点能够可靠地相互找到并形成集群。
基本节点角色
在 HA 设置中,理解节点角色至关重要。HA 的主要角色包括:
- 符合主节点资格的节点(Master-eligible nodes):这些节点负责管理集群状态,包括索引创建/删除、节点跟踪和分片分配。除非它们也具有
data角色,否则它们不直接存储数据或处理搜索/索引请求。对于 HA,您应该拥有奇数个(通常是 3 个)专用且符合主节点资格的节点来组成仲裁(quorum)。 - 数据节点(Data nodes):这些节点在分片中存储您的索引数据,并执行与数据相关的操作,如搜索、聚合和索引。它们是集群的“主力军”。
- 仅协调节点(Coordinating-only nodes):(可选)这些节点可用于路由请求、处理搜索归约阶段(search reduce phases)和管理批量索引。它们不保存数据或集群状态,但可以减轻数据节点和主节点的工作负载。
分片和副本
Elasticsearch 将您的数据存储在分片(shards)中。每个索引包含一个或多个主分片(primary shards)。为实现高可用性,您应该为每个主分片配置一个或多个副本分片(replica shards)。副本分片是主分片的副本。如果承载主分片的节点发生故障,另一节点上的副本分片可以被提升为新的主分片,从而确保数据不丢失并持续运行。
设置 HA 集群的先决条件
在深入配置之前,请确保您的环境满足以下基本要求:
- Java 开发工具包 (JDK):Elasticsearch 需要兼容的 JDK(通常是 OpenJDK)。确保它已安装在所有节点上。
- 系统资源:为每个节点,特别是数据节点,分配足够的 RAM(例如 8-32GB)、CPU 内核和快速 I/O 磁盘空间(建议使用 SSD)。
- 网络配置:所有节点必须能够通过特定端口相互通信(默认 9300 用于节点间通信,9200 用于 HTTP API)。确保防火墙配置正确。
- 操作系统:对于生产部署,通常首选稳定的 Linux 发行版(例如 Ubuntu、CentOS、RHEL)。
HA 集群设置分步指南
本节概述了安装和配置多节点 Elasticsearch 集群的过程。
步骤 1:在所有节点上安装 Elasticsearch
在将成为集群一部分的每台服务器上安装 Elasticsearch。您可以使用包管理器(Debian/Ubuntu 使用 APT,RHEL/CentOS 使用 YUM)或直接下载归档文件。
示例(通过 APT 在 Debian/Ubuntu 上安装):
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch
安装完成后,启用并启动服务(尽管我们先进行配置)。
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
步骤 2:在每个节点上配置 elasticsearch.yml
elasticsearch.yml 文件通常位于 /etc/elasticsearch/,是您定义集群设置的地方。在每个节点上使用适当的配置编辑此文件。
所有节点的通用配置
-
cluster.name:对于所有要加入同一集群的节点,此名称必须相同。
yaml cluster.name: my-ha-cluster -
node.name:每个节点的唯一名称,有助于识别。
yaml node.name: node-1 -
network.host:将 Elasticsearch 绑定到特定的网络接口。使用0.0.0.0绑定到所有可用接口,或使用特定的 IP 地址。
yaml network.host: 0.0.0.0 # 或者针对安全/多网卡设置使用特定的 IP 地址 # network.host: 192.168.1.101 -
http.port:用于 HTTP 客户端通信的端口(默认 9200)。
yaml http.port: 9200 -
transport.port:用于节点间通信的端口(默认 9300)。应保持一致。
yaml transport.port: 9300
发现设置(对 HA 至关重要)
这些设置告诉节点如何相互发现并形成集群。
-
discovery.seed_hosts:集群中符合主节点资格的节点的地址列表。这是节点发现初始主节点的方式。请提供所有符合主节点资格的节点的 IP 地址或主机名。
yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] -
cluster.initial_master_nodes:仅在首次引导全新的集群时使用。此列表应包含将参与第一次主节点选举的符合主节点资格的节点的node.name。一旦集群形成,此设置将被忽略。
yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- 重要提示:在集群成功形成后,请删除或注释掉
cluster.initial_master_nodes,以防止节点重启时尝试形成新的集群,从而导致意外行为。
- 重要提示:在集群成功形成后,请删除或注释掉
节点角色配置
指定每个节点的角色。常见的 HA 设置涉及 3 个专用的主节点和若干个数据节点。
- 符合主节点资格的节点(例如 node-1, node-2, node-3):
yaml node.roles: [master] - 数据节点(例如 node-4, node-5, node-6):
yaml node.roles: [data] - 混合角色节点(不推荐用于大型生产 HA):
yaml node.roles: [master, data]- 最佳实践:为了在生产环境中实现真正的高可用性和稳定性,请为 master 和 data 角色分配专用节点。这可以将关键的主节点进程与资源密集型的数据操作隔离开来。
步骤 3:配置 JVM 堆大小
编辑 /etc/elasticsearch/jvm.options 以设置 JVM 堆大小。一个好的经验法则是分配可用 RAM 的 50%,但绝不超过 30-32GB。例如,如果服务器有 16GB RAM,则分配 8GB:
-Xms8g
-Xmx8g
步骤 4:系统设置
对于生产环境,请增加所有节点上打开文件的 vm.max_map_count 和 ulimit 限制。将这些行添加到 /etc/sysctl.conf 并应用 (sudo sysctl -p)。
vm.max_map_count=262144
并在 /etc/security/limits.conf(或 /etc/security/limits.d/99-elasticsearch.conf)中添加:
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
步骤 5:启动 Elasticsearch 服务
在所有配置好的节点上启动 Elasticsearch 服务。通常建议首先启动符合主节点资格的节点,但由于现代发现机制,只要 discovery.seed_hosts 配置正确,启动顺序就不那么重要了。
sudo systemctl start elasticsearch
检查服务状态和日志是否有任何错误:
sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch
步骤 6:验证集群健康状况
一旦所有节点都在运行,请使用 Elasticsearch API 验证集群的健康状况。您可以查询集群中的任何节点。
curl -X GET "localhost:9200/_cat/health?v&pretty"
预期输出:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00 my-ha-cluster green 6 3 0 0 0 0 0 0 - 100.0%
status:应为green(所有主分片和副本分片均已分配)或yellow(所有主分片均已分配,但某些副本分片尚未分配)。red表示存在严重问题。node.total:应与您启动的节点总数匹配。node.data:应与数据节点的数量匹配。
检查节点以确保它们都已加入集群:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
预期输出(3 个主节点,3 个数据节点示例):
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.101 21 87 0 0.00 0.01 0.05 m * node-1
192.168.1.102 20 88 0 0.00 0.01 0.05 m - node-2
192.168.1.103 22 86 0 0.00 0.01 0.05 m - node-3
192.168.1.104 35 90 1 0.10 0.12 0.11 d - node-4
192.168.1.105 32 89 1 0.11 0.13 0.10 d - node-5
192.168.1.106 30 91 1 0.12 0.10 0.09 d - node-6
这表明 node-1 是被选举出的主节点(master 列下的 *),并且其他节点是集群的一部分。
步骤 7:配置索引分片和复制
对于新创建的索引,Elasticsearch 默认设置一个主分片和一个副本(index.number_of_shards: 1,index.number_of_replicas: 1)。对于 HA,您通常希望至少有一个副本,这意味着您的数据至少存在于两个不同的节点上。这确保了一个节点发生故障时,副本可以在其他地方可用。
创建索引时,指定这些设置:
```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3