Skip to content

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
Elasticsearch8.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

同时处理安装程序自动生成的配置:

  1. 保留全部 xpack.security.* 配置。
  2. 保留 /etc/elasticsearch/certs 下的证书配置。
  3. 删除或注释 cluster.initial_master_nodes 整项。
  4. 确认没有第二份 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.yml

5. 设置内核参数 ​

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_count

6. 设置 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
EOF

Xms 与 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

参考资料 ​