1. Elasticsearch 单节点开发环境搭建与健康检查

Elasticsearch 单节点开发环境搭建与健康检查 学习卡片

单节点开发环境的核心约束

单节点 Elasticsearch 开发环境的关键特征是:只有一个节点同时承担主节点与数据节点角色。这意味着集群健康状态不会出现 green,因为副本分片无法分配到第二个节点。理解这一点,才能正确判断“服务是否可用”与“集群是否健康”的区别。

开发环境推荐使用 Docker 启动,避免手动安装 JDK、配置 elasticsearch.yml 和系统参数的繁琐过程。以下命令启动一个单节点容器,并关闭安全认证以便本地调试:

docker run -d \
  --name es-dev \
  -p 9200:9200 \
  -e discovery.type=single-node \
  -e xpack.security.enabled=false \
  -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
  docker.elastic.co/elasticsearch/elasticsearch:8.13.4

参数说明:discovery.type=single-node 跳过主节点选举,xpack.security.enabled=false 关闭 HTTPS 与账号密码,ES_JAVA_OPTS 限制堆内存避免开发机资源被占满。启动后等待约 20–40 秒,容器日志出现 started 即表示服务就绪。

健康检查的三个接口与判读逻辑

服务启动后,用三个 REST 接口从不同层面验证可用性:

  • GET /_cluster/health:返回集群整体状态。单节点下 status 通常为 yellow,number_of_nodes 为 1,active_shards 与 unassigned_shards 反映分片分配情况。
  • GET /_nodes:返回节点列表与角色信息。确认 nodes 下只有一个节点,且 roles 包含 data、master 等。
  • GET /_cat/indices?v:以表格形式列出索引。新环境通常为空,返回空表或仅系统索引。

判读要点:yellow 是单节点环境的正常状态,不是故障。若 status 为 red,说明主分片未分配,需检查磁盘、内存或启动日志。若接口无响应,优先确认容器是否运行、端口是否被占用。

开发环境关闭安全认证仅用于本地学习,切勿用于生产或暴露到公网。
Docker 容器 es-dev discovery.type single-node xpack.security false ES_JAVA_OPTS 512m 端口映射 9200:9200 镜像版本 8.13.4 启动 Elasticsearch 8.13.4 主节点角色 数据节点角色 单节点集群 HTTP 9200 就绪 GET /_cluster/health status: yellow number_of_nodes: 1 GET /_nodes nodes: 1 个节点 roles: data, master GET /_cat/indices?v 索引列表(新环境为空) 用于后续创建索引验证 健康状态判读逻辑 Y yellow — 正常 单节点副本无法分配,属预期 G green — 多节点 单节点环境不会出现 R red — 故障 主分片未分配,检查日志 验证顺序: 容器运行 → 9200 端口响应 → _cluster/health 返回 yellow → _nodes 确认单节点 → _cat/indices 可访问 若任一接口无响应,优先检查容器状态与端口占用,而非直接修改 Elasticsearch 配置。

验证操作与结果确认

按以下顺序执行验证,每一步都有明确的通过条件:

  1. 确认容器运行:docker ps --filter name=es-dev,状态应为 Up。
  2. 检查集群健康:curl -s localhost:9200/_cluster/health?pretty,预期 status 为 yellow,number_of_nodes 为 1。
  3. 查看节点信息:curl -s localhost:9200/_nodes?pretty,确认 nodes 对象下只有一个节点 ID,且 roles 包含 data 与 master。
  4. 列出索引:curl -s "localhost:9200/_cat/indices?v",新环境通常返回空表头或仅系统索引,能正常返回即表示 REST 层可用。

若第 2 步返回 red,常见原因是磁盘水位触发或 JVM 堆内存不足。可执行 docker logs es-dev 查看启动日志中的 disk watermark 或 OutOfMemoryError 关键字。若 9200 端口无响应,先用 docker logs es-dev 确认是否仍在启动中,再检查 lsof -i :9200 是否被其他进程占用。

开发环境搭建完成的标志:三个接口均能返回结构化 JSON 或表格数据,且 _cluster/health 的 status 为 yellow。此时即可进入索引创建与文档写入阶段。