ELK(Elasticsearch + Logstash + Kibana)是主流的日志分析栈,单机版部署适用于中小规模日志场景 (日均日志量百万级以内),可实现日志的采集、解析、存储、检索、可视化 全流程管理。本方案聚焦单主机部署,简化架构,降低运维成本。
一、方案概述
1. 架构设计
单机版 ELK 采用一体化部署,所有组件运行在同一台服务器,架构如下:
业务应用 → 日志文件 → Logstash(采集/解析)→ Elasticsearch(存储/检索)→ Kibana(可视化/查询)
- Elasticsearch:核心存储与检索引擎,负责日志的结构化存储和快速查询。
- Logstash:日志采集与处理管道,读取本地日志文件,解析为结构化数据后发送至 Elasticsearch。
- Kibana:可视化界面,提供日志检索、仪表盘、告警等功能。
2. 部署前提
| 资源类型 | 最低配置要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核及以上 |
| 内存 | 4GB | 8GB 及以上 |
| 磁盘 | 50GB(SSD) | 200GB+(SSD,根据日志留存周期调整) |
| 操作系统 | Linux(CentOS 7/8、Ubuntu 18.04+) | Linux(CentOS 7) |
| JDK | 11(Elasticsearch 7.x+ 内置,无需手动安装) | - |
3. 版本选择
建议选择 Elastic Stack 7.x 系列(如 7.17.x),该版本稳定且兼容性好,避免使用 8.x 版本(单机部署配置复杂,需要处理安全认证)。
二、部署步骤(以 CentOS 7 为例)
步骤 1:系统环境准备
-
关闭防火墙和 SELinux
bash# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭 SELinux setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config -
设置系统内核参数 Elasticsearch 需要调整内核参数以支持内存锁定和最大文件描述符,编辑
/etc/security/limits.conf:bashecho "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf echo "* soft memlock unlimited" >> /etc/security/limits.conf echo "* hard memlock unlimited" >> /etc/security/limits.conf编辑
/etc/sysctl.conf:bashecho "vm.max_map_count=262144" >> /etc/sysctl.conf sysctl -p -
重启系统
bashreboot
步骤 2:安装 Elasticsearch
-
添加 Elastic 官方源
bashrpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch vi /etc/yum.repos.d/elastic.repo写入以下内容:
[elasticsearch-7.x] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md -
安装 Elasticsearch
bashyum install elasticsearch-7.17.0 -y -
配置 Elasticsearch 编辑主配置文件
/etc/elasticsearch/elasticsearch.yml,修改以下关键参数:XML# 集群名称(单机集群,名称自定义) cluster.name: elk-single-node # 节点名称 node.name: node-1 # 数据存储路径 path.data: /var/lib/elasticsearch # 日志存储路径 path.logs: /var/log/elasticsearch # 绑定地址(允许外部访问,单机可设为 0.0.0.0) network.host: 0.0.0.0 # HTTP 端口 http.port: 9200 # 单机模式,禁用多节点发现 discovery.type: single-node # 启用内存锁定(避免内存交换) bootstrap.memory_lock: true编辑 JVM 配置文件
/etc/elasticsearch/jvm.options,调整堆内存大小(建议为物理内存的 1/2,不超过 32GB):-Xms2g -Xmx2g -
启动并设置开机自启
systemctl daemon-reload systemctl start elasticsearch systemctl enable elasticsearch -
验证 Elasticsearch 是否启动成功
curl http://localhost:9200若返回如下 JSON 数据,说明启动成功:
{ "name" : "node-1", "cluster_name" : "elk-single-node", "cluster_uuid" : "xxxxxxxxxxxx", "version" : { "number" : "7.17.0", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "xxxxxxxxxxxx" }, "tagline" : "You Know, for Search" }
步骤 3:安装 Logstash
-
安装 Logstash
yum install logstash-7.17.0 -y -
配置 Logstash 日志采集管道 Logstash 配置分为 3 部分:
input(输入)、filter(过滤解析)、output(输出)。新建配置文件/etc/logstash/conf.d/app-log.conf,示例配置如下(采集 Nginx 或自定义应用日志):# 1. 输入:读取本地日志文件 input { file { # 日志文件路径(替换为业务应用的日志路径) path => ["/var/log/app/*.log"] # 从文件末尾开始读取 start_position => "end" # 监听文件变化的间隔时间 stat_interval => 1 # 自定义字段,用于区分日志来源 tags => ["app-logs"] # 编码格式 codec => plain { charset => "UTF-8" } } } # 2. 过滤:解析日志为结构化数据(以常见的日志格式为例) filter { # 匹配日志格式:[2025-01-01 10:00:00] [INFO] [user-123] - 登录成功 grok { match => { "message" => "\[%{DATE:log_date} %{TIME:log_time}\] \[%{LOGLEVEL:log_level}\] \[%{DATA:user_id}\] - %{GREEDYDATA:log_content}" } } # 合并日期和时间为@timestamp字段(Elasticsearch 时间字段) date { match => [ "log_date %{log_time}", "yyyy-MM-dd HH:mm:ss" ] target => "@timestamp" } # 删除无用字段 mutate { remove_field => ["message", "log_date", "log_time", "path", "host"] } } # 3. 输出:发送到 Elasticsearch output { elasticsearch { # Elasticsearch 地址 hosts => ["http://localhost:9200"] # 索引名称(每天生成一个索引,格式:app-log-2025.01.01) index => "app-log-%{+YYYY.MM.dd}" } # 控制台输出(调试用,生产环境可注释) stdout { codec => rubydebug } }- grok 模式说明 :可根据实际日志格式调整,可使用 Grok Debugger 在线调试。
- 多日志类型 :若需采集多种日志(如 Nginx、Java 应用),可创建多个
.conf配置文件。
-
启动并设置开机自启
bashsystemctl start logstash systemctl enable logstash
步骤 4:安装 Kibana
-
安装 Kibana
bashyum install kibana-7.17.0 -y -
配置 Kibana 编辑配置文件
/etc/kibana/kibana.yml:# 绑定地址(允许外部访问) server.host: "0.0.0.0" # Kibana 端口 server.port: 5601 # Elasticsearch 地址 elasticsearch.hosts: ["http://localhost:9200"] # 中文界面(可选) i18n.locale: "zh-CN" -
启动并设置开机自启
bashsystemctl start kibana systemctl enable kibana -
访问 Kibana 界面 浏览器访问
http://服务器IP:5601,首次登录无需账号密码(7.x 单机模式默认关闭安全认证)。
三、日志接入与使用
1. 日志索引配置
- 登录 Kibana → 点击左侧 Stack Management → Index Patterns → Create index pattern。
- 输入索引名称匹配规则(如
app-log-*),点击 Next step。 - 选择时间字段为
@timestamp,点击 Create index pattern。
2. 日志检索与分析
- 点击左侧 Discover,选择已创建的索引模式。
- 可通过以下方式检索日志:
- 时间范围筛选:顶部选择时间范围(如近 1 小时、近 1 天)。
- 关键词搜索 :搜索框输入关键词(如
log_level:ERROR、user_id:user-123)。 - 字段过滤 :左侧字段列表勾选需展示的字段(如
log_level、log_content)。
3. 可视化仪表盘(可选)
- 点击左侧 Dashboard → Create dashboard → Add visualization。
- 选择可视化类型(如柱状图、饼图),配置数据源和统计维度(如按
log_level统计数量)。 - 保存仪表盘,实现日志指标的可视化监控。
四、运维与优化
1. 日志索引生命周期管理(ILM)
为避免 Elasticsearch 磁盘耗尽,需配置索引生命周期策略,自动删除过期日志:
- Kibana → Stack Management → Index Lifecycle Policies → Create policy。
- 配置策略:
- Hot 阶段:索引写入阶段,保留 7 天。
- Delete 阶段:7 天后自动删除索引。
- 将策略绑定到日志索引(如
app-log-*)。
2. 性能优化
- Elasticsearch 优化
- 确保磁盘为 SSD,提升读写性能。
- 调整 JVM 堆内存(不超过物理内存的 1/2,且不超过 32GB)。
- 关闭不需要的功能(如集群监控、自动创建索引)。
- Logstash 优化
- 启用
file输入插件的sincedb功能,避免重复采集日志。 - 生产环境关闭
stdout输出,减少资源消耗。
- 启用
3. 监控告警(可选)
- 安装 Metricbeat,采集 ELK 组件的运行指标(CPU、内存、磁盘使用率)。
- Kibana → Alerting,配置告警规则(如磁盘使用率超过 80% 时触发告警)。
五、常见问题
- Elasticsearch 启动失败 :检查
/var/log/elasticsearch/elk-single-node.log,常见原因是内存锁定失败或内核参数未生效。 - Logstash 不采集日志 :检查日志文件路径权限、配置文件语法是否正确,查看
/var/log/logstash/logstash-plain.log。 - Kibana 无法访问:检查防火墙是否开放 5601 端口,Elasticsearch 是否正常运行。