023、ELK 从入门到实践

ELK 从入门到实践


第一章:ELK基础概念

1.1 为什么需要ELK?

传统日志处理的痛点

  1. 日志分散

    • 应用部署在不同服务器
    • 需要逐个登录查看
    • 无法统一管理
  2. 查询困难

    • 只能用grep等命令
    • 无法复杂检索
    • 分析效率低
  3. 展示受限

    • 纯文本格式
    • 无法可视化
    • 难以直观展示

ELK的解决方案

  1. 集中化管理

    • 统一收集所有日志
    • 集中存储和检索
    • 一站式管理平台
  2. 强大的搜索能力

    • 全文检索
    • 复杂查询
    • 实时分析
  3. 可视化展示

    • 丰富的图表
    • 实时监控
    • 自定义仪表盘

1.2 组件详解

Elasticsearch

  1. 核心功能

    • 分布式搜索引擎
    • 数据存储和索引
    • 提供REST API
  2. 工作原理

    数据 -> 分片存储 -> 倒排索引 -> 快速检索
    
  3. 重要概念

    • Index(索引): 类似数据库
    • Type(类型): 类似表
    • Document(文档): 类似行记录
    • Field(字段): 类似列

Logstash

  1. 数据处理流程

    Input -> Filter -> Output
    
  2. 主要功能

    • 收集多源数据
    • 实时解析转换
    • 数据过滤处理
  3. 插件体系

    • input插件: file, syslog, kafka等
    • filter插件: grok, date, mutate等
    • output插件: elasticsearch, redis等

Kibana

  1. 可视化功能

    • Discover: 数据探索
    • Visualize: 图表制作
    • Dashboard: 仪表盘
    • Dev Tools: 开发工具
  2. 数据分析能力

    • 聚合分析
    • 趋势图表
    • 地理信息

第二章:环境准备详解

2.1 服务器规划

硬件配置

bash 复制代码
# 节点配置
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

配置说明:

  1. CPU配置

    • ES是CPU密集型应用
    • 需要处理复杂查询
    • 2核满足基本需求
  2. 内存配置

    • ES大量使用内存缓存
    • JVM堆内存建议2G
    • 系统预留2G
    • 避免使用swap
  3. 磁盘配置

    • 日志数据增长快
    • 需要定期清理
    • 建议使用SSD
    • 预留足够空间
  4. 网络要求

    • 内网环境部署
    • 千兆网络
    • 集群间通信
    • 数据传输安全

2.2 基础环境配置

Java环境

bash 复制代码
# 安装Java
yum -y install java

# 验证版本
java -version

# 建议使用Java 8
# ELK 6.x版本最兼容Java 8

系统优化

bash 复制代码
# 关闭防火墙
systemctl disable --now firewalld

# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

优化说明:

  1. 关闭防火墙原因

    • ELK组件间通信频繁
    • 需要多个端口
    • 简化部署过程
    • 生产环境建议配置安全组
  2. 关闭SELinux原因

    • 避免权限问题
    • 简化配置过程
    • 生产环境可以配置策略

系统限制调整

bash 复制代码
# 修改系统限制
vim /etc/security/limits.conf
*  soft    nofile          65536
*  hard    nofile          65536
*  soft    nproc           32000
*  hard    nproc           32000
*  soft    memlock         unlimited
*  hard    memlock         unlimited

参数详解:

  1. nofile(文件描述符)

    • 为什么要调大?

      • ES需要大量打开文件
      • 默认1024太小
      • 建议65536或更大
    • soft/hard区别

      • soft: 警告限制
      • hard: 硬性限制
      • 建议设置相同
  2. nproc(进程数)

    • 调整原因
      • ES会创建多个进程
      • 需要足够进程数
      • 默认值可能不够
  3. memlock(内存锁定)

    • 作用
      • 防止内存交换
      • 提高性能
      • 保证稳定性

内核参数优化

bash 复制代码
# 修改内核参数
vim /etc/sysctl.conf
vm.max_map_count=262144

# 立即生效
sysctl -p

参数说明:

  1. max_map_count
    • 定义

      • 限制进程内存映射区域数量
      • 影响ES内存使用
      • 过小会启动失败
    • 设置建议

      • 2G内存: 262144
      • 4G内存: 524288
      • 8G内存: 1048576

第三章:Elasticsearch部署详解

3.1 安装过程

软件安装

bash 复制代码
# 安装ES
rpm -ivh elasticsearch-6.7.2.rpm

# 创建配置备份
cd /etc/elasticsearch/
mkdir bak
cp -a *.yml bak/

