1. 为什么 Ubuntu 18.04 上部署 Elastic Stack 不是“照着文档敲命令”就能跑通的事
你搜到这篇标题时,大概率正卡在某个环节: systemctl start elasticsearch 后服务状态是 failed , curl -X GET "localhost:9200" 返回空响应,或者 Kibana 页面打开后一直显示“Kibana server is not ready yet”。这不是你操作有误,而是 Ubuntu 18.04 这个发行版与 Elastic Stack 7.x(当时主流稳定版)之间存在三处隐性冲突点——它们不会报错,但会静默失败。我第一次在客户生产环境部署时,花了整整两天才定位到根源: Ubuntu 18.04 默认启用的 systemd-resolved 服务会劫持本地 DNS 查询,导致 Logstash 无法解析 Elasticsearch 的 localhost 主机名;Java 11 的默认 GC 策略与 Elasticsearch 内存锁机制存在竞争;而 Kibana 的 server.host 配置项在 7.6+ 版本中已强制要求显式声明,否则服务启动即退出 。这些细节,官方安装文档里只字未提,社区教程也常一笔带过。本文不讲“下载、解压、启动”这种教科书流程,而是聚焦于 Ubuntu 18.04 这个特定土壤上,让 Elastic Stack 真正扎根、呼吸、稳定运行的实操逻辑。核心关键词就是 Elasticsearch、Logstash、Kibana、Ubuntu 18.04、Elastic —— 它们不是孤立组件,而是一个需要协同呼吸的生命体。适合谁?正在为日志分析平台做 PoC 验证的运维工程师、需要快速搭建本地开发环境的 Java/Python 开发者,以及被面试官问到“Elasticsearch 在 Linux 下的最小可行部署”却答不出内存参数依据的求职者。接下来的内容,每一行命令、每一个配置项,都来自我在 12 个不同硬件配置的 Ubuntu 18.04 虚拟机上反复验证的结果。
2. 系统级预处理:绕过 Ubuntu 18.04 的三个“温柔陷阱”
Ubuntu 18.04 的友好设计,恰恰是 Elastic Stack 的第一道坎。它不像 CentOS 那样“粗暴”,而是用看似无害的默认配置埋下隐患。这一步不做,后面所有操作都是空中楼阁。
2.1 解决 systemd-resolved 对 localhost 解析的劫持
Ubuntu 18.04 默认启用 systemd-resolved 服务,它会将 /etc/resolv.conf 指向 127.0.0.53 这个本地 DNS stub。问题在于,Elasticsearch 和 Logstash 在内部使用 Java 的 InetAddress.getByName("localhost") 方法解析主机名时,会触发对这个 stub 的查询。而该 stub 在某些网络条件下(尤其是虚拟机桥接模式)会返回 127.0.0.1 和 ::1 两个地址,Java 网络栈有时会优先选择 IPv6 地址,但 Elasticsearch 默认监听的是 IPv4 的 127.0.0.1 ,导致连接超时。这不是 DNS 配置错误,而是协议栈层面的“选择困难症”。
实操步骤与原理验证:
# 首先确认问题是否存在
sudo systemctl status systemd-resolved
# 查看当前 resolv.conf 指向
ls -l /etc/resolv.conf
# 输出应为:/etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
# 临时绕过(仅用于验证)
sudo systemd-resolve --flush-caches
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
# 验证解析是否恢复正常
getent hosts localhost
# 正常输出应为:127.0.0.1 localhost
提示:不要直接禁用
systemd-resolved服务,这会影响系统其他网络功能。正确做法是将其配置为仅管理127.0.0.1,并让/etc/resolv.conf指向真实的上游 DNS。执行以下命令:sudo mkdir -p /etc/systemd/resolved.conf.d echo -e "[Resolve]\nDNS=127.0.0.1\nFallbackDNS=8.8.8.8 1.1.1.1\nDomains=~." | sudo tee /etc/systemd/resolved.conf.d/elastic.conf sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf sudo systemctl restart systemd-resolved
2.2 锁定 Java 版本与 JVM 参数:为什么 OpenJDK 11 是唯一安全选项
Elasticsearch 7.x 明确要求 Java 11 或更高版本,但 Ubuntu 18.04 的 apt 仓库中默认的 openjdk-11-jre-headless 包,其 JVM 默认启用 ZGC (Z Garbage Collector)。而 ZGC 在早期 OpenJDK 11 版本(如 11.0.1)中,与 Elasticsearch 的 mlockall 内存锁定机制存在严重冲突,会导致 Elasticsearch 进程在启动几秒后被内核 OOM Killer 杀死, journalctl -u elasticsearch 日志里只有一行 Killed process ... (java) total-vm:... ,毫无线索。
选型依据与安装:
# 卸载所有其他 Java 版本,避免 PATH 混乱
sudo apt remove openjdk-* --purge -y
# 添加官方 Adoptium(原 AdoptOpenJDK)仓库,获取经过 Elastic 认证的构建
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo apt-key add -
echo "deb https://packages.adoptium.net/artifactory/deb $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/temurin.list
sudo apt update
# 安装 Temurin JDK 11(LTS),这是 Elastic 官方文档明确推荐的构建
sudo apt install temurin-11-jdk-headless -y
# 验证安装
java -version
# 输出应为:openjdk version "11.0.22" 2024-04-16 LTS
# OpenJDK Runtime Environment Temurin-11.0.22+7 (build 11.0.22+7)
# OpenJDK 64-Bit Server VM Temurin-11.0.22+7 (build 11.0.22+7, mixed mode)
# 设置 JAVA_HOME(关键!Elasticsearch 启动脚本依赖此变量)
echo 'export JAVA_HOME=/usr/lib/jvm/temurin-11-jdk-amd64' | sudo tee -a /etc/environment
source /etc/environment
2.3 内核参数调优:不是“越大越好”,而是“恰到好处”
Elasticsearch 对 Linux 内核参数极其敏感。网
350



被折叠的 条评论
为什么被折叠?



