上一篇讲架构,这一篇只做一件事:把 Elasticsearch 作为 ELK 的存储和查询底座稳定装起来,并留下生产化配置的判断框架。安装本身不难,难的是不要把一个临时单节点误当生产集群,也不要跳过安全、系统参数、数据目录、证书、密码、分片和生命周期这些后面一定会影响 Logstash、Kibana、Filebeat 的基础项。

本文以 Debian/Ubuntu 系统的 APT 安装为主,参考当前 Elastic 官方自托管 Debian 包文档。官方当前仓库路径使用 packages/9.x/apt;Elasticsearch 包内置 OpenJDK;首次启动会自动配置安全相关内容,生成 HTTP 与 transport TLS 配置;systemd 安装场景下,elastic 超级用户密码需要使用 elasticsearch-reset-password 设置或重置。不同版本细节会变化,生产安装前必须再核对目标版本文档和 release notes。

这篇不是“复制命令合集”。命令会有,但每条命令都服务于一个交付目标:节点能启动、能安全访问、能加入集群、能被 Kibana 和采集端使用、能在故障后恢复。

先理解 Elasticsearch 要承担什么

图:Elasticsearch 的核心不是单个进程,而是节点、索引、分片、副本、mapping 和生命周期组成的数据底座。

Elasticsearch 在 ELK 中承担三类职责:写入日志事件,建立可搜索索引,支持 Kibana 查询和聚合。它不是日志采集器,也不是 Dashboard 工具;采集交给 Filebeat/Agent,复杂解析交给 Logstash 或 ingest pipeline,展示交给 Kibana。

安装前先明确这台 Elasticsearch 的目标:

场景 目标 不应做什么
学习单节点 理解启动、安全访问、索引和查询 不承载生产日志
小型试点 接入少量日志,验证字段和看板 不忽略备份和生命周期
生产集群 高可用、可扩展、可恢复 不用单节点裸跑
平台底座 支撑多团队日志和查询 不允许字段和权限随意扩散

本篇会从单节点开始,再解释怎样扩展到多节点。单节点是学习路径,不是生产终点。

安装前检查

Elasticsearch 对系统参数比较敏感。安装前至少确认 CPU、内存、磁盘、系统版本、文件描述符、虚拟内存映射、交换分区和网络端口。

项目 学习环境 生产建议
CPU 2 核起 按写入和查询量评估
内存 4GB 起 16GB 起,堆内存不超过约一半
磁盘 本地 SSD 更好 关注 IOPS、容量、水位、快照
系统 Debian/Ubuntu/RHEL 等受支持系统 使用官方支持矩阵
端口 9200 HTTP,9300 transport 仅对可信网络开放

关键系统参数:

bash
cat /proc/sys/vm/max_map_count
ulimit -n
free -h
df -h

vm.max_map_count 通常需要至少 262144。官方安装脚本在 systemd 系统上可能会尝试设置相关内核参数,但生产环境仍应显式检查。交换分区建议关闭或避免 Elasticsearch 被 swap 影响。文件描述符要足够,否则大量分片和连接时会出问题。

设置示例:

bash
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl --system

不要在没有容量规划的机器上直接安装。Elasticsearch 写入容易成功,磁盘水位问题会在几天或几周后出现。至少估算每日写入量、保留天数、副本数和索引膨胀。

这里有一个容易被忽略的判断:安装方式不是单纯的个人偏好,而是后续运维责任的分界。APT/RPM 更接近传统主机运维,适合已有 systemd、主机监控、集中补丁和磁盘挂载规范的环境;Docker 适合开发验证、不可变镜像和编排平台,但要额外处理持久卷、内核参数、证书挂载和容器重启策略;Kubernetes/ECK 则适合已经有成熟集群、存储类、准入控制和证书管理的平台团队。不要因为 Docker 启动快,就把生产数据随便放在一个未命名 volume 里;也不要因为主机包安装熟悉,就跳过配置漂移和版本锁定。

