ELK Stack 全面学习指南:从入门到实战

一、基础知识

(一)ELK Stack 的组成

ELK Stack 是一个强大的开源日志管理和分析解决方案,由三个核心组件组成:Elasticsearch、Logstash 和 Kibana。每个组件都承担着不同的功能,共同构成了一个完整的数据处理和分析平台。

  1. Elasticsearch
  • 定义:Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,能够快速存储、搜索和分析大量数据。它使用倒排索引技术,支持复杂的搜索查询和实时数据分析。
  • 特点
    • 分布式架构:支持跨多个节点的分布式存储和计算,能够水平扩展。
    • 高可用性:通过副本机制确保数据的高可用性,即使部分节点故障,数据也不会丢失。
    • 扩展性:可以通过增加节点轻松扩展集群,适应大规模数据处理需求。
    • 强大的查询能力:支持复杂的查询语言(如查询 DSL),能够进行全文搜索、范围查询、聚合分析等。
  • 应用场景
    • 日志分析:存储和分析服务器日志、应用程序日志等。
    • 全文搜索:为网站或应用程序提供快速的搜索功能。
    • 实时数据分析:实时监控和分析业务数据,支持实时告警和决策支持。
  1. Logstash
  • 定义:Logstash 是一个数据处理管道,用于收集、解析和转换日志数据。它支持多种输入源和输出目标,能够灵活地处理不同类型的数据。
  • 特点
    • 丰富的插件:提供多种输入、过滤和输出插件,支持从文件、数据库、网络等来源收集数据。
    • 数据转换:通过过滤插件(如 Grok)对数据进行解析和转换,能够将非结构化数据转换为结构化数据。
    • 灵活配置:通过配置文件(logstash.conf)定义数据处理流程,支持复杂的处理逻辑。
  • 应用场景
    • 日志收集:从各种数据源收集日志数据。
    • 数据清洗:对日志数据进行解析和转换,提取有用信息。
    • 数据传输:将处理后的数据发送到 Elasticsearch 或其他存储系统。
  1. Kibana
  • 定义:Kibana 是一个基于 Web 的可视化工具,用于创建图表、仪表板和数据探索。它与 Elasticsearch 集成,能够快速生成可视化报告。
  • 特点
    • 交互式界面:提供用户友好的 Web 界面,支持拖拽式操作,用户无需编写代码即可创建可视化图表。
    • 多种可视化类型:支持柱状图、折线图、饼图、地图等多种可视化类型,满足不同的数据展示需求。
    • 实时数据探索:通过 Discover 功能实时探索数据,支持复杂的查询和过滤。
  • 应用场景
    • 数据可视化:将 Elasticsearch 中的数据以直观的图表形式展示出来。
    • 仪表板创建:创建包含多个图表的仪表板,用于监控和报告。
    • 实时监控:实时监控系统性能、安全事件等,支持告警功能。

