Elasticsearch 安装与配置:别让第一步绊倒你

好,到了真刀真枪的环节了。很多同学装 ELK 第一步就栽在 Elasticsearch 上——不是版本不对就是配置漏项,启动报错一长串,看着头皮发麻。别急,我带你一步一步来。

本节目标很明确:单节点 Elasticsearch 装好、配好、跑起来,再用 API 验证集群状态。所有操作基于 CentOS 7 / Ubuntu 20.04,Java 环境我默认你已经配好了。没配?停,先去装 JDK 11 或 17,ES 7.x 以上必须用这两个版本。

3.1 下载与安装:选对版本比什么都重要

我个人习惯直接从官方源下载,不用包管理器里的老版本。你去 Elastic 官网下载页面,找到对应系统的 tar.gz 包。为什么不用 rpm/deb?因为后面调配置、换目录、做快照都更灵活。

版本建议:生产环境选 7.17.x 或 8.11.x 的 LTS 版本。千万别追最新版,除非你想给 Elastic 当小白鼠。
# 下载 7.17.12(举例)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.12-linux-x86_64.tar.gz

# 解压到 /usr/local 下
tar -xzf elasticsearch-7.17.12-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local/elasticsearch-7.17.12/

解压完我建议你立刻改个软链接,方便以后升级时切换目录。

ln -s /usr/local/elasticsearch-7.17.12 /usr/local/elasticsearch

嗯,这里要注意:Elasticsearch 坚决不能用 root 用户启动。我当时第一次装直接 sudo ./bin/elasticsearch,报错说“不能以 root 运行”……好吧,老老实实创建专用用户。

groupadd elastic
useradd elastic -g elastic -s /bin/bash
chown -R elastic:elastic /usr/local/elasticsearch*

3.2 配置文件详解:每个参数背后都有故事

配置文件在 config/elasticsearch.yml。默认里面全是注释,但你必须改几个关键项。我见过太多人直接启动,然后发现外网连不上、内存炸了、数据路径不对——全是配置文件偷懒埋的雷。

配置项作用推荐值我的踩坑经验
cluster.name集群名称,同一集群必须相同如 pki-log-cluster千万别用默认的 elasticsearch,多集群混在一起时你会疯
node.name节点名称,集群内唯一主机名或随意,如 node-1我习惯用 ${HOSTNAME} 变量,省得每台改
path.data数据存储目录独立磁盘路径,如 /data/es/data用默认路径?系统盘一满,集群直接 red
path.logs日志目录同 data 盘下建 logs 子目录日志轮转要配,不然半年后几个 G 的 gc.log 等着你
network.host绑定的网络地址内网 IP 或 0.0.0.0(谨慎)千万不要在生产暴露公网!
http.portHTTP 端口9200和 Kibana 通信用,防火墙上只对内开放
discovery.seed_hosts集群发现节点列表单节点可空加几个备选节点,方便以后扩容
cluster.initial_master_nodes初始主节点候选单节点填自己的 node.name不配这个,第一次启动集群会找不到 master

下面给一份单节点最小可用配置,可以直接复制。

cluster.name: pki-log-cluster
node.name: node-1
path.data: /data/es/data
path.logs: /data/es/logs
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: []
cluster.initial_master_nodes: ["node-1"]
注意:上面把 network.host 设成了 0.0.0.0,这会让 ES 监听所有网卡。如果你没配置防火墙或安全组,外部可以直接访问你的 9200 端口。我建议只绑定内网 IP,比如 network.host: 192.168.1.10。

3.3 JVM 堆内存配置:别让 OOM 成为噩梦

配置文件同目录下有个 jvm.options。默认堆内存是 1GB,对 PKI 日志场景来说远远不够。但也不是越大越好——超过 32GB 会触发压缩指针失效,反而变慢。

我个人习惯给 ES 分配物理内存的一半,但不超过 31GB。比如你的服务器 16GB 内存,就把 -Xms 和 -Xmx 都设为 8g。