安装前还要把数据路径单独确认出来。Elasticsearch 的数据目录不是普通缓存目录,里面保存分片数据、事务日志和集群元数据。生产环境通常至少要回答四个问题:磁盘是否独立挂载,是否会被系统盘日志挤占,是否进入主机容量告警,是否有快照恢复路径。很多日志平台不是因为 Elasticsearch 安装失败而不可用,而是因为最初把数据放在默认系统盘,几周后磁盘水位触发只读保护,所有采集端一起报错。

还要提前决定时间和 DNS。日志查询强依赖时间戳,节点时间漂移会让写入、告警和证书判断都变得混乱。生产节点应接入统一 NTP,节点名称和地址要稳定,不要用会频繁变化的临时主机名。集群证书、Kibana enrollment、Logstash 输出配置、Filebeat 输出配置都会引用这些地址;如果安装当天随手填,后续改名会牵动整条链路。

一份可执行的安装前清单可以这样写:

检查项 要求 不满足时的后果
系统版本 在 Elastic 支持矩阵内 安装包、JDK 或 systemd 行为不一致
时间同步 NTP 正常 证书、告警、查询窗口和日志顺序异常
数据盘 独立挂载并监控 系统盘被日志数据写满
DNS/主机名 稳定且可解析 节点加入和证书校验反复失败
防火墙 只开放必要端口 9200/9300 暴露或节点互联失败
权限归属 elasticsearch 用户可读写 服务启动或写入分片失败

这张表看起来像运维前置工作,但它决定了后面能不能稳定接入 Logstash、Kibana 和 Filebeat。安装命令执行一次就结束,前置约束会跟着集群运行很久。

使用 APT 安装

Elasticsearch 单节点安装与配置链路

图:单节点安装的关键链路是包源、系统服务、安全初始化、密码、证书和访问验证。

导入签名 Key:

bash
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

添加 9.x APT 源:

bash
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/9.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-9.x.list

安装:

bash
sudo apt-get update
sudo apt-get install elasticsearch

如果要锁定版本,不要盲目安装 latest。先确认 Kibana、Logstash、Beats/Agent 版本兼容,再指定版本安装。生产集群升级也不能每台机器随意 apt upgrade,要有滚动升级方案。

安装后先不要急着改一堆配置。先看配置目录、数据目录、日志目录:

路径 说明
/etc/elasticsearch/ 配置、证书、keystore
/var/lib/elasticsearch/ 数据目录
/var/log/elasticsearch/ 日志目录
/usr/share/elasticsearch/ 程序和工具

这些路径要进入备份、监控和运维文档。尤其是数据目录和证书目录,不要混在临时磁盘上。

如果企业内部有统一软件仓库,可以把 Elastic 官方仓库同步到内网源,但要保留包签名校验和版本号。不要把下载下来的 .deb 包零散放在共享目录里手工安装,因为这样很难知道某台节点到底来自哪个构建、是否被替换、升级时是否能回滚。Elasticsearch 集群对版本一致性很敏感,安装记录必须能回答“当前节点版本、安装时间、安装源、升级前版本、回滚包位置”这些问题。

版本策略建议保守一点。学习环境可以跟随当前大版本;生产环境应先确定整个 Elastic Stack 的兼容组合,再安装同一小版本。Kibana 通常需要和 Elasticsearch 保持同主版本且版本匹配,Logstash 和 Beats 虽然有一定兼容空间,但字段模板、集成包、API 行为仍可能受版本影响。一个常见错误是 Elasticsearch 先升级,Kibana 还停在旧版本,结果 UI、Saved Objects 或 Fleet 集成出现兼容问题。

安装完成后可以先做只读检查,不要立刻导入业务数据:

bash
dpkg -l | grep elasticsearch
sudo systemctl is-enabled elasticsearch.service
sudo install -d -o elasticsearch -g elasticsearch /var/lib/elasticsearch
sudo install -d -o elasticsearch -g elasticsearch /var/log/elasticsearch

这些命令不是必须每次都敲,但适合写进交付脚本。它们能提前发现包版本不对、服务没有设置自启动、目录权限被误改这类低级问题。日志平台的第一天问题越少,后面排查应用日志时越不会被基础设施噪声干扰。