(二)ELK 的应用场景

  1. 日志分析
  • 需求:企业需要集中管理和分析各种系统日志(如服务器日志、应用程序日志等),以便快速定位问题和优化系统性能。

  • 解决方案

    • 使用 Logstash 收集日志。
    • 将日志存储到 Elasticsearch。
    • 在 Kibana 中创建可视化图表和仪表板。
  • 示例:通过 Logstash 收集 Apache 服务器日志,并在 Kibana 中生成访问量统计图表。

    • Logstash 配置

      input {
        file {
          path => "/var/log/apache2/access.log"
          start_position => "beginning"
        }
      }
      
      filter {
        grok {
          match => { "message" => "%{COMBINEDAPACHELOG}" }
        }
      }
      
      output {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "apache-logs-%{+YYYY.MM.dd}"
        }
      }
      
    • Kibana 可视化

      • 在 Kibana 的 Visualize 页面中,选择柱状图类型。
      • 选择数据源(如 apache-logs-* 索引)。
      • 配置 X 轴为时间字段,Y 轴为日志数量。
  1. 安全监控
  • 需求:企业需要实时监控系统和网络的安全状态,及时发现异常行为和安全威胁。

  • 解决方案

    • 使用 Logstash 收集安全相关的日志(如防火墙日志、入侵检测系统日志等)。
    • 将数据存储到 Elasticsearch。
    • 在 Kibana 中设置告警规则,实时监控安全事件。
  • 示例:通过 Logstash 收集防火墙日志,并在 Kibana 中设置告警规则,当检测到异常流量时发送通知。

    • Logstash 配置

      input {
        file {
          path => "/var/log/firewall.log"
          start_position => "beginning"
        }
      }
      
      filter {
        grok {
          match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:log_message}" }
        }
      }
      
      output {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "firewall-logs-%{+YYYY.MM.dd}"
        }
      }
      
    • Kibana 告警

      • 在 Kibana 的 Alerting 页面中,创建告警规则。
      • 配置触发条件(如日志中包含特定的错误信息)。
      • 设置通知方式(如邮件、Slack 等)。
  1. 性能监控
  • 需求:企业需要监控应用程序和基础设施的性能指标(如 CPU 使用率、内存使用率、响应时间等),以便优化系统性能。
  • 解决方案
    • 使用 Beats 收集性能指标。
    • 将数据发送到 Elasticsearch。
    • 在 Kibana 中创建性能监控仪表板。
  • 示例:通过 Metricbeat 收集服务器性能指标,并在 Kibana 中生成性能监控仪表板。
    • Metricbeat 配置

      output.elasticsearch:
        hosts: ["localhost:9200"]
      
    • Kibana 仪表板

      • 在 Kibana 的 Visualize 页面中,选择折线图类型。
      • 选择数据源(如 metricbeat-* 索引)。
      • 配置 X 轴为时间字段,Y 轴为 CPU 使用率。
      • 创建多个可视化图表,分别展示 CPU 使用率、内存使用率、磁盘 I/O 等指标。
      • 在 Dashboard 页面中,创建新的仪表板,添加所有可视化图表。

二、安装与部署

(一)环境准备

  1. 安装 Java 环境
  • Elasticsearch 需要 Java 运行时环境(JRE)。建议安装 OpenJDK 11 或更高版本。

  • 安装命令(以 Ubuntu 为例):

    sudo apt update
    sudo apt install openjdk-11-jdk
    
  • 验证安装

    java -version
    

    输出示例:

    openjdk version "11.0.16" 2022-07-19
    OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu120.04)
    OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu120.04, mixed mode)
    
  1. 选择操作系统
  • ELK Stack 支持多种操作系统,包括 Linux、macOS 和 Windows。推荐使用 Linux 系统,因为它更稳定且资源占用较低。常用的 Linux 发行版包括 Ubuntu、CentOS 和 Debian。

(二)安装 Elasticsearch

  1. 下载与解压
  • 访问 Elasticsearch 官方网站,下载最新版本的 Elasticsearch。

  • 下载命令(以 Linux 为例):

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.0.0-amd64.deb
    sudo dpkg -i elasticsearch-8.0.0-amd64.deb
    
  • 解压命令(如果下载的是 tar.gz 文件):

    tar -xzf elasticsearch-8.0.0-amd64.tar.gz
    cd elasticsearch-8.0.0
    
  1. 配置 Elasticsearch
  • 修改配置文件 elasticsearch.yml,设置集群名称、节点名称和网络访问。

  • 配置示例

    cluster.name: my-cluster
    node.name: node-1
    network.host: 0.0.0.0
    
  • 启动 Elasticsearch

    sudo systemctl enable elasticsearch
    sudo systemctl start elasticsearch
    
  • 验证是否成功

    curl -X GET "localhost:9200/"
    

    如果返回类似以下内容,则表示安装成功:

    {
      "name": "node-1",
      "cluster_name": "my-cluster",
      "cluster_uuid": "abc123",
      "version": {
        "number": "8.0.0",
        "build_flavor": "default",
        "build_type": "tar",
        "build_hash": "abc123",
        "build_date": "2023-01-01T00:00:00.000Z",
        "build_snapshot": false,
        "lucene_version": "9.0.0",
        "minimum_wire_compatibility_version": "7.1.0",
        "minimum_index_compatibility_version": "7.0.0"
      },
      "tagline": "You Know, for Search"
    }
    

(三)安装 Logstash

  1. 下载与解压
  • 访问 Logstash 官方网站,下载最新版本的 Logstash。

  • 下载命令(以 Linux 为例):

    wget https://artifacts.elastic.co/downloads/logstash/logstash-8.0.0-amd64.deb
    sudo dpkg -i logstash-8.0.0-amd64.deb
    
  • 解压命令(如果下载的是 tar.gz 文件):

    tar -xzf logstash-8.0.0-amd64.tar.gz
    cd logstash-8.0.0
    
  1. 配置 Logstash
  • 编写 logstash.conf 文件,定义输入、过滤和输出插件。

  • 配置示例

    input {
      file {
        path => "/var/log/apache2/access.log"
        start_position => "beginning"
      }
    }
    
    filter {
      grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
      }
    }
    
    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "apache-logs-%{+YYYY.MM.dd}"
      }
    }
    
  • 启动 Logstash

    sudo systemctl enable logstash
    sudo systemctl start logstash
    