安装说明:

  1. 目录结构

    /etc/elasticsearch/: 配置文件目录
    /usr/share/elasticsearch/: 程序文件目录
    /var/lib/elasticsearch/: 数据目录
    /var/log/elasticsearch/: 日志目录
    
  2. 备份原因

    • 保留原始配置
    • 便于回滚
    • 作为参考模板

3.2 配置详解

核心配置

yaml 复制代码
# 集群配置
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"]

配置详解:

  1. 集群配置

    • cluster.name

      • 标识集群的唯一名称
      • 所有节点必须相同
      • 建议有意义的名称
    • node.name

      • 节点唯一标识
      • 建议使用主机名
      • 集群内不能重复
  2. 节点角色

    • master节点职责

      • 管理集群状态
      • 处理索引操作
      • 分片分配决策
      • 集群状态维护
    • data节点职责

      • 存储数据
      • 处理CRUD
      • 执行搜索
      • 数据聚合分析
  3. 内存管理

    • bootstrap.memory_lock
      • 锁定物理内存
      • 禁止swap
      • 提高性能
      • 保证稳定性
  4. 网络设置

    • network.host

      • 0.0.0.0表示所有接口
      • 生产环境指定IP
      • 安全性考虑
    • 端口说明

      • 9200: REST API接口
      • 9300: 节点间通信
      • 注意防火墙配置
  5. 集群发现机制

    • unicast发现
      • 显式指定节点列表
      • 比广播更可靠
      • 生产环境推荐
      • 支持域名配置

启动验证

bash 复制代码
# 启动服务
systemctl enable --now elasticsearch

# 检查端口
netstat -antp | grep 9200

# 验证集群
curl http://localhost:9200/_cluster/health?pretty

验证说明:

  1. 服务启动

    • enable: 开机自启

    • --now: 立即启动

    • 检查状态: systemctl status elasticsearch

  2. 端口检查

    • 9200端口正常监听

    • 确认IP和端口绑定

    • 检查进程状态

  3. 集群健康检查

    • green: 完全健康
    • yellow: 副本未分配
    • red: 主分片未分配

3.3 插件安装配置

Head插件安装

bash 复制代码
# 安装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

安装说明:

  1. 依赖组件

    • node.js: JavaScript运行环境

    • phantomjs: 无头浏览器

    • npm: 包管理工具

  2. head插件功能

    • 集群状态监控
    • 索引数据查看
    • 执行简单操作
    • 可视化管理

配置ES支持head

yaml 复制代码
# 添加到elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"

配置说明:

  1. cors.enabled

    • 启用跨域访问
    • head插件需要
  2. cors.allow-origin

    • 允许所有来源
    • 生产环境应限制

启动head插件

bash 复制代码
cd /opt/elasticsearch-head/
npm run start &

# 访问测试
http://192.168.91.100:9100

使用说明:

  1. 连接集群

    • 输入ES地址
    • 检查连接状态
    • 查看集群健康
  2. 常用功能

    • 索引管理

    • 数据浏览

    • 简单查询

    • 集群监控

第四章:Logstash部署详解

4.1 基础安装

软件安装

bash 复制代码
# 安装Logstash
rpm -ivh logstash-6.7.2.rpm

# 启动服务
systemctl enable --now logstash.service

# 创建软链接
ln -s /usr/share/logstash/bin/logstash /usr/bin/

安装说明:

  1. 目录结构

    /etc/logstash/: 配置文件目录
    /usr/share/logstash/: 程序目录
    /var/log/logstash/: 日志目录
    
  2. 软链接作用

    • 方便命令执行
    • 无需指定完整路径
    • 简化操作过程

4.2 配置文件详解

基本结构

ruby 复制代码
input { }    # 输入配置
filter { }   # 过滤配置
output { }   # 输出配置

配置说明:

  1. input部分

    • 定义数据来源
    • 支持多种输入
    • 常用插件:file, beats, syslog
  2. filter部分

    • 数据处理转换
    • 格式化解析
    • 字段处理
  3. output部分

    • 定义输出目标
    • 支持多目标输出
    • 常用:elasticsearch, redis

系统日志收集示例

ruby 复制代码
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}"
    }
}

配置解析:

  1. input配置

    • path: 日志文件路径
    • type: 日志类型标识
    • start_position: 读取位置
    • stat_interval: 扫描间隔
  2. output配置

    • hosts: ES集群地址
    • index: 索引名称模板
    • 支持时间变量

第五章:Kibana部署详解

5.1 基础安装

bash 复制代码
# 安装Kibana
rpm -ivh kibana-6.7.2-x86_64.rpm

# 创建配置备份
cd /etc/kibana/
cp kibana.yml kibana.yml.bak

