> 技术文档 > ELK(Elasticsearch + Logstash + Kibana)部署指南_elk部署

ELK(Elasticsearch + Logstash + Kibana)部署指南_elk部署


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-clusternode.name: es-node1network.host: 192.168.1.101discovery.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: truexpack.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
  • 访问 Kibanahttp://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: 4pipeline.batch.size: 250
  • 启用持久化队列(防止数据丢失):
    queue.type: persistedpath.queue: /var/lib/logstash/queue
3. 安全加固
  • 启用 TLS 加密
    • 为 Elasticsearch 生成证书,配置 xpack.security.http.ssl.enabled: true
    • Logstash 输出到 ES 时指定 ssl => true
  • 用户权限控制
    # 创建只读用户bin/elasticsearch-users useradd log_reader -p password -r read
四、集成测试
  1. 发送测试日志(通过 Filebeat 或直接 curl):
    curl -XPOST \"http://logstash:5044\" -H \"Content-Type: application/json\" -d \'{\"message\": \"Hello ELK\"}\'
  2. 验证 Elasticsearch 索引
    curl -XGET \'http://es:9200/logstash-*/_search?q=Hello&pretty\'
  3. 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 配置副本分片(index.number_of_replicas: 1)。
    • Logstash 使用 Kafka 输入,实现消费者组多副本消费。
  • 日志归档
    • 配置 ILM 将旧索引迁移至低成本存储(如 S3)。
七、总结

ELK 部署的核心在于:

  1. 稳定性:通过集群模式和持久化队列避免单点故障。
  2. 性能:合理分配 JVM 内存,优化批量处理参数。
  3. 安全性:启用 TLS 加密和细粒度权限控制。
  4. 可维护性:利用 ILM 和 Snapshots 实现自动化数据管理。

建议根据业务规模选择合适的部署模式(单机/集群),并定期监控资源使用情况(CPU、内存、磁盘I/O)。