2. 环境搭建:Elasticsearch、Logstash、Kibana 安装部署(单机版与 Docker 方式)
这一章咱们直接动手。环境搭不起来,后面的巡检都是空谈。
我个人习惯先搞清楚两种部署方式各自的适用场景,再选一种上手。你想想看——单机版适合学习、调试;Docker 方式更贴近生产,也方便快速重置。
2.1 单机版安装:一步一步来
先装 Elasticsearch。我建议你用一个干净的 Linux 虚拟机,CentOS 7 或 Ubuntu 20.04 都行。
下面是用 tar 包安装的步骤:
# 下载 Elasticsearch 7.17.x(注意版本统一)
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
cd elasticsearch-7.17.9
# 不能用 root 启动,创建普通用户
useradd -m esuser
chown -R esuser:esuser /path/to/elasticsearch-7.17.9
su - esuser
./bin/elasticsearch
启动后如果报错 "max virtual memory areas vm.max_map_count [65530] is too low",执行:sudo sysctl -w vm.max_map_count=262144。我每次装新机器都会先配好这个内核参数,省的后面折腾。
接着安装 Kibana。解压后改配置文件:
# 修改 config/kibana.yml
server.port: 5601
server.host: "0.0.0.0" # 允许远程访问
elasticsearch.hosts: ["http://localhost:9200"]
最后是 Logstash。我之前只装过 Filebeat 但后来发现 Logstash 的 Filter 插件是真香,尤其是 dissect 和 grok 解析日志。
tar -xzf logstash-7.17.9-linux-x86_64.tar.gz
cd logstash-7.17.9
# 测试一个简单的 pipeline
./bin/logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'
# 输入 hello,看看是否输出结构化 JSON
三个服务都起来后,访问 http://localhost:5601 就能看到 Kibana 界面了。嗯,到这单机版就跑通了。
2.2 Docker 方式:一条命令拉起全家桶
Docker 方式最大的好处是隔离和快速重建。我记得有个项目需要频繁切换 ELK 版本做测试,用 Docker Compose 简直救命。
创建一个 docker-compose.yml 文件:
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.9
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
- "9300:9300"
logstash:
image: docker.elastic.co/logstash/logstash:7.17.9
volumes:
- ./pipeline:/usr/share/logstash/pipeline
ports:
- "5044:5044"
- "9600:9600"
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:7.17.9
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
然后执行:
docker-compose up -d
等几十秒,三个容器就全起来了。Logstash 的 Pipeline 配置文件需要你自己放在当前目录的 pipeline 文件夹里,比如:
# pipeline/logstash.conf
input { beats { port => 5044 } }
filter {
grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
}
output { elasticsearch { hosts => ["elasticsearch:9200"] } }
注意:Docker 方式中 Logstash 连接 Elasticsearch 用的是容器名 elasticsearch,不是 localhost。这个坑我踩过一次,排查了半天才发现是 hosts 写错了。
2.3 两种方式对比,你选哪个?
| 对比维度 | 单机版(tar包) | Docker Compose |
|---|---|---|
| 安装复杂度 | 需依次下载、解压、改配置 | 一个 yml 文件 + 一条命令 |
| 环境隔离 | 共用宿主机端口、依赖 | 完全隔离,互不干扰 |
| 版本切换 | 手动删除、重新解压 | 改 docker-compose 中的 tag 即可 |
| 磁盘占用 | 每个版本解压约 1GB | 镜像层缓存,换版本只拉差分层 |
| 调试方便度 | 直接看日志文件 | docker logs -f <容器名> |
| 资源占用 | 可以精细调 JVM 参数 | 需通过环境变量控制,稍麻烦 |
我个人倾向:学习阶段用 Docker,避免污染主机环境;深入调优时切到单机版,方便改配置文件、看内核参数。
2.4 验证环境是否正常
不管用哪种方式,验证步骤一样:
- Elasticsearch:
curl http://localhost:9200,看到 cluster_name 和 version 字段就对了。 - Logstash:检查 http://localhost:9600 是否有 node stats 返回。
- Kibana:浏览器访问 http://localhost:5601,能加载出登陆页就行。
我曾经接手过一套 ELK 集群,Logstash 明明启动成功但数据就是写不进去,后来发现 elasticsearch 的 output 中 user/password 忘记加了。所以验证的时候一定要造一条测试日志,看它能不能在 Kibana 中被检索到。
2.5 避坑指南:我踩过的三个坑
- 内存不足:Elasticsearch 默认 JVM 堆 1GB,如果你机器只有 2GB 内存,建议调成 512MB(环境变量
ES_JAVA_OPTS="-Xms512m -Xmx512m")。 - 权限问题:单机版千万别用 root 运行 ES,会报错拒绝启动。创建专用用户,把目录权限给对。
- 版本一致性:ELK 三个组件的次要版本号必须一致(比如都是 7.17.9),否则可能出现兼容问题。我遇到过 Kibana 连不上 ES 就是因为版本差了一个小补丁。