如何搭建你的第一个 Elasticsearch 开发集群

搭建本地 Elasticsearch 开发集群,验证集群健康状态,并避免常见的单节点和多节点配置错误。

如何搭建你的第一个 Elasticsearch 开发集群

搭建第一个 Elasticsearch 集群主要在于选择安全的开发配置,并验证节点是否成功加入预期的集群。单节点设置足以进行基本的索引和搜索测试;本地多节点设置则有助于学习发现和分片分配。

本文重点在于本地开发。请勿将这些宽松的设置用于公共或生产集群。

前提条件

在开始之前,请确保满足以下前提条件:

  1. Java 运行时: 较新的 Elasticsearch 发行版包含内置的 JDK。如果你使用的软件包或发行版不包含,请安装该 Elasticsearch 版本所需的 Java 版本。
  2. 下载 Elasticsearch: 从 Elastic 官方网站获取所需 Elasticsearch 版本的二进制发行版。
  3. 系统资源: 对于基本的开发测试,2GB 内存通常足够,但多节点测试建议使用更多内存。

第一步:下载并解压 Elasticsearch

下载完成后(通常为 .zip.tar.gz 文件),将压缩包解压到你希望存放集群文件的目录(例如 ~/elasticsearch-8.12.0)。该目录称为 Elasticsearch 主目录

第二步:配置单节点集群(开发默认)

默认情况下,首次运行 Elasticsearch 时,它会尝试以单节点集群启动。然而,现代版本通常需要显式配置,特别是关于安全和内存设置,即使是本地开发也是如此。

配置文件位于 Elasticsearch 主目录下的 config/ 目录中。

基本配置(config/elasticsearch.yml

主配置文件是 elasticsearch.yml。对于本地单节点设置,你至少需要配置集群名称和节点名称。

# 集群配置
cluster.name: dev-cluster

# 节点配置
node.name: node-1

# 网络设置(开发环境使用 localhost)
network.host: 127.0.0.1

# HTTP 端口(默认为 9200)
http.port: 9200

# 开发环境重要:初始禁用安全功能(生产环境请谨慎使用!)
xpack.security.enabled: false

安全警告: 禁用 xpack.security.enabled 是初始开发设置的常见做法,以简化测试。切勿在可公开访问的环境中运行此配置。对于较新的 Elasticsearch 版本(7.x+),如果保持安全功能启用,通常需要先运行设置命令来生成初始密码。

启动单节点

导航到解压目录的根目录,并运行相应的启动脚本。在 Linux/macOS 上:

./bin/elasticsearch

在 Windows 上使用 PowerShell:

.\bin\elasticsearch.bat

等待日志显示节点已成功启动,通常会出现类似 started 的消息。

第三步:验证集群状态

进程运行后,你可以使用 curl 针对默认 HTTP 端口(9200)验证集群状态。

检查集群健康

此命令检查集群的整体健康状态:

curl -X GET "http://localhost:9200/_cat/health?v"

预期输出片段:

epoch      timestamp cluster     status node.total node.data shards prio initialized
1678886400 10:00:00  dev-cluster green    1          1        0   0           1

status 字段应为 green,表示健康的单节点集群。

检查节点信息

你也可以验证节点信息:

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

第四步:设置多节点集群(用于更真实的测试)

为了进行更真实的开发或测试分片分配,你至少需要两个节点。这需要运行多个独立的 Elasticsearch 实例,每个实例具有不同的配置。

目录结构

在主工作区域内为每个节点创建单独的目录(例如 es_data/node1es_data/node2)。将基础 Elasticsearch 发行版复制到每个目录中,或将其链接到主安装目录。

节点配置差异

为每个节点创建一个唯一的 config/elasticsearch.yml 文件:

节点 1 配置(es_data/node1/config/elasticsearch.yml

cluster.name: dev-cluster
node.name: node-1
network.host: 127.0.0.1
http.port: 9200
transport.port: 9300
path.data: node1_data  # 唯一的数据路径
xpack.security.enabled: false
discovery.seed_hosts: ["127.0.0.1:9300", "127.0.0.1:9301"]
# 此行告诉节点 1 如何找到其他成员
cluster.initial_master_nodes: ["node-1", "node-2"]

节点 2 配置(es_data/node2/config/elasticsearch.yml

cluster.name: dev-cluster
node.name: node-2
network.host: 127.0.0.1
http.port: 9201  # 必须使用不同的 HTTP 端口
transport.port: 9301  # 必须使用不同的传输端口
path.data: node2_data  # 唯一的数据路径
xpack.security.enabled: false
discovery.seed_hosts: ["127.0.0.1:9300", "127.0.0.1:9301"]
# 此行告诉节点 2 如何找到其他成员
cluster.initial_master_nodes: ["node-1", "node-2"]

启动多节点集群

  1. 启动节点 1:导航到 es_data/node1 并执行 ./bin/elasticsearch
  2. 启动节点 2:导航到 es_data/node2 并执行 ./bin/elasticsearch

验证多节点集群

使用 API 针对 任意 运行中的 HTTP 端口(例如 9200)检查节点数量:

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

预期输出片段:

ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1    15           50       0   0.01    0.02    0.01    mdi        *      node-1
127.0.0.1    16           51       0   0.00    0.01    0.01    mdi        -      node-2

如果在 name 下看到两个条目,则多节点集群已正确形成。

开发环境最佳实践

  • 使用专用数据路径: 始终为每个节点显式配置 path.data,尤其是在多节点设置中,以防止实例之间意外数据污染。
  • 唯一端口: 为每个本地节点使用唯一的 HTTP 端口(http.port)和传输端口(transport.port),以避免冲突。
  • 内存锁定: 对于开发环境,确保没有遇到堆大小限制。如果遇到与内存相关的启动错误,可能需要调整 jvm.options 文件中的 JVM 堆大小(但默认值通常适用于基本测试)。

下一步:索引数据

集群运行后,下一步是创建索引并映射设置。例如,要创建一个名为 products 的简单索引:

curl -X PUT "http://localhost:9200/products?pretty"

这个基础设置允许你开始使用客户端库或 Kibana 与 Elasticsearch 进行交互。