配置基本三节点集群的分步指南

了解如何快速设置一个具有高可用性的基本三节点 Elasticsearch 集群。本分步教程涵盖 `elasticsearch.yml` 中的基本配置、使用 `cluster.initial_master_nodes` 引导集群发现、启动服务,以及使用实际的 cURL 命令跨节点验证集群健康状况和分片复制。

46 浏览量

配置基本三节点集群的分步指南

建立一个具有弹性的 Elasticsearch 集群,对于实现搜索和分析基础架构的高可用性和横向扩展至关重要。三节点集群提供了一个极好的起点,它具备必要的冗余能力,可以在单个节点发生故障时仍不中断服务。本综合指南将引导您完成安装、配置和验证一个基本三节点 Elasticsearch 集群的过程,这非常适合开发环境或小型生产部署。

完成本教程后,您将拥有一个功能齐全的集群,能够安全地分发和复制数据,充分利用 Elasticsearch 的核心分布式能力。


先决条件

在开始配置之前,请确保您已具备以下条件:

  1. 三台独立的服务器/虚拟机 (VMs): 每个服务器/VM 将承载一个节点。在本指南中,我们假设您已经准备好三台不同的机器或 Docker 容器。
  2. Java 开发工具包 (JDK): Elasticsearch 要求所有节点上都安装兼容的 JDK(例如,JDK 17,具体取决于您的 Elasticsearch 版本)。
  3. 网络连通性: 确保所有三个节点可以通过必要的端口进行通信(默认 HTTP 端口:9200,默认传输端口:9300)。
  4. 相同的 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

如果 statusgreennode.total3,则您的集群已正确启动并运行。

验证节点成员身份

要确认所有节点都能看到彼此,请检查节点列表:

curl -X GET "http://node1_ip:9200/_cat/nodes?v"

您应该看到三个不同的条目,分别对应于 node-1node-2node-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