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.port | HTTP 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。ES 安装配置的核心逻辑图
下面这张图基本概括了单节点安装配置的整个流程和关键决策点。你对着看,应该能理清每一步该做什么。
关于集群配置(一句话带过)
如果你以后要搭多节点集群,核心改动就两个:discovery.seed_hosts 和 cluster.initial_master_nodes。跟单节点比,其实就是把 discovery.type: single-node 去掉,再加上其他节点的地址。别急,我们后面会专门用一章来演示集群搭建,包括选主、脑裂怎么防。
你现在先把单节点跑通,玩玩索引和搜索功能。下个阶段我会带着你接入 Filebeat 和 Logstash,把密钥审计日志送进去——那才是我们课程的主菜。