ELK技术栈全面解析与部署方案

ELK技术栈全面解析与部署方案

一、ELK技术原理深度剖析
1. Elasticsearch核心技术原理
  • 分布式搜索引擎架构

    基于Lucene构建,采用分布式架构实现水平扩展,通过分片(Shards)和复制(Replicas)机制实现高可用性和性能优化。每个索引默认分为5个主分片和1个复制分片,分片可分布在不同节点,支持并行搜索和数据冗余。

  • 核心概念解析

    • 集群(Cluster) :由一个或多个节点组成,共享数据和搜索功能,通过唯一名称标识(如my-application)。
    • 节点(Node):集群中的服务器,存储数据并参与索引和搜索,可通过配置加入指定集群。
    • 索引(Index):文档的逻辑集合,类似数据库中的"库",以小写字母命名。
    • 文档(Document):存储的基本单元,以JSON格式表示,包含字段和值。
    • 分片与复制:分片实现数据水平分割,复制提供故障转移和查询负载均衡,主分片和复制分片不能位于同一节点。
  • 近实时搜索(NRT)

    文档索引后约1秒即可被搜索到,通过分段(Segment)机制实现增量索引,避免全量重建索引。

2. Logstash数据处理流程
  • 三阶段处理模型

    • Input阶段 :支持多种数据源(文件、syslog、Redis等),如file插件读取本地日志,beats插件接收Filebeat数据。
    • Filter阶段 :通过插件(如grokmutate)处理数据,包括格式解析、字段转换、数据过滤等。例如grok用正则表达式解析非结构化日志。
    • Output阶段:将处理后的数据输出到目标系统(Elasticsearch、文件、MongoDB等),支持批量写入提升性能。
  • 插件机制

    内置丰富插件,可自定义扩展。例如geoip插件为IP地址添加地理位置信息,drop插件丢弃指定事件。

3. Kibana可视化与交互原理
  • 数据可视化引擎

    基于Elasticsearch查询结果生成图表、仪表盘和地图,支持实时数据刷新和交互式筛选。通过Kibana Query Language(KQL)实现精准数据过滤,如@timestamp > "2023-10-24T11:53:34"

  • 无缝集成Elasticsearch

    通过HTTP接口连接ES集群,支持多数据源聚合分析,可导出数据或创建告警规则。

二、ELK日志处理全流程
  1. 日志收集:Filebeat/Logstash采集服务器日志(如Web服务、系统日志)。
  2. 数据过滤:Logstash解析日志格式(如JSON、文本),清洗无效数据,添加元数据(时间、主机名)。
  3. 索引存储:过滤后的数据写入Elasticsearch,按索引和类型组织,支持分布式存储和检索。
  4. 可视化分析:Kibana从ES获取数据,通过图表、仪表盘展示趋势、异常和统计结果。
三、ELK集群部署方案
1. 环境准备
  • 实验拓扑

    主机名 IP地址 角色 软件组件
    web01 192.168.10.101 日志产生服务器 httpd、Filebeat
    logstash 192.168.10.102 日志收集与过滤服务器 Logstash、Java 11
    elk1 192.168.10.103 ES主节点、Kibana服务器 Elasticsearch、Kibana、Elasticsearch-head插件
    elk2 192.168.10.104 ES从节点 Elasticsearch、Java 11
  • 系统配置

    1. 关闭防火墙与SELinux

      bash 复制代码
      systemctl stop firewalld && systemctl disable firewalld
      setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    2. 设置主机名与hosts
      在elk1和elk2上配置hosts文件,添加:

      bash 复制代码
      192.168.10.103 elk1
      192.168.10.104 elk2
2. Elasticsearch集群部署
  • 创建运行用户

    bash 复制代码
    useradd es && passwd es
    gpasswd -a es wheel
  • 配置系统资源限制

    修改/etc/security/limits.conf,添加:

    复制代码
    es soft nofile 65535
    es hard nofile 65535
    es soft nproc 65535
    es hard nproc 65535
    es soft memlock unlimited
    es hard memlock unlimited

    修改/etc/sysctl.conf,添加:

    复制代码
    vm.max_map_count=655360

    执行sysctl -p生效。

  • 安装与配置Elasticsearch

    1. 解压与移动文件

      bash 复制代码
      tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
      mv elasticsearch-7.10.0 /etc/elasticsearch
    2. 配置JVM内存
      修改/etc/elasticsearch/config/jvm.options

      复制代码
      -Xms2g
      -Xmx2g
    3. 主配置文件解析
      elasticsearch.yml关键配置:

      yaml 复制代码
      cluster.name: my-application      # 集群名称,需与其他节点一致
      node.name: elk1                   # 节点名称
      path.data: /path/to/data          # 数据存储路径
      path.logs: /path/to/logs          # 日志存储路径
      bootstrap.memory_lock: false      # 禁用内存锁定,避免swap影响性能
      network.host: 0.0.0.0             # 监听所有网络接口
      http.port: 9200                   # HTTP服务端口
      discovery.seed_hosts: ["elk1", "elk2"]  # 集群节点发现列表
      cluster.initial_master_nodes: ["elk1"]  # 初始主节点列表
      http.cors.enabled: true            # 启用跨域访问
      http.cors.allow-origin: "*"        # 允许所有域名访问
  • 启动集群

    bash 复制代码
    /etc/elasticsearch/bin/elasticsearch &

    验证:访问http://192.168.10.103:9200/_cat/nodes,查看节点状态,带*的为master节点。