-Xms8g
-Xmx8g

曾经有个项目,运维直接给了 64GB heap,结果 GC 停顿长达十几秒,查询频繁超时。我说降回 31GB 就稳了,他还将信将疑……后来换上,世界清静了。

3.4 启动服务与验证集群状态

切换到 elastic 用户,执行启动脚本。第一次启动会比较慢,因为要生成安全证书、创建内部索引。

su - elastic
/usr/local/elasticsearch/bin/elasticsearch -d  # -d 表示后台运行

查看日志:

tail -f /data/es/logs/pki-log-cluster.log

看到这样的 INFO 就说明启动成功了:

[INFO ][o.e.n.Node] [node-1] started
[INFO ][o.e.c.c.CoordinationDiagnosticsService] [node-1] health is GREEN

验证集群状态最简单的方法是 curl 一下:

curl -X GET "http://localhost:9200/_cluster/health?pretty"

返回结果里 "status" : "green" 就对了。如果显示 yellow 或 red,通常是因为索引分片副本未分配。单节点下只有 1 个节点,副本分片无法分配,所以默认会 yellow——这不影响使用。你可以把索引的副本数设成 0 来强制 green。

curl -X PUT "http://localhost:9200/_settings" -H 'Content-Type: application/json' -d'
{
  "index" : {
    "number_of_replicas" : 0
  }
}'
一句话总结:只要集群 health 状态是 green 或 yellow,没有未分配的分片(unassigned_shards 为 0),就说明单节点 Elasticsearch 已经就绪。

3.5 看一眼整体流程:你刚才做了什么?

下面这张图把安装配置到验证的关键节点串了一遍,方便你脑子里有个全局印象。

Elasticsearch 单节点安装核心流程 下载解压 ES 7.17 tar.gz 创建专用用户 elastic:elastic 配置核心参数 集群名/节点名/路径/网络 调 JVM 堆内存 -Xms8g -Xmx8g 启动 Elasticsearch bin/elasticsearch -d 验证集群健康 curl _cluster/health 关键提醒 • 拒绝 root 启动,必须创建专用系统用户 • 数据路径和日志路径远离系统盘 • JVM 堆内存别超过物理内存一半,最大 31GB

3.6 常见启动失败的坑

  • max file descriptors [4096] for elasticsearch process is too low —— ES 要求至少 65535。改 /etc/security/limits.conf,加上 elastic hard nofile 65535 和 elastic soft nofile 65535,然后重新登录。
  • max virtual memory areas vm.max_map_count [65530] is too low —— 执行 sysctl -w vm.max_map_count=262144,并写入 /etc/sysctl.conf 持久化。
  • 绑定地址后外网无法访问 —— 检查 network.host 是否配成了 127.0.0.1,改为 0.0.0.0 或内网 IP。

我曾经在客户的服务器上折腾了三个小时,反复启动失败,最后发现是 /data/es 目录权限没递归给 elastic 用户。记住,data 和 logs 目录的属主必须是 elastic,否则 ES 写不了锁文件和段文件,直接闪退。

3.7 趁热打铁:验证一下你的成果

启动成功后,除了 health API,还可以用 _cat/nodes 和 _cat/indices 看看节点和索引情况。

# 查看所有节点(当前只有一个)
curl -X GET "http://localhost:9200/_cat/nodes?v"

# 查看已创建的索引(刚启动一般没有)
curl -X GET "http://localhost:9200/_cat/indices?v"

如果能看到节点信息返回,恭喜你——Elasticsearch 已经可以正常工作了。下一步就是把 PKI 日志灌进去。

现在你应该拥有:一个运行在 9200 端口、状态 green 或 yellow、没有未分配 shard 的单节点 Elasticsearch 实例。配置文件和日志路径都已独立,堆内存合理分配,非 root 用户启动。