配置基本三节点集群的分步指南
建立一个具有弹性的 Elasticsearch 集群,对于实现搜索和分析基础架构的高可用性和横向扩展至关重要。三节点集群提供了一个极好的起点,它具备必要的冗余能力,可以在单个节点发生故障时仍不中断服务。本综合指南将引导您完成安装、配置和验证一个基本三节点 Elasticsearch 集群的过程,这非常适合开发环境或小型生产部署。
完成本教程后,您将拥有一个功能齐全的集群,能够安全地分发和复制数据,充分利用 Elasticsearch 的核心分布式能力。
先决条件
在开始配置之前,请确保您已具备以下条件:
- 三台独立的服务器/虚拟机 (VMs): 每个服务器/VM 将承载一个节点。在本指南中,我们假设您已经准备好三台不同的机器或 Docker 容器。
- Java 开发工具包 (JDK): Elasticsearch 要求所有节点上都安装兼容的 JDK(例如,JDK 17,具体取决于您的 Elasticsearch 版本)。
- 网络连通性: 确保所有三个节点可以通过必要的端口进行通信(默认 HTTP 端口:9200,默认传输端口:9300)。
- 相同的 Elasticsearch 安装: 在所有三个节点上下载并解压相同版本的 Elasticsearch。
步骤 1:配置每个节点的 elasticsearch.yml
配置文件 elasticsearch.yml 位于 Elasticsearch 安装的 config/ 目录下,对于定义每个节点在集群中的行为至关重要。您必须根据每个节点调整其特有的设置。
我们将隐式定义角色:一个主节点候选节点和三个数据候选节点。对于三节点集群,通常的做法是允许所有节点拥有主节点、数据和摄取角色。
所有节点的通用设置
确保以下设置在所有三个配置文件中完全相同:
# 集群名称:所有节点必须相同
cluster.name: my-three-node-cluster
# 发现设置(对于初始加入至关重要)
# 使用已知节点的种子列表来启动发现
discovery.seed_hosts: ["node1_ip:9300", "node2_ip:9300", "node3_ip:9300"]
# 法定人数所需 (N/2 + 1)。对于 3 个节点,我们需要 2 票。
cluster.initial_master_nodes: ["node1_name", "node2_name", "node3_name"]
# 网络设置(确保绑定到正确的 IP)
network.host: 0.0.0.0 # 或主机的特定私有 IP
# HTTP 端口(外部访问)
http.port: 9200
# 传输端口(内部集群通信)
transport.port: 9300
每个节点的唯一设置
每个节点都需要一个唯一的 node.name,如果它们运行在同一台机器上或共享存储,则可能需要一个唯一的 path.data。
节点 1 配置(node1_ip)
# 节点 1 的唯一标识符
node.name: node-1
# 如果路径不同
# path.data: /var/lib/elasticsearch/data_node1
节点 2 配置(node2_ip)
# 节点 2 的唯一标识符
node.name: node-2
节点 3 配置(node3_ip)
# 节点 3 的唯一标识符
node.name: node-3
关于
cluster.initial_master_nodes的重要说明: 此设置仅在集群首次启动时使用。一旦集群形成,Elasticsearch 会在内部管理主节点选举。如果您需要重启一个完全失效的集群,您必须确保这些名称与初始配置相匹配。
步骤 2:设置角色(可选但推荐)
虽然默认配置允许节点承担所有角色(主节点、数据、摄取、协调),但在较大的部署中,角色是分离的。对于健壮的三节点设置,我们确保所有节点都有资格成为主节点。
将以下角色配置添加到所有三个 elasticsearch.yml 文件中:
# 对于此初始设置,在所有节点上启用所有标准角色
node.roles: [ master, data, ingest, remote_cluster_client ]
处理法定人数以确保弹性
对于三个节点,集群可以容忍丢失一个节点,同时保持法定人数(剩余 2 个节点)。这由步骤 1 中提供的 cluster.initial_master_nodes 列表进行管理。
步骤 3:启动集群节点
按顺序在每个节点上启动 Elasticsearch。通常,最安全的做法是先启动 cluster.initial_master_nodes 中列出的节点,尽管现代 Elasticsearch 能够很好地处理无序启动。
在节点 1、节点 2 和节点 3 上:
导航到您的 Elasticsearch 安装目录并运行:
# 在前台运行(用于调试很有用)
bin/elasticsearch
# 在后台运行(推荐用于生产环境)
bin/elasticsearch -d
监控每个节点上的日志 (logs/elasticsearch.log),查看成功启动消息,特别是那些指示它们已成功加入集群的消息。
4:验证集群健康状况
一旦所有节点启动,使用 _cat/health API(可通过任何节点的 HTTP 端口,默认 9200,访问)来确认集群状态。
从可以访问节点的机器上访问此 API(例如,通过 curl):
检查健康状况:
curl -X GET "http://node1_ip:9200/_cat/health?v"
预期输出片段:
| epoch | timestamp | cluster | status | node.total | node.data | shards | pri | relo | init | unassigned | unpersisted |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1701331200 | 12:00:00 | my-three-node-cluster | green | 3 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
如果 status 为 green 且 node.total 为 3,则您的集群已正确启动并运行。
验证节点成员身份
要确认所有节点都能看到彼此,请检查节点列表:
curl -X GET "http://node1_ip:9200/_cat/nodes?v"
您应该看到三个不同的条目,分别对应于 node-1、node-2 和 node-3,每个条目都显示了它们的 IP 地址和角色(m 代表主节点候选,d 代表数据)。
步骤 5:创建带复制的测试索引
为了验证集群分发数据和处理复制的能力,我们必须创建一个指定至少一个副本的索引。
在三节点集群中,将 number_of_replicas 设置为 1 可确保每个主分片都有一个副本 (replica) 分布在不同的节点上,从而提供即时的容错能力。
创建索引命令:
```bash
curl -X PUT "http://node1_ip:9200/test_data_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3