Elasticsearch 安装与配置基础

说实话,刚开始接触ELK的人,最容易被吓到的就是Elasticsearch的安装配置。你想想看,一个Java写的分布式搜索引擎,版本又多,参数又杂——但其实核心就那几样东西。我在项目里折腾过好几个环境,从单机到几十个节点的集群都搭过,有些坑踩得还挺深。今天就把最稳的一套方法掰开揉碎了讲给你。

安装前的系统准备

先聊系统要求。ES是Java应用,所以JDK是必须的。ES 7.x 系列自带捆绑的 OpenJDK,但你最好确认系统上没有残留的旧JDK。我在一次线下生产环境里,就因为服务器同时装了JDK8和JDK11,启动时ES莫名其妙加载了错误的JVM——那叫一个头疼。

另外几个关键参数:

  • 用户:不能用 root 跑 ES。一定要创建一个普通用户,比如 elasticsearch。
  • 文件描述符:Linux 默认 1024,ES 需要至少 65536。不然后台运行几个小时就报 too many open files。
  • 虚拟内存:vm.max_map_count 必须调大到 262144。ES 内部大量用了 mmap,不调的话启动就会跪。
  • 交换分区:我建议直接关闭 swap,或者把 swappiness 降到 1。ES 吃内存很凶,一交换性能直接崩。

嗯,这些参数改完都得重启(或者 sysctl -p 重载),别忘咯。

选择安装方式

ES 的安装方式有好几种:tar包、rpm、apt、docker。我个人的习惯,开发测试用 tar 包最灵活,生产用 rpm 或 docker 更方便维护。这里我重点讲 tar 包方式,因为你能看到每个目录的配置细节。

去官网下载对应系统的 tar.gz 文件,比如 7.17.x(我现在做生产环境基本都用 7.17,稳定),然后解压:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.9-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.17.9-linux-x86_64.tar.gz
mv elasticsearch-7.17.9 /usr/local/elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch

注意那个目录权限,我曾经偷懒没改,结果启动时 ES 想写 data 目录写不了,日志里一个 AccessDeniedException 找了半小时——全是低级错误。

核心配置:elasticsearch.yml

所有的配置都在 config/elasticsearch.yml 里。这个文件是 YAML 格式,不要用 tab,缩进用空格。我建议你直接从头写一份,而不是用默认文件改——因为默认带了一堆注释,看着眼花。

参数说明示例值
cluster.name集群名称,同一集群必须一致elk-audit
node.name节点名字,单节点可自定义node-1
path.data数据存储目录,建议放在单独挂载盘/data/elasticsearch/data
path.logs日志目录/var/log/elasticsearch
network.host监听地址,本地测试用 127.0.0.1,生产用 0.0.0.0 但要做安全策略0.0.0.0
http.portHTTP API 端口9200
discovery.type单节点必须设为 single-node,否则会死等集群发现single-node

下面是一个比较标准的单节点配置,贴出来你自己对着抄:

cluster.name: elk-audit
node.name: node-1
path.data: /data/elasticsearch/data
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
xpack.security.enabled: false

注意最后那个 xpack.security.enabled: false,我们这个课程前期为了快速搭建学习环境,先关掉安全认证,后面章节再专门讲安全整合。

启动与验证

切换到 elasticsearch 用户,执行:

su - elasticsearch
cd /usr/local/elasticsearch
./bin/elasticsearch -d -p pid

-d 是后台运行,-p pid 会写一个 pid 文件方便之后关闭。第一次启动时留意控制台输出,没有 ERROR 基本就成功了。然后去日志目录看看:

tail -f /var/log/elasticsearch/elk-audit.log

如果你看到 started 字样,就说明进程已经起来了。用 curl 验证:

curl -X GET "localhost:9200/"

返回的 JSON 里会有集群名、节点名、版本号等信息。嗯,看到那个 "tagline" : "You Know, for Search" 你就能确认它跑起来了。我在一次新环境里死活curl不通,后来发现防火墙没开放9200端口……你说气不气。

避坑指南——启动失败常见原因

我曾经在红帽7上装ES 7.x,启动报 max virtual memory areas vm.max_map_count [65530] is too low。这个问题太经典了,解决方案就是先调大再启动:

sysctl -w vm.max_map_count=262144
echo 'vm.max_map_count=262144' >> /etc/sysctl.conf

另一个坑是:内存不足。ES 默认的堆内存是 1GB,如果你的机器内存小于 2GB,启动时会警告。你可以通过环境变量 ES_JAVA_OPTS 来调小堆大小:

export ES_JAVA_OPTS="-Xms512m -Xmx512m"
./bin/elasticsearch -d -p pid

不过生产中千万别这样干,堆太小会导致 GC 频繁。记住了:生产至少 4GB 给堆,不超过物理内存的 50%。

安全层面的初期建议

我们的课程主题是密钥审计日志,安全是重中之重。但安装阶段我建议先不要开 xpack 安全。为什么呢?因为一旦开启,所有客户端通信都要配置证书和用户,对于初学阶段调试会多出不少麻烦。等后面我们专门用一章来整合 LDAP 或者自建 CA 做认证。这一阶段就是为了让你把 ES 先跑通,能看到日志写入、能查到数据。

提示:如果你只是本地虚拟机练习,可以设置 network.host: 0.0.0.0 方便宿主机访问。但如果是公网服务器,务必用防火墙限制 IP 来源,或者先用 127.0.0.1。
警告:不要在生产环境直接用 root 启动 ES!也不要用默认配置监听所有网卡却不开安全——我曾经见过一个客户把 ES 直接暴露在公网,被删库勒索,数据全没了。安全不是事后补的,从一开始就要有意识。

ES 安装配置的核心逻辑图

下面这张图基本概括了单节点安装配置的整个流程和关键决策点。你对着看,应该能理清每一步该做什么。

Elasticsearch 单节点安装配置流程 ① 系统准备 创建用户 / 调内核参数 ② 下载并解压 tar/gz → 指定目录 ③ 编辑 elasticsearch.yml 集群名 / 数据路径 / 网络 ④ 启动ES进程 elasticsearch -d -p pid ⑤ 验证状态 curl localhost:9200 🔍 常见卡壳点 • 忘记调 vm.max_map_count • 用root启动直接报错 • 防火墙没开端口 • 磁盘权限不对

关于集群配置(一句话带过)

如果你以后要搭多节点集群,核心改动就两个:discovery.seed_hosts 和 cluster.initial_master_nodes。跟单节点比,其实就是把 discovery.type: single-node 去掉,再加上其他节点的地址。别急,我们后面会专门用一章来演示集群搭建,包括选主、脑裂怎么防。

你现在先把单节点跑通,玩玩索引和搜索功能。下个阶段我会带着你接入 Filebeat 和 Logstash,把密钥审计日志送进去——那才是我们课程的主菜。