如果需要在离线环境安装,还要同时准备 GPG key、安装包、依赖包和版本校验记录。离线安装最怕“先装起来再说”,因为后续补节点或恢复节点时找不到相同版本包。建议把安装介质、校验值和安装命令一起归档,恢复演练时直接使用同一套介质。

启动和安全初始化

启用并启动服务:

bash
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
sudo systemctl status elasticsearch.service

查看日志:

bash
sudo journalctl -u elasticsearch.service --no-pager -n 100
sudo tail -n 100 /var/log/elasticsearch/elasticsearch.log

当前官方文档说明,首次启动会自动完成安全配置,包括生成 TLS 证书、写入安全配置,并为 Kibana 连接生成 enrollment token。在 systemd 方式下,elastic 密码不会直接显示在启动终端里,需要用工具重置:

bash
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

把生成的密码保存到安全密码库,不要写进普通文档。然后使用 CA 证书验证 HTTPS:

bash
export ELASTIC_PASSWORD='替换为实际密码'

curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200

能返回节点和版本信息,才算基础访问通过。注意使用 HTTPS 和 CA 证书。很多旧教程还在用 http://localhost:9200 无认证访问,这不适合当前默认安全配置。

首次启动还有一个重要产物:自动生成的证书和安全配置。它让单节点很快可用,但也会让一些旧经验失效。比如以前很多验证命令默认用 HTTP,现在需要 HTTPS;以前 Kibana 直接填 http://localhost:9200,现在需要 enrollment 或显式配置证书;以前 Logstash output 可以只写 hosts,现在还要提供 CA、账号或 API Key。文章后面的 Filebeat 和 Logstash 都会受到这个变化影响。

在安装记录里至少保存这些信息:

信息 存放位置 注意事项
CA 指纹或 CA 文件路径 密码库或运维文档 不要把私钥贴到普通文档
elastic 密码 密码库 只用于初始化和紧急管理
enrollment token 生成方式 运维手册 token 有有效期,需要按需重新生成
服务日志路径 运维手册 排障时先看 systemd 和 ES 日志
配置变更记录 Git 或变更系统 便于回滚和审计

不要为了省事把安全配置关掉。关闭安全会让后续文章的实践都变得不真实:Kibana、Logstash、Filebeat 在生产里都需要认证和证书;如果学习阶段完全跳过,真正上线时会把大量问题集中到最后一天。更合理的做法是在学习环境也保持安全开启,只是把证书、账号和网络范围控制在最小规模。

单节点配置边界

学习或本机试点可以使用单节点,但要明确边界。单节点没有副本高可用,节点故障就是服务不可用。可以设置:

yaml
cluster.name: elk-lab
node.name: es-lab-01
network.host: 127.0.0.1
http.port: 9200
discovery.type: single-node

如果只是本机实验,network.host 保持本地更安全。不要为了方便直接绑定 0.0.0.0 并暴露 9200。Elasticsearch 是数据底座,不应该裸露在公网。

如果需要让 Kibana 或其他主机访问,先规划可信网络、防火墙、TLS 和账号。开放端口前先确认:

  1. 是否只允许内网访问;
  2. 是否使用 HTTPS;
  3. 是否使用最小权限账号;
  4. 是否有审计和访问日志;
  5. 是否知道数据里有什么敏感信息。

单节点也可以验证索引和查询:

bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  -H 'Content-Type: application/json' \
  -X PUT https://localhost:9200/logs-demo

写入一条文档:

bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  -H 'Content-Type: application/json' \
  -X POST https://localhost:9200/logs-demo/_doc \
  -d '{"@timestamp":"2026-06-11T10:00:00+08:00","service.name":"demo","log.level":"INFO","message":"hello elasticsearch"}'

查询:

bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  'https://localhost:9200/logs-demo/_search?q=service.name:demo'

这组验证不是生产写法,只用于确认节点、认证、证书、索引和查询都正常。

单节点还要处理副本策略。默认索引如果设置 number_of_replicas: 1,在单节点环境里副本无法分配,集群会显示 yellow。这不代表主分片不可用,但会让初学者误以为安装失败。学习环境可以把测试索引副本设为 0;生产环境则不应该通过把副本设为 0 来掩盖高可用问题。