(四)安装 Kibana

  1. 下载与解压
  • 访问 Kibana 官方网站,下载最新版本的 Kibana。

  • 下载命令(以 Linux 为例):

    wget https://artifacts.elastic.co/downloads/kibana/kibana-8.0.0-amd64.deb
    sudo dpkg -i kibana-8.0.0-amd64.deb
    
  • 解压命令(如果下载的是 tar.gz 文件):

    tar -xzf kibana-8.0.0-amd64.tar.gz
    cd kibana-8.0.0
    
  1. 配置 Kibana
  • 修改配置文件 kibana.yml,设置 Elasticsearch 的连接地址。

  • 配置示例

    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://localhost:9200"]
    
  • 启动 Kibana

    sudo systemctl enable kibana
    sudo systemctl start kibana
    
  • 访问 Kibana
    打开浏览器,访问 http://localhost:5601,即可进入 Kibana 的 Web 界面。

三、Elasticsearch 深入学习

(一)数据模型

  1. 索引
  • 定义:索引是 Elasticsearch 中存储数据的逻辑容器,类似于关系数据库中的数据库。每个索引可以包含多个文档。

  • 创建索引

    curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
    {
      "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0
      }
    }
    '
    
  • 查询索引

    curl -X GET "localhost:9200/my_index"
    
  1. 类型
  • 定义:类型是索引中的一个分类,类似于关系数据库中的表。从 7.x 版本开始,Elasticsearch 已经不再支持多类型索引,每个索引只能有一个默认的 _doc 类型。

  • 示例

    curl -X PUT "localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
    {
      "name": "John Doe",
      "age": 30
    }
    '
    
  1. 文档
  • 定义:文档是 Elasticsearch 中存储的数据单元,类似于关系数据库中的行。文档以 JSON 格式存储。

  • 添加文档

    curl -X POST "localhost:9200/my_index/_doc" -H 'Content-Type: application/json' -d'
    {
      "name": "Jane Doe",
      "age": 25
    }
    '
    
  • 查询文档

    curl -X GET "localhost:9200/my_index/_doc/1"
    

(二)查询语言

  1. 查询 DSL
  • 定义:Elasticsearch 查询 DSL(Domain Specific Language)是一种基于 JSON 的查询语言,用于构建复杂的查询。
  • 基本查询
    • 匹配查询

      curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
      {
        "query": {
          "match": {
            "name": "John"
          }
        }
      }
      '
      
    • 范围查询

      curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
      {
        "query": {
          "range": {
            "age": {
              "gte": 25
            }
          }
        }
      }
      '
      
  1. 聚合
  • 定义:聚合用于对数据进行分组和统计分析。
  • 示例
    • 求和聚合

      curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
      {
        "size": 0,
        "aggs": {
          "total_age": {
            "sum": {
              "field": "age"
            }
          }
        }
      }
      '
      
    • 分组聚合

      curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
      {
        "size": 0,
        "aggs": {
          "age_groups": {
            "terms": {
              "field": "age"
            }
          }
        }
      }
      '
      

(三)性能优化

  1. JVM 参数调整
  • 定义:Elasticsearch 使用 Java 虚拟机(JVM)运行,调整 JVM 参数可以优化性能。

  • 配置文件jvm.options 文件。

  • 示例

    -Xms4g
    -Xmx4g
    

    将堆内存大小设置为 4GB。

  1. 索引分片和副本
  • 分片:将索引分成多个分片,可以提高查询性能。

  • 副本:为分片创建副本,可以提高数据的可用性和容错能力。

  • 示例

    curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
    {
      "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
      }
    }
    '
    
  1. 集群管理
  • 添加节点
    • 修改 elasticsearch.yml 文件,设置集群名称和节点名称。
    • 启动新节点,它将自动加入集群。
  • 移除节点
    • 停止节点服务。
    • 从集群中移除该节点。

四、Logstash 深入学习