5.2 配置详解

yaml 复制代码
# 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    # 日志文件

配置说明:

  1. 服务配置

    • server.port: 访问端口
    • server.host: 监听地址
      • 0.0.0.0表示所有接口
      • 生产环境建议限制
  2. ES连接配置

    • elasticsearch.hosts
      • 支持多个ES节点
      • 实现负载均衡
      • 提高可用性
  3. 其他设置

    • kibana.index: 存储Kibana配置
    • i18n.locale: 界面语言
    • logging.dest: 日志位置

5.3 启动与验证

bash 复制代码
# 设置日志文件权限
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: 安装时报依赖错误

bash 复制代码
error: Failed dependencies: java-1.8.0-openjdk is needed by elasticsearch

解决方案:

bash 复制代码
# 检查Java版本
java -version

# 安装正确版本Java
yum install java-1.8.0-openjdk* -y

# 如果存在多个Java版本,设置默认版本
alternatives --config java

现象2: 提示文件冲突

bash 复制代码
file /etc/elasticsearch/elasticsearch.yml from install of elasticsearch conflicts with...

解决方案:

bash 复制代码
# 备份已存在的配置
mv /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak

# 强制安装
rpm -ivh --force elasticsearch-6.7.2.rpm

2. 目录权限问题

现象: 启动服务报权限错误

bash 复制代码
failed to create node environment
java.security.AccessControlException: access denied

解决方案:

bash 复制代码
# 检查目录权限
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

解决方案:

bash 复制代码
# 临时修改
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

解决方案:

bash 复制代码
# 检查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

解决方案:

bash 复制代码
# 检查端口占用
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

解决方案:

bash 复制代码
# 检查配置文件中的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

解决方案:

bash 复制代码
# 检查文件权限
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

解决方案:

bash 复制代码
# 检查logrotate配置
vim /etc/logrotate.d/nginx

# 添加create权限
create 0644 nginx nginx

# 确保新建日志文件权限正确
chmod 644 /var/log/nginx/access.log

2. 性能问题

现象1: ES查询响应慢

took: 15000ms

解决方案:

bash 复制代码
# 检查堆内存设置
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

解决方案:

bash 复制代码
# 调整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%

解决方案:

bash 复制代码
# 检查磁盘使用
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)

解决方案:

bash 复制代码
# 检查磁盘使用阈值
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

解决方案:

bash 复制代码
# 检查索引模式配置
Management -> Index Patterns

# 确认时间范围设置
调整时间选择器范围

# 检查索引是否存在
curl -XGET 'localhost:9200/_cat/indices?v'

# 验证字段映射
curl -XGET 'localhost:9200/索引名称/_mapping?pretty'

现象2: 图表加载慢

Loading...一直显示

解决方案:

bash 复制代码
# 检查浏览器控制台错误
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. 时区问题

现象: 日志时间显示不正确
解决方案:

bash 复制代码
# 检查系统时区
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. 字符编码问题

现象: 日志中文显示乱码
解决方案:

bash 复制代码
# 检查系统编码
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. 内存泄漏问题

现象: 服务占用内存持续增长
解决方案:

bash 复制代码
# 监控内存使用
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

相关推荐
幽弥千月19 小时前
【ELK】ES单节点升级为集群并开启https【亲测可用】
elk·elasticsearch·https
IT猿手19 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
流穿2 天前
ELK系列-(六)Redis也能作为消息队列?(下)
数据库·redis·ubuntu·elk·docker·容器
流穿2 天前
ELK系列-(五)指标收集-MetricBeat(下)
linux·运维·ubuntu·elk·docker·容器
流穿3 天前
ELK系列-(五)指标收集-MetricBeat(上)
ubuntu·elk·elasticsearch·docker
高hongyuan3 天前
Linux环境下 搭建ELk项目 -单机版练习
大数据·运维·服务器·elk·elasticsearch·搜索引擎
运维&陈同学4 天前
【Elasticsearch04】企业级日志分析系统ELK之Elasticsearch 插件
大数据·运维·后端·elk·elasticsearch·搜索引擎·全文检索·哈希算法
幽弥千月5 天前
【ELK】Filebeat采集Docker容器日志
elk·docker·容器
运维&陈同学6 天前
【Elasticsearch03】企业级日志分析系统ELK之Elasticsearch访问与优化
大数据·elk·elasticsearch·搜索引擎·云原生·全文检索·高可用
运维&陈同学8 天前
【Elasticsearch01】企业级日志分析系统ELK之Elasticsearch单机部署
大数据·linux·elk·elasticsearch·微服务·云原生·jenkins