示例:

bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  -H 'Content-Type: application/json' \
  -X PUT https://localhost:9200/logs-demo/_settings \
  -d '{"index":{"number_of_replicas":0}}'

这条命令只能用于理解 yellow 的原因,不能复制成生产规范。生产中副本数量要和节点数、数据价值、查询压力一起设计。错误的副本配置有两种极端:副本太少,节点坏了就丢可用性;副本太多,写入和存储成本被放大,还可能因为磁盘不足导致分片无法分配。

单节点也适合练习配置变更的节奏。每次只改一个变量,修改前备份配置,修改后重启服务并检查日志。不要同时改 network.host、证书、JVM、数据目录和 discovery;一旦启动失败,很难判断是哪一项导致。这个习惯在多节点里更重要,因为错误配置可能影响整个集群状态。

多节点集群配置

Elasticsearch 集群安全与扩展

图:多节点集群要处理 transport 互联、节点发现、证书、节点角色和重启后的重新加入。

多节点不是把单节点复制三份那么简单。必须处理集群名称、节点名称、网络绑定、transport 端口、节点发现、证书、初始主节点和 enrollment。

第一台节点需要让其他节点能访问 transport:

yaml
cluster.name: elk-prod
node.name: es-prod-01
network.host: 10.0.0.11
transport.host: 10.0.0.11

为新节点生成 enrollment token:

bash
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node

在新节点上使用 reconfigure 工具:

bash
sudo /usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <enrollment-token>

官方文档提醒,enrollment token 有有效期;并且多节点集群加入第二个节点后,要检查所有节点配置,确保重启后能重新发现彼此。特别是第一台节点,不能长期停留在单节点启动状态。

生产角色建议拆分:

角色 说明
master-eligible 管理集群状态,不承载大量查询写入
data_hot/data_content 存储热数据或内容数据
ingest 执行 ingest pipeline
coordinating 处理客户端请求和聚合转发

小集群不必一开始拆很多角色,但要理解角色会影响容量和故障域。三节点生产集群至少要避免所有节点同时承担不可控负载。

多节点集群要特别关注 cluster.initial_master_nodes 和节点发现配置。这个配置用于首次形成集群,不应该长期当成日常发现机制乱放。集群已经形成后,重启节点依赖的是已有集群状态和发现地址。如果复制配置时把旧的初始化列表、错误的节点名或单节点 discovery 一起带到新节点,轻则节点无法加入,重则造成误判和危险操作。

生产最小化拓扑可以从三台节点开始,但不是所有三节点都等价:

拓扑 适用情况 风险
3 台混合角色节点 小型生产或试点 查询、写入、master 竞争资源
3 master + 2 data 中等写入和查询 成本更高,但故障域清晰
hot/warm 分层 长保留日志 生命周期和磁盘规划更复杂
ingest 独立节点 大量 pipeline 处理 需要额外容量和路由

对大多数刚落地的 ELK 平台,第一阶段不必追求复杂拓扑,而是要避免两个错误:所有东西都塞到一台机器,或者在没有团队运维能力时一上来拆十几种角色。拓扑越复杂,升级、证书、容量、排障和监控都越复杂。

节点加入后要做集群级检查:

bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200/_cat/nodes?v

curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200/_cat/master?v

curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200/_cat/shards?v

检查结果要能说明三件事:节点都在同一个 cluster name 下,当前 master 符合预期,分片没有异常堆积。不要只看服务都在 running。Elasticsearch 进程启动成功,不等于集群状态健康。

跨机房部署要更谨慎。Elasticsearch 对节点间延迟、网络抖动和分片恢复很敏感。不要把一个普通局域网集群直接拉成跨城集群来“省备份”。如果目标是灾备,优先考虑快照、跨集群复制或明确的恢复流程,而不是让同一个集群跨不稳定网络承载实时写入。

JVM 和内存配置

