Ubuntu 24.04 安装 Elasticsearch 8.6
本教程介绍如何在 Ubuntu 24.04 上安装 Elasticsearch 8.6.2 单节点服务。Elasticsearch 由 systemd 管理,数据存放在 /data/elasticsearch,并通过 HTTPS 和密码认证向局域网提供服务。
版本兼容性
Elasticsearch 8.6.x 已停止维护,且 Ubuntu 24.04 不在该版本的官方支持范围内。本教程用于部署指定的旧版本,正式上线前应在目标服务器上完成兼容性验证;新建生产环境时应优先选择仍受支持的版本。
1. 安装规划
| 项目 | 配置 |
|---|---|
| 操作系统 | Ubuntu 24.04 |
| Elasticsearch | 8.6.2 |
| 部署模式 | 单节点 |
| 服务管理 | systemd |
| 数据目录 | /data/elasticsearch |
| 配置目录 | /etc/elasticsearch |
| 日志目录 | /var/log/elasticsearch |
| 程序与内置 JDK | /usr/share/elasticsearch |
| HTTP 地址 | https://10.10.50.11:9200 |
Elasticsearch 的 DEB 安装包包含 JDK,不需要单独安装 Java。服务器上已有的 /data/mysql 不会被修改。
2. 下载并安装 Elasticsearch
安装基础工具:
bash
sudo apt-get update
sudo apt-get install -y curl ca-certificates下载 Elasticsearch 8.6.2 DEB 包及校验文件:
bash
mkdir -p ~/packages/elasticsearch
cd ~/packages/elasticsearch
ES_VERSION="8.6.2"
ES_ARCH="$(dpkg --print-architecture)"
curl -fLO \
"https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-${ES_ARCH}.deb"
curl -fLO \
"https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-${ES_ARCH}.deb.sha512"校验安装包,成功后再安装:
bash
sha512sum -c \
"elasticsearch-${ES_VERSION}-${ES_ARCH}.deb.sha512"
sudo dpkg -i \
"elasticsearch-${ES_VERSION}-${ES_ARCH}.deb"锁定版本,防止后续被 APT 意外升级:
bash
sudo apt-mark hold elasticsearch安装过程会创建 elasticsearch 系统用户、systemd 服务、HTTPS 证书和安全配置。保存安装输出中的 elastic 初始密码;如果没有生成密码,后续可手动重置。
3. 创建数据目录
如果 /data 是独立磁盘,先确认已经正确挂载:
bash
findmnt -T /data
df -h /data创建 Elasticsearch 专用数据目录:
bash
sudo install -d \
-o elasticsearch \
-g elasticsearch \
-m 750 \
/data/elasticsearch确认服务用户拥有写入权限:
bash
sudo -u elasticsearch test -w /data/elasticsearch && \
echo "数据目录权限正常"不要修改整个 /data 的所有者
不要执行 chown -R elasticsearch /data,否则会破坏 /data/mysql 等其他服务的数据目录权限。只修改 /data/elasticsearch。
4. 配置单节点和局域网访问
先备份原配置:
bash
sudo cp -a /etc/elasticsearch/elasticsearch.yml \
"/etc/elasticsearch/elasticsearch.yml.bak.$(date +%Y%m%d%H%M%S)"编辑配置文件:
bash
sudo nano /etc/elasticsearch/elasticsearch.yml修改或补充以下配置,每个配置项只保留一份:
yaml
cluster.name: es-single
node.name: es-node-01
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
# 节点间通信仅绑定本机
network.host: 127.0.0.1
# HTTP 客户端接口监听所有 IPv4 网卡
http.host: 0.0.0.0
http.publish_host: 10.10.50.11
http.port: 9200
discovery.type: single-node同时处理安装程序自动生成的配置:
- 保留全部
xpack.security.*配置。 - 保留
/etc/elasticsearch/certs下的证书配置。 - 删除或注释
cluster.initial_master_nodes整项。 - 确认没有第二份
network.host、http.host或discovery.type。
单节点配置冲突
discovery.type: single-node 不能与 cluster.initial_master_nodes 同时启用。DEB 安装程序可能自动写入后者,不移除会导致 Elasticsearch 启动失败。
可用以下命令检查是否存在冲突或重复项:
bash
sudo grep -nE \
'^[[:space:]]*(network\.host|http\.host|http\.publish_host|discovery\.type|cluster\.initial_master_nodes)' \
/etc/elasticsearch/elasticsearch.yml5. 设置内核参数
Elasticsearch 要求较高的 vm.max_map_count。如果系统当前值已经高于 262144,则保留更高的值:
bash
ES_MAP_COUNT="$(sysctl -n vm.max_map_count)"
ES_MAP_COUNT=$(( ES_MAP_COUNT < 262144 ? 262144 : ES_MAP_COUNT ))
echo "vm.max_map_count=${ES_MAP_COUNT}" | \
sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl -p /etc/sysctl.d/99-elasticsearch.conf验证结果:
bash
sysctl vm.max_map_count6. 设置 JVM 堆内存
Elasticsearch 与 MySQL 共用服务器时,建议明确限制堆内存,避免自动分配挤占 MySQL 和系统资源。下面以 1 GB 作为小规模环境的起步配置:
bash
sudo mkdir -p /etc/elasticsearch/jvm.options.d
sudo tee /etc/elasticsearch/jvm.options.d/heap.options \
>/dev/null <<'EOF'
-Xms1g
-Xmx1g
EOFXms 与 Xmx 应保持一致。Elasticsearch 的总内存占用会高于 JVM 堆大小,还应为操作系统文件缓存、MySQL 和其他服务预留足够内存。
7. 配置 systemd 挂载依赖
DEB 包已经提供 elasticsearch.service。增加数据目录挂载依赖,确保 /data 就绪后才启动 Elasticsearch:
bash
sudo mkdir -p \
/etc/systemd/system/elasticsearch.service.d
sudo tee \
/etc/systemd/system/elasticsearch.service.d/override.conf \
>/dev/null <<'EOF'
[Unit]
RequiresMountsFor=/data/elasticsearch
EOF如果 /data 是独立文件系统,应先在 /etc/fstab 中配置持久挂载。
重新加载 systemd 配置并启动服务:
bash
sudo systemctl daemon-reload
sudo systemctl enable --now elasticsearch.service
sudo systemctl status elasticsearch.service --no-pager -l什么时候需要 daemon-reload?
新增或修改 systemd unit、drop-in 文件后需要执行 daemon-reload。只修改 elasticsearch.yml 时不需要,直接重启 Elasticsearch 即可。
8. 配置防火墙
检查 UFW 状态:
bash
sudo ufw status如果 UFW 为 active,建议只允许实际局域网网段访问 TCP 9200。例如局域网为 10.10.50.0/24:
bash
sudo ufw allow from 10.10.50.0/24 \
to any port 9200 proto tcp如果确实需要允许任意来源访问:
bash
sudo ufw allow 9200/tcp不要关闭安全功能
http.host: 0.0.0.0 会让 9200 监听所有网卡。应保留 HTTPS 和密码认证,并通过 UFW、云安全组或上游防火墙限制访问来源。单节点环境不需要向外开放节点通信端口 9300。
9. 设置密码并验证服务
如果安装时没有获得 elastic 用户密码,或者需要重新设置密码:
bash
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password \
-u elastic -i在服务器本机验证访问,命令会提示输入密码:
bash
sudo curl \
--cacert /etc/elasticsearch/certs/http_ca.crt \
-u elastic \
'https://10.10.50.11:9200'返回结果中的版本应为:
json
{
"version": {
"number": "8.6.2"
}
}检查集群健康状态:
bash
sudo curl \
--cacert /etc/elasticsearch/certs/http_ca.crt \
-u elastic \
'https://10.10.50.11:9200/_cluster/health?pretty'检查 Elasticsearch 实际使用的数据目录:
bash
sudo curl \
--cacert /etc/elasticsearch/certs/http_ca.crt \
-u elastic \
'https://10.10.50.11:9200/_nodes/settings?filter_path=nodes.*.settings.path&pretty'结果中应显示 /data/elasticsearch。单节点集群无法分配副本分片,因此集群状态可能为 yellow;这不一定表示主分片不可用。
10. 局域网客户端访问
将服务器上的 CA 证书安全地复制到客户端:
text
/etc/elasticsearch/certs/http_ca.crt在客户端使用 CA 证书和 elastic 用户访问:
bash
curl \
--cacert ./http_ca.crt \
-u elastic \
'https://10.10.50.11:9200'如果出现证书地址不匹配,说明 HTTP 服务端证书中没有包含 10.10.50.11,需要重新签发包含该 IP 的证书。不要通过 curl -k、关闭 TLS 或关闭密码认证来长期绕过证书问题。
11. 日常管理
bash
# 启动
sudo systemctl start elasticsearch
# 停止
sudo systemctl stop elasticsearch
# 重启
sudo systemctl restart elasticsearch
# 查看状态
sudo systemctl status elasticsearch --no-pager -l
# 查看开机自启状态
sudo systemctl is-enabled elasticsearch
# 查看 systemd 日志
sudo journalctl -u elasticsearch -n 100 --no-pager
# 查看 Elasticsearch 应用日志
sudo tail -n 100 /var/log/elasticsearch/es-single.log
# 检查监听端口
sudo ss -lntp | grep -E ':(9200|9300)\b'详细运行错误通常写入 /var/log/elasticsearch,服务进程的启动与退出信息则在 journald 中。
12. 常见问题:服务启动失败
先收集状态和日志,不要删除数据目录或重新安装:
bash
sudo systemctl status elasticsearch.service \
--no-pager -l
sudo journalctl -u elasticsearch.service \
-b -n 80 --no-pager
sudo sh -c \
'tail -n 100 /var/log/elasticsearch/*.log'single-node 与引导配置冲突
如果日志包含以下错误:
text
setting [cluster.initial_master_nodes] is not allowed when
[discovery.type] is set to [single-node]编辑 /etc/elasticsearch/elasticsearch.yml,保留:
yaml
discovery.type: single-node删除或注释完整的 cluster.initial_master_nodes 配置。如果是多行形式,列表也要一并注释:
yaml
# cluster.initial_master_nodes:
# - ubuntu-2288H-V6修改后直接重启服务:
bash
sudo systemctl restart elasticsearch
sudo systemctl status elasticsearch --no-pager -l监听端口无法访问
依次检查监听地址、服务状态与防火墙:
bash
sudo ss -lntp | grep ':9200'
sudo systemctl status elasticsearch --no-pager -l
sudo ufw status监听地址应为 0.0.0.0:9200 或等效通配地址。还要检查云安全组和上游网络防火墙是否允许访问。
数据目录权限错误
检查目录的所有者、权限和挂载状态:
bash
findmnt -T /data/elasticsearch
sudo ls -ld /data /data/elasticsearch
sudo -u elasticsearch test -w /data/elasticsearch && \
echo "数据目录可写"需要修复时,只修改 Elasticsearch 自己的目录:
bash
sudo chown -R elasticsearch:elasticsearch \
/data/elasticsearch
sudo chmod 750 /data/elasticsearch