3. Logstash部署与配置
  • 安装与初始化

    bash 复制代码
    yum -y install java-11
    tar zxvf logstash-7.10.0-linux-x86_64.tar.gz
    mv logstash-7.10.0 /etc/logstash
    chmod -R 777 /etc/logstash/data/
  • 配置示例1:采集系统日志
    system.conf文件:

    ruby 复制代码
    input {
      file {
        path => "/var/log/messages"       # 日志文件路径
        type => "system"                  # 日志类型标识
        start_position => "beginning"     # 从文件开头读取
      }
    }
    output {
      elasticsearch {
        hosts => ["192.168.10.103:9200"]  # ES集群地址
        index => "system-%{+YYYY.MM.dd}" # 索引名称,按日期动态生成
      }
    }

    启动:/etc/logstash/bin/logstash -f /etc/logstash/config/system.conf &

  • 配置示例2:采集Web日志(通过Filebeat)
    beats.conf文件:

    ruby 复制代码
    input {
      beats {
        port => "5044"                   # 监听Filebeat的端口
        codec => "json"                  # 解析JSON格式数据
      }
    }
    output {
      elasticsearch {
        hosts => ["192.168.10.103:9200"]
        index => "weblog-beat-%{+YYYY.MM.dd}"
      }
    }

    启动:/etc/logstash/bin/logstash -f /etc/logstash/config/beats.conf &

4. Kibana部署与配置
  • 安装与配置

    bash 复制代码
    tar zxvf kibana-7.10.0-linux-x86_64.tar.gz
    mv kibana-7.10.0-linux-x86_64 /etc/kibana
    chown -R es:es /etc/kibana/
  • 主配置文件解析
    kibana.yml关键配置:

    yaml 复制代码
    server.port: 5601                # Kibana服务端口
    server.host: "0.0.0.0"           # 监听所有网络接口
    elasticsearch.hosts: ["http://192.168.10.103:9200"]  # ES集群地址
    i18n.locale: "zh-CN"             # 界面语言设置为中文
  • 启动与验证

    bash 复制代码
    /etc/kibana/bin/kibana &

    访问http://192.168.10.103:5601,创建索引模式(如system-*)后,在Discover页面查看日志数据。



5. Filebeat客户端部署(web01主机)
  • 安装与配置

    bash 复制代码
    tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz
    mv filebeat-7.10.0-linux-x86_64 /etc/filebeat
  • 配置文件解析
    filebeat.yml关键配置:

    yaml 复制代码
    filebeat.inputs:
    - type: log
      paths:
        - /var/log/httpd/access_log    # 采集HTTP访问日志
    output.logstash:
      hosts: ["192.168.10.102:5044"]  # Logstash服务器地址和端口
  • 启动服务

    bash 复制代码
    /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
四、关键配置文件深度解读
1. Elasticsearch配置核心参数
  • 集群与节点配置

    • cluster.name:集群唯一标识,同一集群节点需配置相同值。
    • node.name:节点唯一标识,用于区分集群内不同节点。
    • discovery.seed_hosts:集群节点发现列表,用于新节点加入时查找主节点。
    • cluster.initial_master_nodes:初始化主节点列表,决定集群启动时的主节点选举。
  • 网络与性能配置

    • network.host:监听地址,0.0.0.0允许所有远程访问。
    • http.port:HTTP服务端口,默认9200。
    • bootstrap.memory_lock:是否锁定内存,设为false避免swap影响性能。
    • path.data/path.logs:数据和日志存储路径,建议使用独立磁盘分区。
2. Logstash配置文件结构
  • Input模块

    • file插件:通过path指定日志文件路径,start_position控制读取位置(beginning从头开始,end从尾部开始)。
    • beats插件:监听Filebeat发送的日志,port指定端口(默认5044),codec指定数据格式。
  • Output模块

    • elasticsearch插件:hosts指定ES地址,index定义索引名称,可使用变量(如%{+YYYY.MM.dd})动态生成。
3. Kibana配置关键参数
  • elasticsearch.hosts:ES集群地址,支持多节点逗号分隔。
  • server.port/server.host:Kibana服务端口和监听地址,需确保网络可达。
  • i18n.locale:界面语言,zh-CN设置为中文。
五、生产环境优化建议
  1. Elasticsearch优化

    • 调整JVM内存:建议设置为物理内存的50%且不超过32GB,避免超出Lucene内存寻址限制。
    • 分片规划:根据数据量设置分片数,单分片建议不超过50GB,复制数根据集群节点数调整(如3节点集群设为1复制)。
    • 定期清理旧索引:通过索引生命周期管理(ILM)自动删除过期数据。
  2. Logstash性能调优

    • 批量处理:调整output.elasticsearch.batch_size(默认100)和flush_interval(默认1秒),平衡性能与延迟。
    • 缓存配置:使用--path.data指定独立数据目录,避免与系统盘竞争IO。
  3. 高可用部署

    • ES集群至少3个节点,避免脑裂问题(奇数节点)。
    • Logstash可部署多实例,通过负载均衡接收日志。
    • Kibana可部署多个实例,共享ES集群数据。

通过以上部署方案和原理解析,ELK技术栈可实现高效的日志收集、存储与分析,帮助企业快速定位系统问题、监控服务状态并挖掘数据价值。

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式