Elasticsearch 运行在 JVM 上。堆内存设置不宜超过物理内存一半,也不宜超过压缩指针边界。现代 Elasticsearch 对堆配置有自动化能力,但生产环境仍应明确记录和观察。

查看 JVM 参数:

bash
sudo systemctl cat elasticsearch
sudo ls /etc/elasticsearch/jvm.options.d/

如果确实需要自定义 heap,使用 /etc/elasticsearch/jvm.options.d/ 下的单独文件,不要直接改发行版默认文件。例如:

text
-Xms4g
-Xmx4g

堆内存不是越大越好。Elasticsearch 还需要大量文件系统缓存。日志搜索依赖磁盘和缓存,给 JVM 全部内存会让操作系统缓存不足,查询反而慢。

要关注这些信号:

信号 含义
JVM GC 频繁 堆压力或查询/聚合过重
磁盘 IO 高 热数据查询或写入压力
CPU 高 查询、聚合、merge 或 ingest 压力
heap used 长期高 分片、字段、聚合或缓存问题

内存优化不能脱离索引和查询。字段爆炸、分片过多、聚合大字段,比单纯 heap 小更常见。

除了 heap,还要理解 bootstrap checks。Elasticsearch 在绑定非本地地址、进入生产式网络配置后,会对系统参数执行更严格检查。它不是故意增加安装难度,而是在阻止一个看起来能启动、实际无法承载压力的节点加入集群。常见检查包括文件描述符、线程数、虚拟内存映射、内存锁定和 discovery 配置。

如果启动日志里出现 bootstrap check failure,不要通过把 network.host 改回 localhost 来绕过去。那只是把生产问题藏起来。正确做法是逐项修复系统限制,并把修复方式写入主机初始化脚本。比如文件描述符和进程限制通常要通过 systemd service 限制、limits 配置或发行版默认配置确认,而不是只在当前 shell 里 ulimit 一次。

磁盘配置也属于性能配置。Elasticsearch 有 segment merge、translog、refresh、replica sync 等写入行为,机械盘或共享慢盘会迅速暴露问题。日志场景通常写入持续、查询突发,如果磁盘延迟高,表现可能不是单一错误,而是写入队列、查询超时、merge 压力和 GC 一起出现。安装阶段至少要记录磁盘类型、挂载点、容量、预期写入量和水位告警。

分片数量是另一个隐形成本。很多团队按天、按服务、按环境、按日志类型组合命名索引,最后一天生成几百上千个小分片。每个分片都会占用 heap、文件句柄和集群状态成本。安装配置阶段就应该定义索引命名和 rollover 策略,避免后续由每个采集配置自由创建索引。

索引模板和数据流

生产日志不建议直接写入随意索引。应使用 index template 或 data stream。日志类数据非常适合 data stream,因为它天然按时间追加写入,并需要 rollover 和生命周期管理。

一个简化模板可以表达核心字段:

json
{
  "index_patterns": ["logs-app-*"],
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "service.name": { "type": "keyword" },
        "host.name": { "type": "keyword" },
        "log.level": { "type": "keyword" },
        "message": { "type": "text" },
        "http.response.status_code": { "type": "integer" },
        "event.dataset": { "type": "keyword" }
      }
    }
  }
}

真实环境可以使用 Elastic 集成自带模板,也可以按 ECS 扩展。关键是不要等字段冲突后再补救。模板是采集前的契约。

日志写入前,要确认三个字段:

  1. @timestamp 是事件时间;
  2. service.name 能区分业务服务;
  3. event.dataset 或索引命名能区分日志类型。

没有这三个字段,后续 Kibana Dashboard 和告警都很难标准化。

模板设计要和 ECS 对齐,但不必一开始追求字段大全。更实用的做法是先固定平台级字段,再允许业务字段逐步扩展。平台级字段包括 @timestampservice.namehost.nameevent.datasetlog.levelmessagetrace.idspan.idlabels.* 等。业务字段可以放在明确命名空间下,避免和 ECS 字段冲突。