(一)输入插件

  1. 文件输入
  • 定义:从文件中读取数据。

  • 配置示例

    input {
      file {
        path => "/var/log/apache2/access.log"
        start_position => "beginning"
      }
    }
    
  1. TCP 输入
  • 定义:从 TCP 网络连接中读取数据。

  • 配置示例

    input {
      tcp {
        port => 5000
      }
    }
    
  1. 数据库输入
  • 定义:从数据库中读取数据。

  • 配置示例

    input {
      jdbc {
        jdbc_connection_string => "jdbc:mysql://localhost:3306/my_database"
        jdbc_user => "user"
        jdbc_password => "password"
        statement => "SELECT * FROM my_table"
      }
    }
    

(二)过滤插件

  1. Grok 过滤
  • 定义:使用 Grok 表达式解析日志数据。

  • 配置示例

    filter {
      grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
      }
    }
    
  1. Mutate 过滤
  • 定义:对字段进行修改、重命名、删除等操作。

  • 配置示例

    filter {
      mutate {
        rename => { "old_field" => "new_field" }
        remove_field => [ "unwanted_field" ]
      }
    }
    
  1. GeoIP 过滤
  • 定义:根据 IP 地址获取地理位置信息。

  • 配置示例

    filter {
      geoip {
        source => "client_ip"
      }
    }
    

(三)输出插件

  1. Elasticsearch 输出
  • 定义:将数据输出到 Elasticsearch。

  • 配置示例

    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "my_index-%{+YYYY.MM.dd}"
      }
    }
    
  1. 文件输出
  • 定义:将数据写入文件。

  • 配置示例

    output {
      file {
        path => "/var/log/output.log"
      }
    }
    
  1. TCP 输出
  • 定义:将数据发送到 TCP 网络连接。

  • 配置示例

    output {
      tcp {
        host => "localhost"
        port => 5000
      }
    }
    

五、Kibana 深入学习

(一)数据可视化

  1. 创建可视化图表
  • 柱状图
    • 在 Kibana 的 Visualize 页面中,选择柱状图类型。
    • 选择数据源(如 Elasticsearch 索引)。
    • 配置 X 轴和 Y 轴字段。
  • 折线图
    • 在 Kibana 的 Visualize 页面中,选择折线图类型。
    • 选择数据源。
    • 配置时间轴和数据字段。
  • 饼图
    • 在 Kibana 的 Visualize 页面中,选择饼图类型。
    • 选择数据源。
    • 配置分组字段。
  1. 使用 Discover 功能
  • 定义:Discover 功能允许用户实时探索数据。
  • 操作
    • 在 Kibana 的 Discover 页面中,选择数据源。
    • 使用搜索框输入查询条件。
    • 查看和筛选数据。

(二)仪表板

  1. 创建仪表板
  • 在 Kibana 的 Dashboard 页面中,点击 “Create new dashboard”。
  • 添加已创建的可视化图表。
  • 调整图表布局和大小。
  1. 管理仪表板
  • 保存仪表板
    • 在仪表板页面中,点击 “Save” 按钮。
    • 输入仪表板名称并保存。
  • 分享仪表板
    • 在仪表板页面中,点击 “Share” 按钮。
    • 选择分享方式(如生成链接或嵌入代码)。

(三)高级功能

  1. 机器学习
  • 定义:Kibana 提供机器学习功能,用于检测数据中的异常和趋势。
  • 操作
    • 在 Kibana 的 Machine Learning 页面中,创建机器学习作业。
    • 配置数据源和分析类型。
    • 查看分析结果。
  1. 告警功能
  • 定义:Kibana 的告警功能允许用户设置告警规则,当满足条件时发送通知。
  • 操作
    • 在 Kibana 的 Alerting 页面中,创建告警规则。
    • 配置触发条件(如数据阈值)。
    • 设置通知方式(如邮件、Slack 等)。

六、实战项目

