搭建ELK
ElasticSearch
根据你的 Docker 版本(Docker 28.1.1 + Compose v2.38.2),以下是专为 Elasticsearch 8.x 优化的 docker-compose.yml 配置文件,包含详细注释和最佳实践:
docker-compose.yml
version: '3.8' # Docker Compose v2.38.2 支持的版本
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2 # 官方镜像
container_name: elasticsearch
environment:
- discovery.type=single-node # 单节点模式(开发环境推荐)
- ES_JAVA_OPTS=-Xms2g -Xmx2g # JVM堆内存设置(根据机器内存调整)
- xpack.security.enabled=false # 禁用安全认证(仅限本地开发环境)
- cluster.routing.allocation.disk.threshold_enabled=false # 禁用磁盘阈值检查
- ingest.geoip.downloader.enabled=false # 禁用GeoIP下载(减少启动时间)
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data:/usr/share/elasticsearch/data # 数据持久化
ports:
- "9200:9200" # REST API
- "9300:9300" # 节点通信
networks:
- es_net
healthcheck:
test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -qE '\"status\":\"(green|yellow)\"'"]
interval: 10s
timeout: 10s
retries: 30
volumes:
es_data:
driver: local
networks:
es_net:
driver: bridge
name: es_network # 自定义网络名称
使用说明
- 启动服务
bashdocker-compose up -d
- 验证服务状态
bashdocker logs -f elasticsearch # 查看启动日志curl http://localhost:9200 # 应返回JSON格式的集群信息
- 关键目录权限设置(首次启动前执行)
bashsudo mkdir -p /var/lib/docker/volumes/es_datasudo chown -R 1000:1000 /var/lib/docker/volumes/es_data # Elasticsearch默认UID
配置说明
- 版本选择
- 使用
8.12.2镜像(Elasticsearch 8.x 的最新稳定版本) - 兼容 Docker 28.1.1 的容器运行时
- 内存优化
ES_JAVA_OPTS=-Xms2g -Xmx2g限制 JVM 堆内存为 2GB- 如果机器内存 < 8GB,建议改为
-Xms1g -Xmx1g
- 安全配置
xpack.security.enabled=false禁用基础认证(仅限本地开发环境)- 生产环境应启用安全功能并配置密码
- 数据持久化
- 使用 Docker Volume
es_data保存数据 - 数据目录实际路径:
/var/lib/docker/volumes/es_data/_data
常见问题处理
- 虚拟内存不足
bash# 临时设置sudo sysctl -w vm.max_map_count=262144 # 永久生效echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.confsudo sysctl -p
- 磁盘空间监控
- 如果遇到
disk usage exceeded flood-stage watermark错误:
bashcurl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'{ "persistent": { "cluster.routing.allocation.disk.watermark.low": "90%", "cluster.routing.allocation.disk.watermark.high": "95%", "cluster.routing.allocation.disk.watermark.flood_stage": "98%" }}'
- 升级版本
修改image字段的版本号后执行:
bashdocker-compose pulldocker-compose up -d
如果需要添加 Kibana 或配置安全认证,可以告诉我帮你扩展配置!
Logstash
创建目录 config 和 pipeline
在目录config中创建
logstash.yml
http.host: "0.0.0.0"
http.port: 9600
pipelines.yml
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline/logstash.conf" # 管道配置文件路径
生产环境建议配置
# logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]
在目录 pipeline 中创建
logstash.conf
input {
tcp {
port => 5000
codec => json
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
}
docker-compose.yml
version: '3.8'
services:
logstash:
image: docker.elastic.co/logstash/logstash:8.12.2
container_name: logstash
command: logstash -f /usr/share/logstash/pipeline/logstash.conf
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 使用服务名访问ES
- LS_JAVA_OPTS=-Xmx2g -Xms2g
volumes:
- ./config:/usr/share/logstash/config
- ./pipeline:/usr/share/logstash/pipeline
ports:
- "5044:5044"
- "9600:9600"
- "5601:5601"
- "5000:5000/tcp"
- "5000:5000/udp"
networks:
- es_net # 加入Elasticsearch的自定义网络
networks:
es_net:
external: true # 声明使用已存在的外部网络
name: es_network # 指定与ES相同的网络名称
验证
可以通过以下步骤验证Logstash是否运行正常:
1. 检查容器状态
# 查看所有容器状态
docker-compose ps
# 预期输出(状态应为Up)
NAME COMMAND SERVICE STATUS PORTS
logstash "/usr/local/bin/docke..." logstash running 0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp
2. 查看实时日志
# 查看所有容器状态
docker-compose ps
# 预期输出(状态应为Up)
NAME COMMAND SERVICE STATUS PORTS
logstash "/usr/local/bin/docke..." logstash running 0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp
3. 发送测试数据
通过TCP端口发送数据
# 安装netcat(如果未安装)
sudo apt-get install netcat -y
# 发送测试JSON数据到5000端口
echo '{"message": "test logstash", "timestamp": "2025-07-14T13:30:00Z"}' | nc localhost 5000
通过Beats端口发送数据
# 使用Filebeat发送测试日志(需安装Filebeat)
./filebeat test input -e -E input.type=stdin
4. 验证Elasticsearch数据
# 查询最新索引
curl -u elastic:changeme http://localhost:9200/_cat/indices?v
# 预期输出(包含logstash开头的索引)
green open logstash-2025.07.14 ABCDEFG 1 0 1 0 283b 283b
# 查看具体文档
curl -u elastic:changeme http://localhost:9200/logstash-2025.07.14/_search?pretty
5. Kibana可视化验证
- 打开Kibana(http://localhost:5601)
- 进入 Management > Stack Management > Index Patterns
- 创建索引模式
logstash-* - 进入 Discover 页面,选择时间范围为最近15分钟
- 应该能看到刚刚发送的测试数据
6. 性能监控指标
# 查看Logstash监控API
curl http://localhost:9600/_node/stats
# 关键指标:
- "events": { "in": 1, "out": 1 } # 事件处理计数
- "pipeline": { "workers": 4 } # 管道工作线程数
- "jvm": { "mem": { "heap_used_percent": 15 } } # 内存使用率
常见问题排查
1. 连接Elasticsearch失败
log[ERROR][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance
解决方案:
- 检查ES容器是否运行
- 验证网络配置:
docker network inspect es_network - 测试连通性:
docker exec -it logstash curl http://elasticsearch:9200
2. 管道配置错误
log[FATAL][logstash.runner] An unexpected error occurred! {:error=>#<LogStash::ConfigurationError: Something is wrong with your configuration.>}
解决方案:
# 测试配置文件语法
docker-compose run --rm logstash logstash -t -f /usr/share/logstash/pipeline/logstash.conf
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果