mapping 冲突通常来自三类情况:同名字段在不同服务里类型不同,同一个字段有时是对象有时是字符串,日志解析失败后把结构化字段写成原始文本。Elasticsearch 一旦为字段建立 mapping,后续不同类型写入会失败。安装阶段虽然还没有 Logstash 和 Filebeat,但应该提前确定“字段冲突如何处理”:是进入死信索引、丢弃异常字段、重命名字段,还是阻断写入并告警。

一个更贴近日志平台的模板策略可以分层:

层级 内容 谁负责
平台模板 ECS 基础字段、动态模板、默认副本 平台团队
数据集模板 Nginx、应用、审计等字段 平台与业务共同维护
业务扩展 特定服务字段 业务团队提交变更
临时验证 PoC 或迁移测试字段 有过期时间

这样做的目的不是制造流程,而是防止一个业务服务的随意字段污染整个平台。Kibana 看板、告警规则、Dify 或其他自动化分析都会依赖字段稳定性。字段不稳定,后面的智能分析也只能在噪声上做猜测。

写入方式也要提前统一。新日志建议使用 data stream;历史兼容场景可以继续使用普通索引,但要明确退役计划。Data stream 强制围绕 @timestamp 和 backing indices 工作,更适合 rollover 和生命周期管理。普通索引更自由,但也更容易被随意创建和长期遗留。

生命周期策略

Elasticsearch 生产优化

图:生产优化不只是 JVM,还包括索引模板、生命周期、磁盘水位、快照和查询治理。

日志数据必须有保留策略。可以按数据类型设计:

数据 热保留 总保留 说明
应用错误日志 14 天 30 天 高频排障
Nginx access log 7 天 14 天 数据量大
审计日志 30 天 180 天 合规要求
Debug 日志 1 到 3 天 3 天 低价值高噪声

生命周期策略要和磁盘水位一起监控。不要等磁盘 95% 后手工删索引。Elasticsearch 有磁盘水位保护,磁盘过高时会影响分片分配和写入。容量规划和 ILM 是安装阶段就要考虑的事。

快照也要配置。副本不是备份。误删、误写、mapping 错误、生命周期误配置都可能同步到副本。生产集群至少要有快照仓库和恢复演练。

生命周期策略不要只写“保留 30 天”。真正要落地,需要把 rollover 条件、阶段迁移、删除时间和查询体验一起定义。比如每天 200GB 的 access log 和每天 2GB 的错误日志,不能用同一个 rollover 条件;审计日志虽然查询频率低,但保留时间长,可能更适合温数据或快照归档;debug 日志价值低,应该更短保留并限制写入。

一个可执行的 ILM 设计通常包括:

决策 示例 说明
rollover 50GB 或 1 天 控制单个 backing index 大小
hot 阶段 7 到 14 天 支撑高频查询和告警
warm/cold 视许可证和架构而定 降低长期保存成本
delete 14/30/180 天 和合规、排障周期一致
snapshot 删除前或定期 支撑误删和灾难恢复

如果暂时没有冷热分层能力,也要先有删除策略和快照策略。没有 ILM 的日志平台会自然走向两个结果:磁盘被写满,或者靠人工删除索引救火。人工删除一旦删错,副本也救不了。

快照仓库要独立于 Elasticsearch 数据盘。对象存储、共享文件系统或官方支持的仓库类型都可以,但要测试恢复。只配置 snapshot policy 不做 restore 演练,等于只完成了一半。恢复演练至少要覆盖:恢复到临时集群、恢复单个索引、恢复后验证文档数量和查询结果、确认权限和模板是否需要重新处理。

还要为 mapping 错误准备恢复方案。如果某天一个采集配置把 http.response.status_code 写成字符串,导致新数据写入失败,处理步骤通常包括暂停错误采集、修正 pipeline 或模板、重放失败数据,必要时新建正确索引并 reindex。安装阶段建立好模板和死信意识,后面 Logstash 篇才有落点。

安全配置和最小权限

默认安全配置解决了“裸奔”问题,但生产还要做账号和权限治理。不要长期使用 elastic 超级用户给 Kibana、Logstash、Filebeat 或应用使用。

建议创建不同用途账号或 API Key:

用途 权限
Kibana 系统账号 Kibana 内部使用
Filebeat 写入 只写指定数据流或索引
Logstash 写入 只写目标索引,必要时管理模板
查询用户 只读指定索引
管理员 少数人使用,带审计

最小权限的价值在故障时才明显。采集端 Key 泄露时,如果它只有写入某个数据流权限,影响范围有限;如果它是超级用户,整个集群都暴露。

TLS 证书也要管理。默认自动生成证书适合快速启动,生产环境可能需要使用企业 CA、统一证书轮换和明确 SAN。证书过期会直接影响 Kibana、Logstash、Beats 和客户端连接。

权限设计不要等 Kibana 上线后再补。至少要把平台管理员、运维查询者、业务查询者、采集写入者、自动化程序分开。elastic 用户只应该用于初始化和紧急修复;日常 Kibana 登录、Logstash 写入、Filebeat 写入、Dify 分析读取都应该使用各自账号或 API Key。

API Key 的好处是可撤销、可限定权限、适合自动化系统使用。缺点是如果没有命名规范和过期策略,也会变成一堆没人知道用途的凭证。建议命名时包含用途、环境和负责人,例如 filebeat-prod-nginx-writelogstash-prod-app-writedify-prod-logs-read。凭证创建、轮换、吊销都要留痕。

还要考虑字段级敏感信息。Elasticsearch 默认不会理解哪段日志是密码、token、身份证号或内部 IP。安全治理不能只靠索引权限,还要在采集和解析阶段做脱敏、丢弃或隔离。安装配置阶段至少要明确:敏感日志是否允许进入集群,哪些索引需要更严格访问控制,哪些团队可以查询原始 message。

网络层同样重要。9200 是客户端 HTTP 访问端口,9300 是节点间 transport 端口。客户端不应该访问 9300,普通用户不应该直接访问数据节点。生产环境通常通过负载均衡、协调节点或内网域名暴露 Elasticsearch HTTP 入口,并用防火墙限制来源。不要把 9200 暴露到公网后再依赖强密码兜底。

健康检查和常见故障

Elasticsearch 故障排查闭环

图:排障要从服务状态、日志、证书、集群健康、分片和磁盘水位逐层检查。

常用检查:

bash
curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200/_cluster/health?pretty

curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200/_cat/nodes?v

curl --cacert /etc/elasticsearch/certs/http_ca.crt \
  -u elastic:$ELASTIC_PASSWORD \
  https://localhost:9200/_cat/indices?v

常见问题:

问题 排查
服务启动失败 journalctl、配置 YAML、系统参数
HTTPS 访问失败 CA 证书、密码、协议是否用 https
集群 yellow 副本无法分配,单节点有副本常见
集群 red 主分片不可用,要立即查分片和磁盘
写入失败 mapping 冲突、权限、磁盘水位
查询慢 分片过多、聚合过重、磁盘慢、缓存不足
节点无法加入 cluster.name、transport、证书、discovery

单节点看到 yellow 不一定是严重问题,可能是副本无处分配;生产集群 red 则必须立即处理。

排障时要区分“节点问题、集群问题、索引问题、客户端问题”。这四类问题看起来都会表现为写入失败或查询慢,但处理方向不同。节点问题看 systemd、JVM、磁盘和网络;集群问题看 master、节点发现和分片分配;索引问题看 mapping、模板、ILM 和磁盘水位;客户端问题看认证、证书、请求体和重试策略。

例如 Logstash 报 400,通常不是 Elasticsearch 服务挂了,而是 mapping 冲突或请求格式错误;Filebeat 报 401/403,多半是账号、API Key 或索引权限问题;Kibana 能打开但看不到数据,可能是 data view、时间范围或 @timestamp 问题;查询偶发超时,可能是聚合字段、分片数量或磁盘延迟问题。安装阶段把这些分类写清楚,后续接入组件时就不会把所有错误都归咎于“ES 不稳定”。

常用的排障顺序可以固定下来:

  1. 先看服务是否运行,避免在客户端层浪费时间;
  2. 再看 _cluster/health,判断是否是集群级故障;
  3. 再看 _cat/nodes_cat/shards,确认节点和分片;
  4. 再看具体索引 settings、mapping 和写入错误;
  5. 最后回到采集端或查询端配置。

