二进制方式安装部署 Logstash
背景说明
Logstash 是一个开源的数据收集和处理引擎,是 Elastic Stack 的重要组件之一。在本方案中,我们使用 Logstash 作为 Kubernetes 集群日志收集的关键组件,主要用于:
- 从 Kafka 消费各服务的日志数据
- 对日志数据进行过滤和转换
- 将处理后的日志按照特定格式持久化到文件系统
为什么选择二进制部署?
- 更灵活的配置控制
- 更好的性能优化空间
- 便于系统资源调优
- 适合特定的部署环境需求
系统要求
硬件推荐配置
- CPU: 8核心及以上
- 内存: 16GB及以上
- 磁盘: 根据日志量规划,建议系统盘500GB以上,数据盘按需配置
软件要求
- 操作系统: CentOS 7/8 或 BigCloud Enterprise Linux For Euler 21.10/22.10 LTS
- Java环境: JDK 17(Logstash 8.10.2 推荐)
- 磁盘格式: XFS或EXT4(推荐XFS,更好的大文件处理性能)
详细部署步骤
1. 安装 Java 环境
JDK 安装部署文档-CSDN博客
说明:
- JDK 17 提供更好的性能和安全性
- 建议使用官方认证的JDK发行版
- 安装后需验证Java版本:
java -version
2. 目录规划和创建
# 安装目录
mkdir -p /opt/logstash
# 配置目录
mkdir -p /etc/logstash/conf.d
# 数据目录
mkdir -p /var/lib/logstash
# 日志目录
mkdir -p /var/log/logstash
# 应用日志存储目录
mkdir -p /data/k8s-log
目录说明:
/opt/logstash
: 程序安装目录/etc/logstash
: 配置文件目录/var/lib/logstash
: 数据持久化目录/var/log/logstash
: Logstash自身日志目录/data/k8s-log
: 应用日志存储目录
3. 下载和安装Logstash
# logstash-8.10.2-linux-x86_64.tar.gz 安装包自己官网下载搞定
cd /opt/logstash
tar -xzvf logstash-8.10.2-linux-x86_64.tar.gz
mv logstash-8.10.2/* .
rmdir logstash-8.10.2
rm -f logstash-8.10.2-linux-x86_64.tar.gz
4. 配置文件详解
4.1 主配置文件 (/etc/logstash/logstash.yml)
path.data: /var/lib/logstash
path.logs: /var/log/logstash
pipeline.workers: 8 # 并行处理线程数,建议设置为CPU核心数
pipeline.batch.size: 3000 # 批处理大小,根据内存调整
pipeline.batch.delay: 50 # 批处理等待时间(ms)
queue.type: persisted # 使用持久化队列,断电不丢数据
queue.max_bytes: 1gb # 队列大小,根据内存调整
log.level: info # 日志级别
配置说明:
pipeline.workers
: 影响处理性能,建议设置为CPU核心数pipeline.batch.size
: 越大吞吐量越高,但延迟也越高queue.type
: persisted可保证数据不丢失,但有性能开销queue.max_bytes
: 需要根据内存大小合理设置
4.2 JVM配置 (/etc/logstash/jvm.options)
-Xms4g
-Xmx4g
-XX:+UseG1GC
-XX:G1ReservePercent=20
JVM调优说明:
- 堆大小建议设置为系统内存的50%
- G1收集器适合大内存场景
- 可通过GC日志监控调整参数
4.3 Pipeline配置 (/etc/logstash/conf.d/k8s-logs.conf)
input {kafka {bootstrap_servers => "192.168.103.185:9092,192.168.103.201:9092,192.168.103.136:9092"topics => ["k8s-logs-assistant-master", "k8s-logs-ai-search-agent", "k8s-logs-doc-agent", "k8s-logs-meeting-backend"]group_id => "logstash-k8s-logs-group1"client_id => "logstash-k8s-logs-group1-1"codec => jsonauto_offset_reset => "latest"consumer_threads => 4 # Kafka消费线程数fetch_max_bytes => "5242880" # 每次拉取最大字节数max_poll_records => "5000" # 每次拉取最大记录数decorate_events => false # 不添加Kafka元数据}kafka {bootstrap_servers => "192.168.103.185:9092,192.168.103.201:9092,192.168.103.136:9092"topics => ["k8s-logs-gene-core", "k8s-logs-gene-tools", "k8s-logs-gene-web", "k8s-logs-llm-agent", "k8s-logs-llm-schedule-management"]group_id => "logstash-k8s-logs-group2"client_id => "logstash-k8s-logs-group2-1"codec => jsonauto_offset_reset => "latest"consumer_threads => 4fetch_max_bytes => "5242880"max_poll_records => "5000"decorate_events => false}
}filter {mutate {add_field => {"service_name" => "%{[fields][service_name]}""pod_name" => "%{[fields][pod_name]}""log_filename" => "%{[filename]}"}}ruby {code => 'time = Time.nowdate_str = time.strftime("%Y%m%d")pod_name = event.get("pod_name")if pod_nameevent.set("pod_dir", "#{date_str}-#{pod_name}")end'}
}output {file {path => "/data/k8s-log/%{service_name}/%{pod_dir}/%{log_filename}"codec => line { format => "%{message}" }flush_interval => 500 # 文件写入刷新间隔(ms)gzip => false # 是否压缩}
}
5. 系统服务配置
/usr/lib/systemd/system/logstash.service:
[Unit]
Description=logstash
After=network.target[Service]
Type=simple
# 移除用户相关配置,使用 root 运行
Environment=LS_HOME=/opt/logstash
Environment=LS_SETTINGS_DIR=/etc/logstash
Environment=LS_JAVA_OPTS="-Xms2g -Xmx2g"
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
ExecStart=/opt/logstash/bin/logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/k8s-logs.conf --config.reload.automatic --config.reload.interval=3s --log.level=info
Restart=always
RestartSec=60
WorkingDirectory=/opt/logstash
StandardOutput=append:/var/log/logstash/logstash.log
StandardError=append:/var/log/logstash/error.log[Install]
WantedBy=multi-user.target
6. 性能优化建议
6.1 系统层面优化
# 调整系统限制
cat >> /etc/security/limits.conf << EOF
root soft nofile 65536
root hard nofile 65536
root soft nproc 4096
root hard nproc 4096
EOF# 调整内核参数
cat >> /etc/sysctl.conf << EOF
vm.max_map_count=262144
net.core.somaxconn=65535
EOF
sysctl -p# 磁盘挂载优化(针对XFS)
mount -o noatime,nodiratime,nobarrier /dev/sdb1 /data/k8s-log
6.2 Logstash性能监控
# API监控
curl -XGET 'localhost:9600/_node/stats/pipelines?pretty'# 性能指标
curl -XGET 'localhost:9600/_node/stats?pretty'
7. 启动服务
# 重新加载 systemd
systemctl daemon-reload
# 启动 Logstash
systemctl start logstash
# 设置开机启动
systemctl enable logstash
# 查看状态
systemctl status logstash
8. 日志管理
# 查看 Logstash 日志
tail -f /var/log/logstash/logstash.log# 检查进程
ps aux | grep logstash# 设置日志轮转
cat > /etc/logrotate.d/logstash << EOF
/var/log/logstash/*.log {dailyrotate 7compressdelaycompressmissingoknotifemptycreate 644 root root
}
EOF
运维注意事项
1. 监控告警
- 配置CPU、内存、磁盘使用率告警
- 监控Pipeline处理延迟
- 监控Kafka消费延迟
2. 备份策略
- 定期备份配置文件
- 配置文件版本控制
- 关键日志异地备份
3. 故障处理
- 建立故障处理流程
- 保存关键运行指标
- 定期进行故障演练
常见问题处理
1. 写入延迟高
- 检查磁盘IO情况
- 调整flush_interval参数
- 优化文件系统配置
2. 内存使用过高
- 调整batch size
- 检查JVM配置
- 监控内存泄漏
3. CPU使用率高
- 调整worker数量
- 优化处理逻辑
- 检查GC情况
监控建议
# 检查磁盘使用情况
df -h /data/k8s-log# 检查目录大小
du -sh /data/k8s-log/*# 检查Logstash状态
curl -XGET 'localhost:9600/_node/stats?pretty'