ELK 从入门到实践
第一章:ELK基础概念
1.1 为什么需要ELK?
传统日志处理的痛点
-
日志分散
- 应用部署在不同服务器
- 需要逐个登录查看
- 无法统一管理
-
查询困难
- 只能用grep等命令
- 无法复杂检索
- 分析效率低
-
展示受限
- 纯文本格式
- 无法可视化
- 难以直观展示
ELK的解决方案
-
集中化管理
- 统一收集所有日志
- 集中存储和检索
- 一站式管理平台
-
强大的搜索能力
- 全文检索
- 复杂查询
- 实时分析
-
可视化展示
- 丰富的图表
- 实时监控
- 自定义仪表盘
1.2 组件详解
Elasticsearch
-
核心功能
- 分布式搜索引擎
- 数据存储和索引
- 提供REST API
-
工作原理
数据 -> 分片存储 -> 倒排索引 -> 快速检索
-
重要概念
- Index(索引): 类似数据库
- Type(类型): 类似表
- Document(文档): 类似行记录
- Field(字段): 类似列
Logstash
-
数据处理流程
Input -> Filter -> Output
-
主要功能
- 收集多源数据
- 实时解析转换
- 数据过滤处理
-
插件体系
- input插件: file, syslog, kafka等
- filter插件: grok, date, mutate等
- output插件: elasticsearch, redis等
Kibana
-
可视化功能
- Discover: 数据探索
- Visualize: 图表制作
- Dashboard: 仪表盘
- Dev Tools: 开发工具
-
数据分析能力
- 聚合分析
- 趋势图表
- 地理信息
第二章:环境准备详解
2.1 服务器规划
硬件配置
# 节点配置
node1/node2:
- CPU: 2核
- 内存: 4G
- 磁盘: 50G# IP规划
node1: 192.168.91.100 # Elasticsearch主节点
node2: 192.168.91.101 # Elasticsearch从节点
apache: 192.168.91.103 # Logstash + Kibana + Apache
配置说明:
-
CPU配置
- ES是CPU密集型应用
- 需要处理复杂查询
- 2核满足基本需求
-
内存配置
- ES大量使用内存缓存
- JVM堆内存建议2G
- 系统预留2G
- 避免使用swap
-
磁盘配置
- 日志数据增长快
- 需要定期清理
- 建议使用SSD
- 预留足够空间
-
网络要求
- 内网环境部署
- 千兆网络
- 集群间通信
- 数据传输安全
2.2 基础环境配置
Java环境
# 安装Java
yum -y install java# 验证版本
java -version# 建议使用Java 8
# ELK 6.x版本最兼容Java 8
系统优化
# 关闭防火墙
systemctl disable --now firewalld# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
优化说明:
-
关闭防火墙原因
- ELK组件间通信频繁
- 需要多个端口
- 简化部署过程
- 生产环境建议配置安全组
-
关闭SELinux原因
- 避免权限问题
- 简化配置过程
- 生产环境可以配置策略
系统限制调整
# 修改系统限制
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* soft memlock unlimited
* hard memlock unlimited
参数详解:
-
nofile(文件描述符)
-
为什么要调大?
- ES需要大量打开文件
- 默认1024太小
- 建议65536或更大
-
soft/hard区别
- soft: 警告限制
- hard: 硬性限制
- 建议设置相同
-
-
nproc(进程数)
- 调整原因
- ES会创建多个进程
- 需要足够进程数
- 默认值可能不够
- 调整原因
-
memlock(内存锁定)
- 作用
- 防止内存交换
- 提高性能
- 保证稳定性
- 作用
内核参数优化
# 修改内核参数
vim /etc/sysctl.conf
vm.max_map_count=262144# 立即生效
sysctl -p
参数说明:
- max_map_count
-
定义
- 限制进程内存映射区域数量
- 影响ES内存使用
- 过小会启动失败
-
设置建议
- 2G内存: 262144
- 4G内存: 524288
- 8G内存: 1048576
-
第三章:Elasticsearch部署详解
3.1 安装过程
软件安装
# 安装ES
rpm -ivh elasticsearch-6.7.2.rpm# 创建配置备份
cd /etc/elasticsearch/
mkdir bak
cp -a *.yml bak/
安装说明:
-
目录结构
/etc/elasticsearch/: 配置文件目录 /usr/share/elasticsearch/: 程序文件目录 /var/lib/elasticsearch/: 数据目录 /var/log/elasticsearch/: 日志目录
-
备份原因
- 保留原始配置
- 便于回滚
- 作为参考模板
3.2 配置详解
核心配置
# 集群配置
cluster.name: my-elk-cluster # 集群名称
node.name: node1 # 节点名称
node.master: true # 主节点角色
node.data: true # 数据节点角色# 内存配置
bootstrap.memory_lock: true # 锁定内存# 网络配置
network.host: 0.0.0.0 # 监听地址
http.port: 9200 # HTTP端口
transport.tcp.port: 9300 # 集群通信端口# 集群发现
discovery.zen.ping.unicast.hosts: ["192.168.91.100:9300", "192.168.91.101:9300"]
配置详解:
-
集群配置
-
cluster.name
- 标识集群的唯一名称
- 所有节点必须相同
- 建议有意义的名称
-
node.name
- 节点唯一标识
- 建议使用主机名
- 集群内不能重复
-
-
节点角色
-
master节点职责
- 管理集群状态
- 处理索引操作
- 分片分配决策
- 集群状态维护
-
data节点职责
- 存储数据
- 处理CRUD
- 执行搜索
- 数据聚合分析
-
-
内存管理
- bootstrap.memory_lock
- 锁定物理内存
- 禁止swap
- 提高性能
- 保证稳定性
- bootstrap.memory_lock
-
网络设置
-
network.host
- 0.0.0.0表示所有接口
- 生产环境指定IP
- 安全性考虑
-
端口说明
- 9200: REST API接口
- 9300: 节点间通信
- 注意防火墙配置
-
-
集群发现机制
- unicast发现
- 显式指定节点列表
- 比广播更可靠
- 生产环境推荐
- 支持域名配置
- unicast发现
启动验证
# 启动服务
systemctl enable --now elasticsearch# 检查端口
netstat -antp | grep 9200# 验证集群
curl http://localhost:9200/_cluster/health?pretty
验证说明:
-
服务启动
-
enable: 开机自启
-
–now: 立即启动
-
检查状态: systemctl status elasticsearch
-
-
端口检查
-
9200端口正常监听
-
确认IP和端口绑定
-
检查进程状态
-
-
集群健康检查
- green: 完全健康
- yellow: 副本未分配
- red: 主分片未分配
3.3 插件安装配置
Head插件安装
# 安装node
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make && make install# 安装phantomjs
cd /opt
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
ln -s /opt/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/bin# 安装head插件
cd /opt
unzip elasticsearch-head-master.zip
cd elasticsearch-head/
npm install
安装说明:
-
依赖组件
-
node.js: JavaScript运行环境
-
phantomjs: 无头浏览器
-
npm: 包管理工具
-
-
head插件功能
- 集群状态监控
- 索引数据查看
- 执行简单操作
- 可视化管理
配置ES支持head
# 添加到elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
配置说明:
-
cors.enabled
- 启用跨域访问
- head插件需要
-
cors.allow-origin
- 允许所有来源
- 生产环境应限制
启动head插件
cd /opt/elasticsearch-head/
npm run start &# 访问测试
http://192.168.91.100:9100
使用说明:
-
连接集群
- 输入ES地址
- 检查连接状态
- 查看集群健康
-
常用功能
-
索引管理
-
数据浏览
-
简单查询
-
集群监控
-
第四章:Logstash部署详解
4.1 基础安装
软件安装
# 安装Logstash
rpm -ivh logstash-6.7.2.rpm# 启动服务
systemctl enable --now logstash.service# 创建软链接
ln -s /usr/share/logstash/bin/logstash /usr/bin/
安装说明:
-
目录结构
/etc/logstash/: 配置文件目录 /usr/share/logstash/: 程序目录 /var/log/logstash/: 日志目录
-
软链接作用
- 方便命令执行
- 无需指定完整路径
- 简化操作过程
4.2 配置文件详解
基本结构
input { } # 输入配置
filter { } # 过滤配置
output { } # 输出配置
配置说明:
-
input部分
- 定义数据来源
- 支持多种输入
- 常用插件:file, beats, syslog
-
filter部分
- 数据处理转换
- 格式化解析
- 字段处理
-
output部分
- 定义输出目标
- 支持多目标输出
- 常用:elasticsearch, redis
系统日志收集示例
input {file {path => "/var/log/messages"type => "system"start_position => "beginning"stat_interval => "3"}
}output {elasticsearch {hosts => ["192.168.91.100:9200","192.168.91.101:9200"]index => "system-%{+YYYY.MM.dd}"}
}
配置解析:
-
input配置
- path: 日志文件路径
- type: 日志类型标识
- start_position: 读取位置
- stat_interval: 扫描间隔
-
output配置
- hosts: ES集群地址
- index: 索引名称模板
- 支持时间变量
第五章:Kibana部署详解
5.1 基础安装
# 安装Kibana
rpm -ivh kibana-6.7.2-x86_64.rpm# 创建配置备份
cd /etc/kibana/
cp kibana.yml kibana.yml.bak
5.2 配置详解
# kibana.yml 核心配置
server.port: 5601 # 访问端口
server.host: "0.0.0.0" # 监听地址
elasticsearch.hosts: ["http://192.168.91.100:9200", "http://192.168.91.101:9200"] # ES地址
kibana.index: ".kibana" # 配置索引
i18n.locale: "zh-CN" # 中文界面
logging.dest: /var/log/k.log # 日志文件
配置说明:
-
服务配置
- server.port: 访问端口
- server.host: 监听地址
- 0.0.0.0表示所有接口
- 生产环境建议限制
-
ES连接配置
- elasticsearch.hosts
- 支持多个ES节点
- 实现负载均衡
- 提高可用性
- elasticsearch.hosts
-
其他设置
- kibana.index: 存储Kibana配置
- i18n.locale: 界面语言
- logging.dest: 日志位置
5.3 启动与验证
# 设置日志文件权限
chown kibana:kibana /var/log/k.log# 启动服务
systemctl enable --now kibana# 检查端口
ss -nap |grep 5601
访问地址模板:http://192.168.91.103:5601
第六章:ELK Stack 常见问题与解决方案
6.1 安装阶段问题
1. RPM包安装问题
现象1: 安装时报依赖错误
error: Failed dependencies: java-1.8.0-openjdk is needed by elasticsearch
解决方案:
# 检查Java版本
java -version# 安装正确版本Java
yum install java-1.8.0-openjdk* -y# 如果存在多个Java版本,设置默认版本
alternatives --config java
现象2: 提示文件冲突
file /etc/elasticsearch/elasticsearch.yml from install of elasticsearch conflicts with...
解决方案:
# 备份已存在的配置
mv /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak# 强制安装
rpm -ivh --force elasticsearch-6.7.2.rpm
2. 目录权限问题
现象: 启动服务报权限错误
failed to create node environment
java.security.AccessControlException: access denied
解决方案:
# 检查目录权限
ls -l /var/lib/elasticsearch
ls -l /var/log/elasticsearch# 修正权限
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch
chown -R elasticsearch:elasticsearch /var/log/elasticsearch
chmod 755 /var/lib/elasticsearch
chmod 755 /var/log/elasticsearch# 检查目录存在
mkdir -p /var/lib/elasticsearch
mkdir -p /var/log/elasticsearch
6.2 启动阶段问题
1. 内存相关问题
现象1: 启动时报内存锁定错误
[1]: max virtual memory areas vm.max_map_count [65530] is too low
解决方案:
# 临时修改
sysctl -w vm.max_map_count=262144# 永久修改
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
现象2: bootstrap checks failed
memory locking requested for elasticsearch process but memory is not locked
解决方案:
# 检查limits配置
cat /etc/security/limits.conf# 添加配置
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited# 检查systemd配置
vim /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity# 重载systemd
systemctl daemon-reload
2. 网络相关问题
现象1: 无法绑定端口
[ERROR][o.e.b.Bootstrap] [node1] bind_exception
解决方案:
# 检查端口占用
netstat -tulpn | grep 9200
netstat -tulpn | grep 9300# 如果端口被占用,找到并关闭进程
fuser -k 9200/tcp
fuser -k 9300/tcp# 检查防火墙
firewall-cmd --list-ports
firewall-cmd --permanent --add-port=9200/tcp
firewall-cmd --permanent --add-port=9300/tcp
firewall-cmd --reload
现象2: 集群节点无法发现
no known nodes
解决方案:
# 检查配置文件中的host配置
vim elasticsearch.yml# 确保network.host配置正确
network.host: 0.0.0.0# 检查节点间通信
ping 对方节点IP
telnet 对方节点IP 9300# 检查hosts文件
vim /etc/hosts
添加节点IP和主机名映射
6.3 运行阶段问题
1. 日志文件问题
现象1: Logstash无法读取日志
Failed to open file {...} Permission denied
解决方案:
# 检查文件权限
ls -l /var/log/messages# 添加logstash用户到相应组
usermod -a -G adm logstash
usermod -a -G root logstash# 修改日志文件权限
chmod 644 /var/log/messages# 检查SELinux
getenforce
setenforce 0
现象2: 日志轮转后无法继续读取
Failed to open file: no such file or directory
解决方案:
# 检查logrotate配置
vim /etc/logrotate.d/nginx# 添加create权限
create 0644 nginx nginx# 确保新建日志文件权限正确
chmod 644 /var/log/nginx/access.log
2. 性能问题
现象1: ES查询响应慢
took: 15000ms
解决方案:
# 检查堆内存设置
cat /etc/elasticsearch/jvm.options# 调整堆内存
-Xms4g
-Xmx4g# 检查索引设置
curl -XGET 'localhost:9200/_settings?pretty'# 优化索引设置
curl -XPUT 'localhost:9200/_settings' -H 'Content-Type: application/json' -d '
{"index" : {"refresh_interval" : "30s","number_of_replicas" : 1}
}'
现象2: Logstash处理延迟
Pipeline has blocked
解决方案:
# 调整pipeline配置
vim /etc/logstash/pipelines.yml# 添加pipeline设置
pipeline.workers: 2
pipeline.batch.size: 125
pipeline.batch.delay: 50# 使用持久化队列
queue.type: persisted
queue.max_bytes: 1gb
3. 磁盘问题
现象1: 磁盘空间不足
[WARN] disk usage exceeded 85%
解决方案:
# 检查磁盘使用
df -h# 查看索引大小
curl -XGET 'localhost:9200/_cat/indices?v'# 删除旧索引
curl -XDELETE 'localhost:9200/logstash-2024.01.*'# 设置索引生命周期
curl -XPUT 'localhost:9200/_ilm/policy/my_policy' -H 'Content-Type: application/json' -d '
{"policy": {"phases": {"hot": {"actions": {}},"delete": {"min_age": "7d","actions": {"delete": {}}}}}
}'
现象2: 索引只读
index read-only/allow delete (api)
解决方案:
# 检查磁盘使用阈值
curl -XGET 'localhost:9200/_cluster/settings?pretty'# 修改磁盘阈值设置
curl -XPUT 'localhost:9200/_cluster/settings' -H 'Content-Type: application/json' -d '
{"persistent": {"cluster.routing.allocation.disk.threshold_enabled": true,"cluster.routing.allocation.disk.watermark.low": "85%","cluster.routing.allocation.disk.watermark.high": "90%","cluster.routing.allocation.disk.watermark.flood_stage": "95%"}
}'# 解除索引只读
curl -XPUT 'localhost:9200/_all/_settings' -H 'Content-Type: application/json' -d '
{"index.blocks.read_only_allow_delete": null
}'
4. Kibana展示问题
现象1: 无法显示数据
No results found
解决方案:
# 检查索引模式配置
Management -> Index Patterns# 确认时间范围设置
调整时间选择器范围# 检查索引是否存在
curl -XGET 'localhost:9200/_cat/indices?v'# 验证字段映射
curl -XGET 'localhost:9200/索引名称/_mapping?pretty'
现象2: 图表加载慢
Loading...一直显示
解决方案:
# 检查浏览器控制台错误
F12 -> Console# 优化查询设置
vim /etc/kibana/kibana.yml
elasticsearch.requestTimeout: 60000
elasticsearch.shardTimeout: 30000# 减少时间范围
使用较小的时间窗口# 使用索引模板优化
curl -XPUT 'localhost:9200/_template/template_1' -H 'Content-Type: application/json' -d '
{"index_patterns": ["logstash-*"],"settings": {"number_of_shards": 1,"number_of_replicas": 1}
}'
6.4 其他常见问题
1. 时区问题
现象: 日志时间显示不正确
解决方案:
# 检查系统时区
timedatectl# 修改系统时区
timedatectl set-timezone Asia/Shanghai# 修改Kibana配置
vim /etc/kibana/kibana.yml
dateFormat:tz: Asia/Shanghai# 修改Logstash配置
filter {date {match => [ "timestamp", "ISO8601" ]target => "@timestamp"timezone => "Asia/Shanghai"}
}
2. 字符编码问题
现象: 日志中文显示乱码
解决方案:
# 检查系统编码
locale# 设置系统编码
export LANG=zh_CN.UTF-8# Logstash配置添加编码设置
input {file {path => "/var/log/messages"codec => plain { charset => "UTF-8" }}
}# 检查日志文件编码
file -i /var/log/messages# 转换文件编码
iconv -f GBK -t UTF-8 input.log > output.log
3. 内存泄漏问题
现象: 服务占用内存持续增长
解决方案:
# 监控内存使用
top -p `pgrep -f elasticsearch`# 查看GC日志
vim /etc/elasticsearch/jvm.options
-Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m# 分析堆内存
jmap -heap PID# 调整JVM参数
vim /etc/elasticsearch/jvm.options
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/elasticsearch/
4.主机压缩包传不上xshell
解决办法:
yum -y install lrzsz
5.tar解压bz2包失败(同上)
tar (child): bzip2:无法 exec: 没有那个文件或目录
解决办法:
yum install -y bzip2
6.make出错
出错示例:
[root@localhost opt]# yum -y install make
软件包 1:make-3.82-24.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost opt]# make -j2
make: *** 没有指明目标并且找不到 makefile。 停止。
[root@localhost zabbix-4.0.30]# make install
make: *** 没有规则可以创建目标“install”。 停止。
解决办法:
[root@localhost opt]# yum -y install make
[root@localhost opt]# yum -y install gcc[root@localhost opt]#./configur