这个顺序不是绝对,但能减少来回跳跃。尤其在生产事故中,先确认集群是否 red、磁盘是否满、master 是否稳定,比追某条应用日志更重要。

还要把“重启”当成最后手段之一,而不是第一反应。Elasticsearch 重启会触发分片恢复、缓存丢失、master 重新协调等动作。单节点重启影响服务可用性,多节点连续重启可能造成恢复风暴。正确做法是先定位问题,再决定是否滚动重启,并在重启前确认集群健康、分片分配和快照状态。

对于常见证书问题,可以用 curl -v 和 CA 文件定位。看到 certificate verify failed,不要直接加 -k 写进正式配置。-k 只适合临时验证“服务是否活着”,不适合作为生产连接方式。正式连接必须让客户端信任正确 CA,或者使用企业 CA 签发的证书。

从安装到交付

Elasticsearch 安装完成,不等于平台可用。交付前至少确认:

项目 证据
服务 systemd 状态正常,重启后可用
安全 HTTPS、密码、CA 证书、非超级用户账号
集群 health、nodes、shards 正常
写入 测试索引或数据流可写
查询 _search 和 Kibana 能查询
模板 核心字段 mapping 正确
生命周期 保留策略和 rollover 明确
备份 快照策略和恢复演练计划
监控 磁盘、JVM、写入失败、集群状态

这份清单应该写进运维文档。后续 Logstash、Kibana、Filebeat 都依赖这个底座。如果 Elasticsearch 安装阶段没有证据,后面排障会反复回到基础问题。

交付还应包含一次“断电式”验证。不是一定要真的断电,而是模拟服务重启、节点重启或配置回滚。单节点至少验证 systemctl restart elasticsearch 后数据仍可查询,密码和证书仍可使用;多节点至少验证单台 data 节点滚动重启后集群能恢复 green 或符合预期状态。没有重启验证的安装,只能证明当前进程活着,不能证明平台可接管。

升级和回滚也要在第一天写好。Elastic Stack 升级通常要求阅读目标版本 upgrade notes,先备份,检查 deprecated settings,按顺序滚动升级节点,再升级 Kibana 和相关组件。不要把升级简化成“所有节点 apt upgrade”。如果升级失败,回滚也不一定能直接降级数据目录,所以升级前快照、测试环境验证和维护窗口很关键。

交接文档建议包含这些内容:

文档项 内容
版本与安装源 Elasticsearch/Kibana/Logstash/Beats 版本和仓库
节点清单 IP、主机名、角色、数据盘、JVM
访问方式 HTTPS 地址、CA、账号申请方式
索引规范 data stream、模板、命名、字段责任
生命周期 ILM、保留天数、快照策略
告警 磁盘、JVM、health、写入失败、证书
运维动作 重启、扩容、升级、恢复、凭证轮换

这不是为了形式完整,而是为了后面的系列文章能继续向前走。Logstash 需要知道写到哪个数据流、用什么账号、失败怎么重放;Kibana 需要知道 data view 和字段语义;Filebeat 需要知道证书和写入权限。Elasticsearch 安装配置越清晰,后续组件越少靠猜。

最后还要留下一个验收样例。建议保留一条可重复写入、可重复查询、可安全删除的测试数据流,用来在升级、证书轮换、账号轮换和新采集端接入后做快速回归。这个样例不承载业务含义,只证明链路仍然可用。

本篇结论

Elasticsearch 是 ELK Stack 的核心,但它不是“装一个搜索服务”这么简单。当前版本默认安全配置已经改变了旧教程里的很多习惯:HTTPS、证书、密码、enrollment、systemd 下的密码重置,都要按官方流程处理。生产配置还要进一步处理系统参数、节点角色、索引模板、生命周期、权限、快照和监控。

下一篇会进入 Logstash 数据管道。只有 Elasticsearch 的索引、mapping、权限和生命周期先稳住,Logstash 解析出来的数据才有可靠落点。

参考资料