(一)构建日志分析系统

  1. 需求分析
  • 企业需要集中管理和分析服务器日志,以便快速定位问题和优化系统性能。
  • 需要支持多种日志格式(如 Apache 日志、Nginx 日志、系统日志等)。
  1. 系统架构
  • Logstash:负责从服务器收集日志。
  • Elasticsearch:存储和索引日志数据。
  • Kibana:提供可视化界面,展示日志分析结果。
  1. 实施步骤
  • 配置 Logstash

    • 编写 logstash.conf 文件,定义输入、过滤和输出插件。

    • 示例配置:

      input {
        file {
          path => "/var/log/apache2/access.log"
          start_position => "beginning"
        }
      }
      
      filter {
        grok {
          match => { "message" => "%{COMBINEDAPACHELOG}" }
        }
      }
      
      output {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "apache-logs-%{+YYYY.MM.dd}"
        }
      }
      
  • 启动 Logstash

    sudo systemctl start logstash
    
  • 验证数据是否正确写入 Elasticsearch

    curl -X GET "localhost:9200/apache-logs-*/_search"
    
  • 在 Kibana 中创建可视化图表

    • 进入 Kibana 的 Visualize 页面,选择柱状图类型。
    • 选择数据源(如 apache-logs-* 索引)。
    • 配置 X 轴为时间字段,Y 轴为日志数量。
  • 创建仪表板

    • 在 Kibana 的 Dashboard 页面中,创建新的仪表板。
    • 添加已创建的可视化图表,调整布局。

(二)性能监控系统

  1. 需求分析
  • 企业需要监控服务器的性能指标(如 CPU 使用率、内存使用率、磁盘 I/O 等),以便及时发现性能瓶颈。
  • 需要支持多种服务器(如 Linux、Windows 等)。
  1. 系统架构
  • Beats:负责从服务器收集性能指标。
  • Elasticsearch:存储和索引性能数据。
  • Kibana:提供可视化界面,展示性能监控结果。
  1. 实施步骤
  • 安装 Metricbeat

    • 在 Linux 服务器上安装 Metricbeat:

      curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-8.0.0-amd64.deb
      sudo dpkg -i metricbeat-8.0.0-amd64.deb
      
    • 配置 Metricbeat:

      sudo cp /usr/share/metricbeat/metricbeat.yml /etc/metricbeat/metricbeat.yml
      sudo nano /etc/metricbeat/metricbeat.yml
      

      修改配置文件,设置 Elasticsearch 的连接地址:

      output.elasticsearch:
        hosts: ["localhost:9200"]
      
    • 启动 Metricbeat:

      sudo systemctl enable metricbeat
      sudo systemctl start metricbeat
      
  • 验证数据是否正确写入 Elasticsearch

    curl -X GET "localhost:9200/metricbeat-*/_search"
    
  • 在 Kibana 中创建性能监控仪表板

    • 进入 Kibana 的 Visualize 页面,选择折线图类型。
    • 选择数据源(如 metricbeat-* 索引)。
    • 配置 X 轴为时间字段,Y 轴为 CPU 使用率。
    • 创建多个可视化图表,分别展示 CPU 使用率、内存使用率、磁盘 I/O 等指标。
    • 在 Dashboard 页面中,创建新的仪表板,添加所有可视化图表。

(三)安全监控系统

  1. 需求分析
  • 企业需要实时监控网络和系统的安全事件,及时发现异常行为和安全威胁。
  • 需要支持多种安全日志(如防火墙日志、入侵检测系统日志等)。
  1. 系统架构
  • Logstash:负责从安全设备收集日志。
  • Elasticsearch:存储和索引安全日志。
  • Kibana:提供可视化界面,展示安全监控结果。
  1. 实施步骤
  • 配置 Logstash

    • 编写 logstash.conf 文件,定义输入、过滤和输出插件。

    • 示例配置:

      input {
        file {
          path => "/var/log/firewall.log"
          start_position => "beginning"
        }
      }
      
      filter {
        grok {
          match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:log_message}" }
        }
      }
      
      output {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "firewall-logs-%{+YYYY.MM.dd}"
        }
      }
      
  • 启动 Logstash

    sudo systemctl start logstash
    
  • 验证数据是否正确写入 Elasticsearch

    curl -X GET "localhost:9200/firewall-logs-*/_search"
    
  • 在 Kibana 中创建安全监控仪表板

    • 进入 Kibana 的 Visualize 页面,选择柱状图类型。
    • 选择数据源(如 firewall-logs-* 索引)。
    • 配置 X 轴为时间字段,Y 轴为安全事件数量。
    • 创建多个可视化图表,分别展示不同类型的
posted @   软件职业规划  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 想让你多爱自己一些的开源计时器
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 大模型 Token 究竟是啥:图解大模型Token
· 如何在 .NET 中 使用 ANTLR4
· 用99元买的服务器搭一套CI/CD系统
点击右上角即可分享
微信分享提示