ELK(Elasticsearch + Logstash + Kibana)部署指南
以下是为 日志集中管理、分析与可视化 设计的 ELK 部署方案,支持单机测试与生产集群两种模式,涵盖安全加固、性能优化等关键配置。
一、部署架构设计
日志源(Filebeat/微服务) → Logstash(数据清洗) → Elasticsearch(存储/检索) → Kibana(可视化)
|
→ Kafka(可选:异步缓冲)
二、部署步骤
1. 环境准备
- 基础要求:
- Java 17+(Elasticsearch 8.x 需求)
- 主机名解析(生产环境需配置 DNS 或
/etc/hosts
) - 关闭防火墙或开放端口(9200/9300/5044/5601)
2. Elasticsearch 部署
单节点模式(测试环境)
docker run -d --name es \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \ # 测试环境禁用安全
elasticsearch:8.11.3
生产集群模式(3节点示例)
- 节点1配置(
elasticsearch.yml
):cluster.name: elk-cluster node.name: es-node1 network.host: 192.168.1.101 discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] cluster.initial_master_nodes: ["es-node1", "es-node2", "es-node3"] xpack.security.enabled: true xpack.security.transport.ssl.enabled: true
- 生成安全证书(使用
elasticsearch-certutil
工具)。 - 启动命令(各节点类似,调整IP和节点名)。
3. Logstash 部署
docker run -d --name logstash \
-p 5044:5044 -p 9600:9600 \
-v $(pwd)/pipeline:/usr/share/logstash/pipeline \
logstash:8.11.3
- 管道配置示例(
pipeline/logstash.conf
):input { beats { port => 5044 } # 接收Filebeat日志 kafka { bootstrap_servers => "kafka:9092" topics => ["app-logs"] # 从Kafka消费日志 } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:traceId}\] %{LOGLEVEL:level} %{GREEDYDATA:msg}" } } mutate { remove_field => ["@version", "host"] # 清理无用字段 } } output { elasticsearch { hosts => ["http://es:9200"] index => "logstash-%{+YYYY.MM.dd}" user => "elastic" # 生产环境需启用安全认证 password => "changeme" } kafka { bootstrap_servers => "kafka:9092" topic_id => "processed-logs" } }
4. Kibana 部署
docker run -d --name kibana \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-e ELASTICSEARCH_USERNAME=elastic \
-e ELASTICSEARCH_PASSWORD=changeme \
kibana:8.11.3
- 访问 Kibana:
http://kibana-host:5601
,使用elastic
用户登录(密码需在ES中重置)。
三、生产环境优化配置
1. Elasticsearch 调优
- JVM 参数调整(
jvm.options
):-Xms4g # 堆内存设置为物理内存的50%,最大不超过32G -Xmx4g
- 索引生命周期管理(ILM):
PUT _ilm/policy/logs_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50GB" } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } }
2. Logstash 性能优化
- 增加 Pipeline 工作线程(
logstash.yml
):pipeline.workers: 4 pipeline.batch.size: 250
- 启用持久化队列(防止数据丢失):
queue.type: persisted path.queue: /var/lib/logstash/queue
3. 安全加固
- 启用 TLS 加密:
- 为 Elasticsearch 生成证书,配置
xpack.security.http.ssl.enabled: true
。 - Logstash 输出到 ES 时指定
ssl => true
。
- 为 Elasticsearch 生成证书,配置
- 用户权限控制:
# 创建只读用户 bin/elasticsearch-users useradd log_reader -p password -r read
四、集成测试
- 发送测试日志(通过 Filebeat 或直接 curl):
curl -XPOST "http://logstash:5044" -H "Content-Type: application/json" -d '{"message": "Hello ELK"}'
- 验证 Elasticsearch 索引:
curl -XGET 'http://es:9200/logstash-*/_search?q=Hello&pretty'
- Kibana 可视化:
- 创建索引模式
logstash-*
。 - 使用 Discover 页面搜索日志,构建仪表盘。
- 创建索引模式
五、故障排查
- Elasticsearch 无法加入集群:
- 检查
discovery.seed_hosts
配置。 - 查看日志
tail -f /var/log/elasticsearch/elk-cluster.log
。
- 检查
- Logstash 队列积压:
- 监控
curl -XGET 'localhost:9600/_node/stats/pipelines?pretty'
。 - 增加
pipeline.workers
或优化过滤器性能。
- 监控
- Kibana 无法连接 ES:
- 确认
elasticsearch.hosts
配置正确。 - 检查 ES 安全认证(用户名/密码或 API Key)。
- 确认
六、扩展方案
- 横向扩展:
- 添加 Elasticsearch 数据节点,调整
node.roles: [data]
。 - 部署多 Logstash 实例,共享配置文件(如通过 NFS)。
- 添加 Elasticsearch 数据节点,调整
- 高可用架构:
- Elasticsearch 配置副本分片(
index.number_of_replicas: 1
)。 - Logstash 使用 Kafka 输入,实现消费者组多副本消费。
- Elasticsearch 配置副本分片(
- 日志归档:
- 配置 ILM 将旧索引迁移至低成本存储(如 S3)。
七、总结
ELK 部署的核心在于:
- 稳定性:通过集群模式和持久化队列避免单点故障。
- 性能:合理分配 JVM 内存,优化批量处理参数。
- 安全性:启用 TLS 加密和细粒度权限控制。
- 可维护性:利用 ILM 和 Snapshots 实现自动化数据管理。
建议根据业务规模选择合适的部署模式(单机/集群),并定期监控资源使用情况(CPU、内存、磁盘I/O)。