ELK 企业级日志分析系统部署与实践

文章目录

  • [ELK 企业级日志分析系统部署与实践](#ELK 企业级日志分析系统部署与实践)
    • 一、案例概述
      • [1.1 传统日志管理的痛点](#1.1 传统日志管理的痛点)
      • [1.2 ELK 的解决方案](#1.2 ELK 的解决方案)
      • [1.3 ELK 工作原理与流程](#1.3 ELK 工作原理与流程)
        • [1.3.1 架构流程](#1.3.1 架构流程)
        • [【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【Kibana Server】→→【Browser】](#【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【Kibana Server】→→【Browser】)
    • 二、案例前置知识点
      • [2.1 Elasticsearch 核心概念与细节](#2.1 Elasticsearch 核心概念与细节)
      • [2.2 Logstash 核心组件与工作流](#2.2 Logstash 核心组件与工作流)
        • [2.2.1 核心组件](#2.2.1 核心组件)
        • [2.2.2 常用插件示例(补充原文档未展开内容)](#2.2.2 常用插件示例(补充原文档未展开内容))
      • [2.3 Kibana 核心功能与使用技巧](#2.3 Kibana 核心功能与使用技巧)
        • [2.3.1 核心功能扩展](#2.3.1 核心功能扩展)
    • 三、案例环境与部署步骤(完全保留原文档核心,补充细节)
      • [3.1 环境规划(原文档配置完全保留)](#3.1 环境规划(原文档配置完全保留))
        • [3.1.1 前置环境准备(补充原文档未提及的系统配置)](#3.1.1 前置环境准备(补充原文档未提及的系统配置))
      • [3.2 部署 Elasticsearch 集群(原步骤保留,补充校验与问题排查)](#3.2 部署 Elasticsearch 集群(原步骤保留,补充校验与问题排查))
        • [3.2.1 节点 1(node1:192.168.100.41)配置](#3.2.1 节点 1(node1:192.168.100.41)配置)
        • [3.2.2 节点 2(node2:192.168.100.42)配置](#3.2.2 节点 2(node2:192.168.100.42)配置)
        • [3.2.3 集群健康状态检查(原步骤保留,补充状态含义)](#3.2.3 集群健康状态检查(原步骤保留,补充状态含义))
      • [3.3 安装 Elasticsearch-Head 插件(原步骤保留,补充替代方案与问题排查)](#3.3 安装 Elasticsearch-Head 插件(原步骤保留,补充替代方案与问题排查))
        • [3.3.1 方案 1:源码编译安装(原步骤保留,补充优化)](#3.3.1 方案 1:源码编译安装(原步骤保留,补充优化))
        • [3.3.2 方案 2:Chrome 浏览器插件(补充便捷方案)](#3.3.2 方案 2:Chrome 浏览器插件(补充便捷方案))
        • [3.3.3 常见问题排查(补充)](#3.3.3 常见问题排查(补充))
      • [3.4 部署 Logstash(原步骤保留,补充配置优化与验证)](#3.4 部署 Logstash(原步骤保留,补充配置优化与验证))
        • [3.4.1 安装 Logstash(原步骤保留,补充源安装方式)](#3.4.1 安装 Logstash(原步骤保留,补充源安装方式))
        • [3.4.2 Logstash 功能测试(原步骤保留,补充输出解读)](#3.4.2 Logstash 功能测试(原步骤保留,补充输出解读))
        • [3.4.3 配置 Logstash 采集日志(原配置保留,补充生产优化)](#3.4.3 配置 Logstash 采集日志(原配置保留,补充生产优化))
      • [3.5 部署 Kibana(原步骤保留,补充高级配置与使用)](#3.5 部署 Kibana(原步骤保留,补充高级配置与使用))
        • [3.5.1 安装 Kibana(原步骤保留,补充源安装)](#3.5.1 安装 Kibana(原步骤保留,补充源安装))
        • [3.5.2 配置 Kibana(原配置保留,补充优化)](#3.5.2 配置 Kibana(原配置保留,补充优化))
        • [3.5.3 启动与访问(原步骤保留,补充权限控制)](#3.5.3 启动与访问(原步骤保留,补充权限控制))
        • [3.5.4 Kibana 高级使用(补充原文档缺失)](#3.5.4 Kibana 高级使用(补充原文档缺失))
    • 四、生产环境补充优化(原文档基础上扩展)
      • [4.1 Elasticsearch 优化(补充细节)](#4.1 Elasticsearch 优化(补充细节))
      • [4.2 Logstash 优化(补充高并发场景)](#4.2 Logstash 优化(补充高并发场景))
      • [4.3 Kibana 优化(补充监控与权限)](#4.3 Kibana 优化(补充监控与权限))
      • [4.4 Beats 集成(补充轻量采集方案)](#4.4 Beats 集成(补充轻量采集方案))
        • [4.4.1 在 Apache 主机(192.168.100.43)安装 Filebeat](#4.4.1 在 Apache 主机(192.168.100.43)安装 Filebeat)
        • [4.4.2 配置 Filebeat 采集 Apache 日志](#4.4.2 配置 Filebeat 采集 Apache 日志)
        • [4.4.3 配置 Logstash 接收 Filebeat 数据](#4.4.3 配置 Logstash 接收 Filebeat 数据)
    • 五、常见问题排查(补充原文档缺失场景)
      • [5.1 Elasticsearch 问题](#5.1 Elasticsearch 问题)
      • [5.2 Logstash 问题](#5.2 Logstash 问题)
      • [5.3 Kibana 问题](#5.3 Kibana 问题)
    • 六、附录:常用命令汇总(补充便捷参考)
      • [6.1 Elasticsearch 命令](#6.1 Elasticsearch 命令)
      • [6.2 Logstash 命令](#6.2 Logstash 命令)
      • [6.3 Kibana 命令](#6.3 Kibana 命令)
    • 七、总结

ELK 企业级日志分析系统部署与实践

一、案例概述

日志分析是运维工程师定位系统故障、评估服务健康度、追溯安全事件的核心手段。日常运维场景中,日志主要分为三类:

  • 系统日志 :记录服务器硬件状态(如磁盘 IO、内存使用率)、操作系统进程(如 crond、sshd)运行信息,路径通常为/var/log/messages(CentOS)或/var/log/syslog(Ubuntu);
  • 应用程序日志 :记录业务服务运行细节,如 Apache 的访问日志(access_log)、错误日志(error_log)、Java 应用的logs目录日志;
  • 安全日志 :记录用户登录(/var/log/secure)、权限变更、防火墙规则匹配等安全相关事件。

通过定期分析日志,可及时发现服务器性能瓶颈(如 CPU 持续高占用)、应用异常(如频繁 500 错误)、安全风险(如暴力破解登录)。

1.1 传统日志管理的痛点

传统运维中,日志分散存储在每台服务器本地,存在明显局限:

  1. 效率低下 :排查跨服务器故障时,需通过ssh逐台登录,用grep/awk/wc组合命令检索,耗时且易遗漏;
  2. 功能薄弱:无法实现实时日志监控、多维度统计(如按 "IP + 时间" 筛选访问记录)、可视化展示(如请求量趋势图);
  3. 追溯困难:日志文件易被误删或覆盖(默认日志轮转策略可能导致历史日志丢失),无法长期留存与追溯。

1.2 ELK 的解决方案

开源实时日志分析平台 ELK(Elasticsearch + Logstash + Kibana)通过 "分工协作" 解决上述问题,三者核心定位如下:

组件 核心功能 角色定位
Elasticsearch 分布式全文搜索引擎,支持日志的索引创建、分布式存储、实时查询,基于 Lucene 开发 "数据仓库"
Logstash 日志采集与处理工具,支持多源输入、数据清洗、多目标输出,基于 JRuby 运行 "数据搬运工 + 清洁工"
Kibana 可视化分析平台,提供 Web 界面实现日志的查询、统计、图表展示、仪表盘定制 "数据展示窗口"

官方地址:https://www.elastic.co/products(需注意组件版本兼容性,本文采用 5.x 系列,与 Java 8 完全兼容)。

1.3 ELK 工作原理与流程

1.3.1 架构流程
【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【Kibana Server】→→【Browser】
  1. 日志集中采集:通过 Logstash Agent 部署在业务服务器,监控日志文件变化(或通过 Beats 轻量采集器补充采集);
  2. 日志格式化处理:Logstash 通过 Filter 插件清洗日志(如提取 IP、时间戳、请求方法,过滤冗余字段);
  3. 索引与分布式存储 :Elasticsearch 将格式化日志创建索引(按日期分片,如system-2024.10.01),并分布式存储到集群节点;
  4. 可视化查询与分析:Kibana 读取 Elasticsearch 索引,提供 "日志检索、趋势图表、自定义仪表盘" 功能,支持运维人员快速定位问题。

二、案例前置知识点

2.1 Elasticsearch 核心概念与细节

Elasticsearch 是 ELK 的 "数据存储与查询核心",需理解其分布式架构相关概念,避免部署后出现性能瓶颈或数据丢失。

概念 定义与作用 类比关系型数据库 关键注意事项
接近实时(NRT) 文档索引后约 1 秒可被搜索,平衡实时性与性能(写入时先存内存缓冲区,1 秒后刷盘) - 若需更高实时性,可手动触发刷盘(POST /_flush),但会增加 IO 压力
集群(Cluster) 由 1 + 节点组成,共享数据并提供服务,集群名唯一(默认elasticsearch 数据库实例 生产环境需自定义集群名(如prod-elk-cluster),避免不同环境节点误加入
节点(Node) 单台服务器,属于某一集群,通过节点名标识(默认随机生成) 数据库服务器 可通过node.roles配置节点角色:主节点(master)、数据节点(data)、协调节点(coordinating
索引(Index) 相似特征文档的集合(如 "Apache 访问日志索引"),名称必须全小写 数据库 索引名建议包含业务类型 + 时间(如apache-access-2024.10),便于生命周期管理
类型(Type) 索引内的逻辑分类(如同一索引下分 "用户日志""订单日志"),7.x 后废弃 数据表 5.x 版本仍支持,建议一个索引对应一个类型,避免字段冲突
文档(Document) 可索引的最小单元,以 JSON 格式存储(如一条 Apache 访问记录) 数据行 文档需包含@timestamp字段(时间戳),便于 Kibana 按时间筛选
分片(Shard) 索引的水平拆分,每个分片是独立索引,可分布在不同节点 分表 分片数创建后不可修改,需提前规划(单分片大小建议 20-50GB,100GB 日志建议 2-5 个分片)
副本(Replica) 分片的拷贝,用于故障恢复与查询负载分担 数据备份 副本数可动态调整(如PUT /index-name/_settings {"number_of_replicas":1}),副本需部署在不同节点

默认配置说明:5.x 版本中,每个索引默认创建 5 个主分片 + 1 个副本,若集群有 2 个节点,总分片数为 10(5 主 + 5 副),需确保节点磁盘空间充足。

2.2 Logstash 核心组件与工作流

Logstash 的核心逻辑是 "Input → Filter → Output" 的数据流处理,三者均通过插件实现,需掌握常用插件配置。

2.2.1 核心组件
组件 功能描述 部署位置
Shipper 日志采集端,监控本地日志文件(如/var/log/messages),发送日志到 Indexer 业务服务器(如 Apache 主机)
Indexer 日志处理端,接收 Shipper 数据,通过 Filter 清洗后写入存储(如 ES) 中心服务器(可选独立部署)
Broker 中间缓冲层,对接多 Shipper 与多 Indexer,避免日志丢失(如 Redis/Kafka) 高并发场景必备
Search and Storage 日志查询与本地存储(如 Elasticsearch、文件),5.x 后通常直接对接 ES 与 Indexer 同节点
Web Interface 基于 Kibana 的 Logstash 监控界面(需安装logstash-kibana插件) Kibana 同节点
2.2.2 常用插件示例(补充原文档未展开内容)
  • Input 插件:除stdin(标准输入)、file(文件)外,常用beats对接 Filebeat)、redis(从 Redis 读取日志);

    示例(对接 Filebeat):

    yaml 复制代码
    input {
      beats {
        port => 5044  # Filebeat数据发送端口
      }
    }
  • Filter 插件

    补充 3 个核心插件:

    1.grok提取非结构化日志为结构化字段(如 Apache 访问日志);示例(提取 Apache 访问日志字段):

    yaml 复制代码
    filter {
      if [type] == "access" {
        grok {
          match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:response_size}" }
        }
        date {  # 将日志时间字段解析为ES的@timestamp
          match => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"]
          target => "@timestamp"
        }
        mutate {  # 删除冗余字段
          remove_field => ["ident", "auth"]
        }
      }
    }

    2.date`:统一日志时间格式,避免 ES 使用 "采集时间" 替代 "日志实际时间";

    3.mutate:修改字段(如重命名、删除、类型转换);

  • Output 插件 :除stdout(标准输出)、elasticsearch外,常用file(本地存储)、kafka(缓冲到 Kafka)。

2.3 Kibana 核心功能与使用技巧

Kibana 是 ELK 的 "前端门面",需掌握索引管理、日志查询、可视化定制的实操细节,补充原文档未覆盖的高级功能。

2.3.1 核心功能扩展
  1. 索引模式管理 :创建索引模式后,可设置 "默认时间字段"(如@timestamp)、隐藏冗余字段(如message中的冗余内容);

  2. Discover 查询

    :支持 Lucene 查询语法,示例:

    • 全文搜索:error(查询包含 "error" 的所有日志);
    • 字段过滤:status_code:500(查询 HTTP 500 错误日志);
    • 时间范围:选择 "Last 1h"(查询近 1 小时日志);
  3. Visualize 图表:除原文档提到的类型外,补充 "数据表格"(展示 TOP 10 访问 IP)、"热力图"(展示时段请求分布);

  4. Dashboard 权限控制:通过 Kibana 的 "Roles" 功能,为不同用户分配仪表盘查看 / 编辑权限(如开发人员仅能查看应用日志仪表盘)。

三、案例环境与部署步骤(完全保留原文档核心,补充细节)

3.1 环境规划(原文档配置完全保留)

主机角色 操作系统 主机名 IP 地址 核心软件 硬件建议(补充)
ES 主节点 / Kibana CentOS 7.4 node1 192.168.100.41 Elasticsearch 5.5.0、Kibana 5.5.1 4 核 8G+、SSD 100G+
ES 从节点 CentOS 7.4 node2 192.168.100.42 Elasticsearch 5.5.0 4 核 8G+、SSD 100G+
日志采集端 CentOS 7.4 apache 192.168.100.43 Logstash 5.5.1、Apache httpd 2 核 4G、HDD 50G+
3.1.1 前置环境准备(补充原文档未提及的系统配置)

所有节点需执行以下操作,避免部署中出现权限、内存问题:

  1. 关闭防火墙与 SELinux(原文档命令保留,补充验证):

    bash 复制代码
    # 关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld
    # 关闭SELinux(临时+永久)
    setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    # 验证:SELinux状态为disabled
    getenforce  # 输出Disabled
  2. 配置 Java 环境

    (原文档保留,补充版本校验):

    bash 复制代码
    # 安装Java 8(若未安装)
    yum install java-1.8.0-openjdk-devel -y
    # 验证:需为1.8.0_xxx版本
    java -version  # 输出openjdk version "1.8.0_181"及以上
  3. 调整系统参数

    (补充 ES 必备配置,避免内存、文件句柄不足):

    bash 复制代码
    # 编辑limits.conf,增加ES用户资源限制
    cat >> /etc/security/limits.conf << EOF
    elasticsearch soft nofile 65536
    elasticsearch hard nofile 65536
    elasticsearch soft nproc 4096
    elasticsearch hard nproc 4096
    EOF
    # 编辑sysctl.conf,调整虚拟内存
    cat >> /etc/sysctl.conf << EOF
    vm.max_map_count=262144
    EOF
    # 生效配置
    sysctl -p

3.2 部署 Elasticsearch 集群(原步骤保留,补充校验与问题排查)

3.2.1 节点 1(node1:192.168.100.41)配置
  1. 修改主机名与域名解析(原命令保留,补充验证):

    bash 复制代码
    hostnamectl set-hostname node1
    cat >> /etc/hosts << EOF
    192.168.100.41   node1
    192.168.100.42   node2
    EOF
    # 验证:ping node2可通
    ping node2 -c 2
  2. 安装 Elasticsearch RPM 包(原命令保留,补充下载方式):

    bash 复制代码
    # 若未上传RPM包,可通过官方源下载(补充)
    rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    cat >> /etc/yum.repos.d/elasticsearch.repo << EOF
    [elasticsearch-5.x]
    name=Elasticsearch repository for 5.x packages
    baseurl=https://artifacts.elastic.co/packages/5.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    EOF
    # 安装
    yum install elasticsearch-5.5.0 -y
  3. 修改 Elasticsearch 主配置文件(原配置保留,补充注释说明):

    bash 复制代码
    cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
    vim /etc/elasticsearch/elasticsearch.yml

    关键配置(带补充说明):

    yaml 复制代码
    cluster.name: my-elk-cluster    # 集群名,所有节点必须一致
    node.name: node1                # 节点名,每个节点唯一
    node.master: true               # 允许该节点成为主节点(补充原文档缺失)
    node.data: true                 # 允许该节点存储数据(补充原文档缺失)
    path.data: /data/elk_data       # 数据存储路径,需独立磁盘挂载(生产建议)
    path.logs: /var/log/elasticsearch/  # 日志路径
    bootstrap.memory_lock: false    # 生产环境建议设为true(锁定内存,避免swap),需配合系统参数调整
    network.host: 0.0.0.0           # 绑定所有IP,允许外部访问
    http.port: 9200                 # HTTP端口(ES API与Head插件访问)
    transport.tcp.port: 9300        # 节点间通信端口(补充原文档缺失)
    discovery.zen.ping.unicast.hosts: ["node1:9300", "node2:9300"]  # 单播发现,指定通信端口
    discovery.zen.minimum_master_nodes: 2  # 脑裂防护(补充原文档缺失,公式:(主节点数/2)+1)
  4. 创建数据目录并授权(原命令保留,补充磁盘检查):

    bash 复制代码
    # 检查/data目录是否挂载独立磁盘(补充)
    df -h | grep /data  # 确认有独立挂载
    mkdir -p /data/elk_data
    chown -R elasticsearch:elasticsearch /data/elk_data/  # 递归授权,避免子目录权限不足
  5. 启动服务并验证(原命令保留,补充多维度校验):

    bash 复制代码
    systemctl daemon-reload
    systemctl enable elasticsearch.service && systemctl start elasticsearch.service
    # 验证1:查看服务状态(active为正常)
    systemctl status elasticsearch.service
    # 验证2:查看端口监听(9200和9300均需监听)
    netstat -antp | grep java  # ES基于Java运行,进程名为java
    # 验证3:通过API查看节点信息(补充)
    curl http://192.168.100.41:9200
    # 预期输出:包含"name":"node1"、"cluster_name":"my-elk-cluster"
3.2.2 节点 2(node2:192.168.100.42)配置

步骤与 node1 完全一致,仅需修改elasticsearch.yml中的node.name: node2,其余配置(集群名、数据路径、发现地址等)完全相同。

关键验证 :启动后执行curl http://192.168.100.41:9200/_cat/nodes?v,输出应包含 2 个节点(node1、node2),且master列中 node1 或 node2 有*标识(主节点)。

3.2.3 集群健康状态检查(原步骤保留,补充状态含义)
  1. 查看集群健康

    bash 复制代码
    curl http://192.168.100.41:9200/_cluster/health?pretty

    状态说明(补充):

    • green:所有主分片 + 副本分片均正常;
    • yellow:主分片正常,副本分片异常(如仅 1 个节点,副本无法分配);
    • red:主分片异常,数据不可用(需紧急排查,查看日志/var/log/elasticsearch/my-elk-cluster.log)。
  2. 查看分片分布(补充原文档缺失):

    bash 复制代码
    curl http://192.168.100.41:9200/_cat/shards?v

    可查看每个索引的主分片(p)、副本分片(r)分布在哪个节点。

3.3 安装 Elasticsearch-Head 插件(原步骤保留,补充替代方案与问题排查)

Elasticsearch-Head 是 ES 集群可视化工具,原文档采用源码编译安装,补充 "Chrome 插件" 替代方案(更便捷),同时保留原步骤。

3.3.1 方案 1:源码编译安装(原步骤保留,补充优化)
  1. 安装依赖环境(原命令保留,补充 Node.js 快速安装方式):

    bash 复制代码
    yum install gcc gcc-c++ make -y
    # 补充:源码编译耗时久,生产环境建议用yum安装Node.js(需先安装EPEL源)
    yum install epel-release -y
    yum install nodejs -y
    node -v  # 输出v6.17.1及以上即可(兼容Head插件)
  2. 安装 PhantomJS(原命令保留,补充缺失依赖):

    bash 复制代码
    cd /usr/local/src
    tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
    cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin
    # 补充:若执行phantomjs报错"libfontconfig.so.1缺失",安装依赖
    yum install fontconfig -y
    phantomjs -v  # 输出2.1.1即正常
  3. 安装并启动 Head 插件(原命令保留,补充后台运行优化):

    bash 复制代码
    cd /usr/local/src
    tar xzvf elasticsearch-head.tar.gz
    cd elasticsearch-head
    npm install --registry=https://registry.npm.taobao.org  # 用淘宝源加速安装(补充)
    # 补充:修改Head默认端口(若9100被占用)
    vim Gruntfile.js
    # 找到port: 9100,修改为其他端口(如9101)
    # 后台启动(补充:用nohup确保断开SSH后仍运行)
    nohup npm run start &
    # 验证:查看进程
    ps -ef | grep grunt
3.3.2 方案 2:Chrome 浏览器插件(补充便捷方案)
  1. 打开 Chrome 浏览器,进入 "应用商店" 搜索 "Elasticsearch Head";
  2. 安装后点击插件图标,输入http://192.168.100.41:9200,点击 "连接" 即可(无需配置跨域,适合个人运维)。
3.3.3 常见问题排查(补充)
  • Head 无法连接 ES:
    1. 检查 ES 跨域配置(http.cors.enabled: truehttp.cors.allow-origin: "*");
    2. 检查 ES 服务是否正常(systemctl status elasticsearch);
    3. 检查节点间网络(telnet 192.168.100.41 9200,确保端口可通)。

3.4 部署 Logstash(原步骤保留,补充配置优化与验证)

3.4.1 安装 Logstash(原步骤保留,补充源安装方式)
bash 复制代码
# 补充:通过官方源安装(无需手动上传RPM)
cat >> /etc/yum.repos.d/logstash.repo << EOF
[logstash-5.x]
name=Logstash repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install logstash-5.5.1 -y
systemctl enable logstash.service && systemctl start logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
3.4.2 Logstash 功能测试(原步骤保留,补充输出解读)
  1. 标准输入→标准输出(原命令保留,补充输出含义):

    bash 复制代码
    logstash -e 'input { stdin{} } output { stdout{} }'
    # 输入"test log",预期输出:
    # 2024-10-01T08:00:00.000Z apache test log
    # 格式:[时间戳] [主机名] [输入内容]
  2. 标准输入→Elasticsearch 输出(原命令保留,补充 ES 索引验证):

    bash 复制代码
    logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.41:9200"] } }'
    # 输入"es test"后,通过Head插件查看:
    # 索引列表会新增"logstash-2024.10.01"(默认按日期命名)
3.4.3 配置 Logstash 采集日志(原配置保留,补充生产优化)
  1. 采集系统日志(/var/log/messages)(原配置保留,补充 sincedb 说明):

    bash 复制代码
    vim /etc/logstash/conf.d/system.conf

    配置补充说明:

    yaml 复制代码
    input {
      file {
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"  # 首次采集从文件开头开始,后续从上次结束位置(sincedb记录)
        sincedb_path => "/dev/null"    # 禁用sincedb(每次重启都从开头采集),生产环境建议保留默认(/var/lib/logstash/plugins/inputs/file/.sincedb_xxx)
        sincedb_write_interval => 15   # sincedb写入间隔(秒),补充优化
      }
    }
    output {
      elasticsearch {
        hosts => ["192.168.100.41:9200"]
        index => "system-%{+YYYY.MM.dd}"  # 按日期拆分索引,便于后续清理
        document_type => "system_log"     # 文档类型,补充原文档缺失
      }
    }

    启动与验证(补充配置校验):

    bash 复制代码
    chmod o+r /var/log/messages
    # 补充:校验配置文件语法(避免启动失败)
    logstash -f /etc/logstash/conf.d/system.conf -t
    # 预期输出"Configuration OK"
    systemctl restart logstash.service
    # 验证:通过Head插件查看"system-2024.10.01"索引是否有数据
  2. 采集 Apache 日志(原配置保留,补充 Filter 优化):

    bash 复制代码
    vim /etc/logstash/conf.d/apache_log.conf

    补充 Filter 配置(结构化日志):

    yaml 复制代码
    input {
      file {
        path => "/etc/httpd/logs/access_log"
        type => "access"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
      file {
        path => "/etc/httpd/logs/error_log"
        type => "error"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    }
    # 补充Filter:结构化Apache访问日志
    filter {
      if [type] == "access" {
        grok {
          match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:response_size}" }
        }
        date {
          match => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"]
          target => "@timestamp"
        }
        mutate {
          remove_field => ["ident", "auth", "log_time"]  # 删除无用字段
        }
      }
    }
    output {
      if [type] == "access" {
        elasticsearch {
          hosts => ["192.168.100.41:9200"]
          index => "apache_access-%{+YYYY.MM.dd}"
        }
      }
      if [type] == "error" {
        elasticsearch {
          hosts => ["192.168.100.41:9200"]
          index => "apache_error-%{+YYYY.MM.dd}"
        }
      }
    }

    启动与验证(补充日志生成):

    bash 复制代码
    # 生成测试日志(访问Apache)
    curl http://192.168.100.43
    # 查看Logstash日志,确认无错误
    tail -f /var/log/logstash/logstash-plain.log
    # 通过Head插件查看"apache_access-2024.10.01"索引的结构化字段(如client_ip、status_code)

3.5 部署 Kibana(原步骤保留,补充高级配置与使用)

3.5.1 安装 Kibana(原步骤保留,补充源安装)
bash 复制代码
# 补充:通过官方源安装
cat >> /etc/yum.repos.d/kibana.repo << EOF
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install kibana-5.5.1 -y
3.5.2 配置 Kibana(原配置保留,补充优化)
bash 复制代码
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
vim /etc/kibana/kibana.yml

补充配置(优化访问与性能):

yaml 复制代码
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.100.41:9200"
kibana.index: ".kibana"  # Kibana配置存储索引,需确保ES可写入
elasticsearch.pingTimeout: 1500  # ES连接超时时间(毫秒),补充
elasticsearch.requestTimeout: 30000  # ES请求超时时间(毫秒),补充
server.maxPayloadBytes: 10485760  # 最大请求 payload 大小(10MB),补充
3.5.3 启动与访问(原步骤保留,补充权限控制)
bash 复制代码
systemctl enable kibana.service && systemctl start kibana.service
# 补充:若需限制Kibana访问IP,配置防火墙(示例允许192.168.100.0/24网段)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" port protocol="tcp" port="5601" accept' --permanent
firewall-cmd --reload

浏览器访问http://192.168.100.41:5601,首次登录需创建索引模式:

  1. 点击 "Management"→"Index Patterns"→"Create index pattern";
  2. 输入 "system-*",点击 "Next step";
  3. 选择 "@timestamp" 作为默认时间字段,点击 "Create index pattern";
  4. 重复上述步骤,创建 "apache_access-" 和 "apache_error-" 索引模式。
3.5.4 Kibana 高级使用(补充原文档缺失)
  1. Discover 日志查询
    • 选择 "apache_access-*" 索引模式,在搜索框输入 "status_code:404",可查询所有 404 错误日志;
    • 点击字段列表中的 "client_ip",选择 "Add",可在结果中显示客户端 IP。
  2. Visualize 图表制作(示例:Apache 访问量趋势)
    1. 点击 "Visualize"→"Create a visualization"→"Line chart";
    2. 选择 "apache_access-*" 索引模式;
    3. X 轴选择 "Date Histogram",字段选择 "@timestamp",间隔设为 "1h";
    4. Y 轴选择 "Count"(默认),点击 "Apply changes",生成近 24 小时访问量趋势图。
  3. Dashboard 仪表盘定制
    1. 点击 "Dashboard"→"Create a dashboard";
    2. 点击 "Add",选择已创建的 "访问量趋势图""TOP 10 客户端 IP 表格";
    3. 调整图表位置与大小,点击 "Save",命名为 "Apache 运维仪表盘";
    4. 补充:点击 "Share" 可生成链接,或导出为 PDF(需安装插件)。

四、生产环境补充优化(原文档基础上扩展)

4.1 Elasticsearch 优化(补充细节)

  1. 内存优化

    • 修改/etc/elasticsearch/jvm.options,堆内存设为物理内存的 50%(不超过 32GB):

      bash 复制代码
      -Xms8g  # 初始堆内存(若服务器为16GB内存)
      -Xmx8g  # 最大堆内存(与初始值一致,避免频繁扩容)
    • 启用内存锁定bootstrap.memory_lock: true,需确保/etc/security/limits.conf

      中elasticsearch用户的memlock限制为unlimited

      bash 复制代码
      echo "elasticsearch soft memlock unlimited" >> /etc/security/limits.conf
      echo "elasticsearch hard memlock unlimited" >> /etc/security/limits.conf
  2. 磁盘与 IO 优化

    • 数据目录path.data挂载 SSD 硬盘,IOPS 建议≥1000;

    • 关闭磁盘缓存(bootstrap.system_call_filter: false),避免系统缓存与 ES 缓存冲突;

    • 定期清理过期索引(如保留 30 天),可通过 Cron+ES API 实现:

      bash 复制代码
      # 清理30天前的system索引(添加到crontab,每天凌晨执行)
      echo 'curl -XDELETE "http://192.168.100.41:9200/system-$(date -d "30 days ago" +%Y.%m.%d)"' >> /etc/cron.d/elk_clean
  3. 集群扩展

    • 当日志量增长时,新增数据节点(配置node.master: false,仅作为数据存储);
    • 启用 ES 索引生命周期管理(ILM,5.x 需安装插件),自动实现 "热→温→冷" 数据分层存储。

4.2 Logstash 优化(补充高并发场景)

  1. 引入缓冲层(Redis/Kafka)

    当业务服务器数量>50 台时,直接用 Logstash Shipper 对接 ES 易导致 ES 压力过大,需引入 Redis 作为缓冲:

    • Logstash Shipper 输出到 Redis:

      yaml 复制代码
      output {
        redis {
          host => "192.168.100.44"  # Redis节点IP
          port => 6379
          data_type => "list"
          key => "logstash:apache"  # 队列键名
        }
      }
    • 中心 Logstash 从 Redis 读取日志并输出到 ES:

      yaml 复制代码
      input {
        redis {
          host => "192.168.100.44"
          port => 6379
          data_type => "list"
          key => "logstash:apache"
          threads => 5  # 多线程读取,提升效率
        }
      }
  2. 多管道配置

    不同类型日志(如系统日志、Apache 日志)独立处理,避免单管道阻塞:

    bash 复制代码
    # 创建管道配置目录
    mkdir /etc/logstash/pipelines
    # 编辑管道配置文件
    vim /etc/logstash/pipelines.yml

    配置内容:

    yaml 复制代码
    - pipeline.id: system
      path.config: "/etc/logstash/conf.d/system.conf"
      pipeline.workers: 2  # 工作线程数(建议等于CPU核心数)
    - pipeline.id: apache
      path.config: "/etc/logstash/conf.d/apache_log.conf"
      pipeline.workers: 2

4.3 Kibana 优化(补充监控与权限)

  1. 启用 Kibana 监控

    安装x-pack插件(5.x 版本需手动安装),监控 Kibana 运行状态:

    bash 复制代码
    /usr/share/kibana/bin/kibana-plugin install x-pack
    systemctl restart kibana.service

    访问http://192.168.100.41:5601/app/monitoring,可查看 Kibana 响应时间、请求量。

  2. 权限控制

    通过x-pack实现用户权限管理(如 "运维组" 可编辑仪表盘,"开发组" 仅可查看):

    1. 点击 "Management"→"Users"→"Create User";
    2. 设置用户名(如 "dev_user")、密码,角色选择 "read_only";
    3. 关联索引模式(如仅允许访问 "apache_access-*")。

4.4 Beats 集成(补充轻量采集方案)

原文档提到 Beats 但未展开,补充 Filebeat(轻量日志采集器)的部署,替代 Logstash Shipper(资源占用更低,适合海量服务器)。

4.4.1 在 Apache 主机(192.168.100.43)安装 Filebeat
bash 复制代码
# 安装Filebeat
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
cat >> /etc/yum.repos.d/elastic.repo << EOF
[elastic-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install filebeat-5.5.1 -y
4.4.2 配置 Filebeat 采集 Apache 日志
bash 复制代码
vim /etc/filebeat/filebeat.yml

关键配置:

yaml 复制代码
filebeat.prospectors:
- input_type: log
  paths:
    - /etc/httpd/logs/access_log  # Apache访问日志路径
  document_type: access  # 日志类型,与Logstash对应
- input_type: log
  paths:
    - /etc/httpd/logs/error_log  # Apache错误日志路径
  document_type: error

output.logstash:
  hosts: ["192.168.100.43:5044"]  # Logstash Beats输入端口
4.4.3 配置 Logstash 接收 Filebeat 数据
bash 复制代码
vim /etc/logstash/conf.d/filebeat.conf

配置内容:

yaml 复制代码
input {
  beats {
    port => 5044  # 与Filebeat输出端口一致
  }
}
filter {
  # 同3.4.3中的Apache Filter配置,结构化日志
  if [type] == "access" {
    grok {
      match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:response_size}" }
    }
    date {
      match => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"]
      target => "@timestamp"
    }
  }
}
output {
  if [type] == "access" {
    elasticsearch { hosts => ["192.168.100.41:9200"]; index => "apache_access-%{+YYYY.MM.dd}" }
  }
  if [type] == "error" {
    elasticsearch { hosts => ["192.168.100.41:9200"]; index => "apache_error-%{+YYYY.MM.dd}" }
  }
}

启动与验证:

bash 复制代码
systemctl start filebeat && systemctl enable filebeat
systemctl restart logstash.service
# 通过Head插件查看索引数据,确认Filebeat日志正常采集

五、常见问题排查(补充原文档缺失场景)

5.1 Elasticsearch 问题

  1. ES 服务启动失败,日志提示 "max virtual memory areas vm.max_map_count [65530] is too low"

    解决:执行sysctl -w vm.max_map_count=262144,并写入/etc/sysctl.conf永久生效。

  2. 集群脑裂(出现多个主节点)

    解决:确保discovery.zen.minimum_master_nodes配置正确(公式:(主节点数 / 2)+1),重启异常节点。

  3. 索引分片无法分配(状态为 unassigned)

    查看原因:curl http://192.168.100.41:9200/_cluster/allocation/explain?pretty

    常见原因:节点磁盘空间不足(需清理磁盘,确保使用率<85%)、副本数超过节点数(减少副本数)。

5.2 Logstash 问题

  1. Logstash 启动失败,日志提示 "Permission denied"

    解决:检查日志文件权限(如/var/log/messages需 Logstash 用户可读),执行chmod o+r /var/log/messages

  2. Logstash 到 ES 的连接超时

    解决:1. 检查 ES 服务是否正常;2. 检查网络(telnet 192.168.100.41 9200);3. 增加 ES 连接超时配置(elasticsearch { hosts => ["xxx"]; timeout => 30 })。

  3. 日志采集重复

    解决:1. 禁用 sincedb(sincedb_path => "/dev/null")仅用于测试,生产环境需保留默认;2. 确保日志文件不会被重复写入(如避免日志轮转后文件名重复)。

5.3 Kibana 问题

  1. Kibana 页面提示 "Elasticsearch is down"

    解决:1. 检查elasticsearch.url配置是否正确;2. 检查 ES 是否正常运行(curl http://192.168.100.41:9200);3. 检查 Kibana 日志(/var/log/kibana/kibana.log)。

  2. Discover 页面无日志数据

    解决:1. 确认索引模式的 "默认时间字段" 正确(如@timestamp);2. 调整时间范围(如选择 "Last 24h");3. 检查 ES 索引是否有数据(通过 Head 插件)。

  3. Kibana 页面加载慢

    解决:1. 启用 Kibana 缓存(server.cache.enabled: true);2. 优化 ES 查询(如减少返回字段、增加索引分片)。

六、附录:常用命令汇总(补充便捷参考)

6.1 Elasticsearch 命令

功能 命令
查看集群节点 curl http://192.168.100.41:9200/_cat/nodes?v
查看集群健康 curl http://192.168.100.41:9200/_cluster/health?pretty
查看索引列表 curl http://192.168.100.41:9200/_cat/indices?v
删除索引 curl -XDELETE http://192.168.100.41:9200/index-name
查看文档 curl http://192.168.100.41:9200/index-name/type-name/doc-id?pretty

6.2 Logstash 命令

功能 命令
校验配置文件 logstash -f /etc/logstash/conf.d/xxx.conf -t
前台启动(查看日志) logstash -f /etc/logstash/conf.d/xxx.conf
后台启动 nohup logstash -f /etc/logstash/conf.d/xxx.conf &
查看 Logstash 日志 tail -f /var/log/logstash/logstash-plain.log

6.3 Kibana 命令

功能 命令
查看 Kibana 状态 systemctl status kibana.service
重启 Kibana systemctl restart kibana.service
查看 Kibana 日志 tail -f /var/log/kibana/kibana.log
安装插件 /usr/share/kibana/bin/kibana-plugin install 插件名

七、总结

本文基于原文档的核心部署步骤,补充了生产环境必备的系统配置、性能优化、问题排查、高级功能(如 Beats 集成、权限控制),确保从 "部署成功" 到 "稳定运行" 的全流程覆盖。ELK 的核心价值在于 "日志集中化、结构化、可视化",实际应用中需根据业务规模(服务器数量、日志量)调整架构(如小规模用 "ELK",大规模用 "Filebeat+Kafka+ELK"),并定期维护(索引清理、性能监控),最终实现运维效率的提升与故障的快速定位。

如需进一步深入,可参考官方文档:

相关推荐
玥轩_5214 小时前
Git命令速查手册
大数据·git·elasticsearch·gitee·github·命令速查
Ribou5 小时前
Elasticsearch 9.2.0 三节点集群配置
大数据·elasticsearch·搜索引擎
Saintsafa5 小时前
centos安装ES
elasticsearch·centos
ShareBeHappy_Qin5 小时前
Elastic Stack 或 ELK —— 日志管理与数据分析方案
elk
一叶飘零_sweeeet7 小时前
Linux 安装 Elasticsearch:避坑指南 + 性能调优实战
linux·运维·elasticsearch
勇往直前plus9 小时前
centos7利docker compose 快速部署 Elasticsearch + Kibana
elasticsearch·docker·jenkins
Elastic 中国社区官方博客20 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
liliangcsdn1 天前
如何使用elasticdump进行elasticsearch数据还原
大数据·elasticsearch·搜索引擎
lijun_xiao20091 天前
elasticsearch学习笔记-02
笔记·学习·elasticsearch