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.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.port | HTTP 端口 | 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
}
}'
3.5 看一眼整体流程:你刚才做了什么?
下面这张图把安装配置到验证的关键节点串了一遍,方便你脑子里有个全局印象。
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 日志灌进去。