搭建日志系统ELK(二)

搭建日志系统ELK(二)

架构设计

在搭建以ELK为核心的日志系统时,Logstash作为日志采集的核心组件,负责将各个服务的日志数据采集、清洗、过滤。然而缺点也很明显:

  • 占用较多的服务器资源。
  • 配置复杂,学习曲线陡峭。
  • 处理大数据量时性能下降。

在我们设计架构时,尽量会选择减少主机使用资源,轻量,高性能,又能满足日志采集的需求。有没有这么一个开源服务呢?答案便是go-stash

特性/服务 logstash go-stash
定义 ElasticStack 的一部分,用于日志收集和处理。 高效的数据处理和存储工具,Go 语言实现。
性能 灵活性高,但可能在处理大数据量时性能下降。 高吞吐量,性能是 logstash 的5倍左右
资源消耗 占用较多的服务器资源。 节省了2/3的服务器资源。
易用性 配置复杂,学习曲线陡峭。 易用性高,配置更简洁直观。
过滤器系统 强大的过滤器系统,支持多种数据处理方式。 内置一套丰富的过滤器,允许自定义处理逻辑。

架构图

各服务功能

  • filebeatFilebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到kafka进行索引。
  • Kafka : Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
  • go-stash : go-stash是一个高效的从Kafka获取,根据配置的规则进行处理,然后发送到ElasticSearch集群的工具。
  • Elasticsearch :一个基于Lucene的搜索引擎,提供快速的全文搜索能力,适合处理大规模数据集,并且具备高可扩展性。
  • Kibana :一个开源的数据分析和可视化平台,能够让用户通过图表、地图等各种方式直观地理解Elasticsearch中的数据。

流程概述

日志数据的流动遵循从产生到消费的流程。

  1. 使用docker部署的服务容器,服务产生的日志以json格式会存储在 /var/lib/docker/containers/**/*-json.log
  2. 部署filebeat服务,采集容器日志并将它们转发到kafka进行索引
  3. go-stash是一个高效的从Kafka获取,根据配置的规则进行处理,然后发送到ElasticSearch集群中进行索引和存储。
  4. Kibana作为前端界面,从Elasticsearch检索数据,并提供数据可视化。

部署

文件目录

log-collect

bash 复制代码
|-- deploy
|   |-- filebeat
|   |   -- conf
|   |       -- filebeat.yml
|   -- go-stash
|       -- etc
|           -- config.yaml
|-- docker-compose.yaml

配置文件

filebeat.yml

yaml 复制代码
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/lib/docker/containers/*/*-json.log

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

processors:
  - add_cloud_metadata: ~
  - add_docker_metadata: ~

output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  #要提前创建topic
  topic: "openui-log"
  partition.hash:
    reachable_only: true
  compression: gzip
  max_message_bytes: 1000000
  required_acks: 1

go-stash.yml

yaml 复制代码
Clusters:
  - Input:
      Kafka:
        Name: gostash
        Brokers:
          - "kafka:9092"
        Topics:
          - openui-log
        Group: pro
        Consumers: 16
    Filters:
      - Action: drop
        Conditions:
          - Key: k8s_container_name
            Value: "-rpc"
            Type: contains
          - Key: level
            Value: info
            Type: match
            Op: and
      - Action: remove_field
        Fields:
          # - message
          - _source
          - _type
          - _score
          - _id
          - "@version"
          - topic
          - index
          - beat
          - docker_container
          - offset
          - prospector
          - source
          - stream
          - "@metadata"
      - Action: transfer
        Field: message
        Target: data
    Output:
      ElasticSearch:
        Hosts:
          - "http://elasticsearch:9200"
        Index: "openui-{{yyyy-MM-dd}}"
        Username: "elastic"
        Password: "tester"

部署

docker-compose.yaml

yaml 复制代码
version: '3'

services:
  elasticsearch:
    image: elasticsearch:7.13.4
    container_name: elasticsearch
    user: root
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    volumes:
      - ./data/elasticsearch/data:/usr/share/elasticsearch/data
      - ./data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    restart: always
    ports:
    - 9200:9200
    - 9300:9300
    networks:
      - openui_net

  #查看elasticsearch数据 - Kibana to view Elasticsearch data
  kibana:
    image: kibana:7.13.4
    container_name: kibana
    environment:
      - elasticsearch.hosts=http://elasticsearch:9200
      - elasticsearch.username="elastic"
      - elasticsearch.password="tester"
      - TZ=Asia/Shanghai
    restart: always
    networks:
      - openui_net
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

  #elasticsearch UI
  elastichd:
    container_name: elastichd
    image: containerize/elastichd
    restart: always
    networks:
      - openui_net
    ports:
      - "9800:9800"
    depends_on:
      - elasticsearch

  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:latest
    ports:
      - 9090:8080
    environment:
      DYNAMIC_CONFIG_ENABLED: 'true'
      KAFKA_CLUSTERS_0_NAME: kafka-work
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
    depends_on:
      - kafka
    networks:
      - openui_net

  #消费kafka中filebeat收集的数据输出到es - The data output collected by FileBeat in Kafka is output to ES
  go-stash:
    image: eilinge/go-stash # golang:v1.22
    container_name: go-stash
    environment:
      # 时区上海 - Time zone Shanghai (Change if needed)
      TZ: Asia/Shanghai
    user: root
    restart: always
    volumes:
      - ./deploy/go-stash/etc:/app/etc
    networks:
      - openui_net
    depends_on:
      - elasticsearch
      - kafka

  #收集业务数据 - Collect business data
  filebeat:
    image: elastic/filebeat:7.13.4
    container_name: filebeat
    environment:
      # 时区上海 - Time zone Shanghai (Change if needed)
      TZ: Asia/Shanghai
    user: root
    restart: always
    entrypoint: "filebeat -e -strict.perms=false"  #解决配置文件权限问题 - Solving the configuration file permissions
    volumes:
      - ./deploy/filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /var/lib/docker/containers:/var/lib/docker/containers
    networks:
      - openui_net
    depends_on:
      - kafka


  #zookeeper是kafka的依赖 - Zookeeper is the dependencies of Kafka
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    environment:
      # 时区上海 - Time zone Shanghai (Change if needed)
      TZ: Asia/Shanghai
    restart: always
    ports:
      - 2181:2181
    networks:
      - openui_net

  #消息队列 - Message queue
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    ports:
      - 9092:9092
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_AUTO_CREATE_TOPICS_ENABLE=false
      - TZ=Asia/Shanghai
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - openui_net
    depends_on:
      - zookeeper

networks:
  openui_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.0.0/16

环境服务搭建

bash 复制代码
[root@master log-collect]# docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
elastichd           "ElasticHD"              elastichd           running             0.0.0.0:9800->9800/tcp, :::9800->9800/tcp
elasticsearch       "/bin/tini -- /usr/l..."   elasticsearch       running             0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9200->9200/tcp, :::9300->9300/tcp
filebeat            "filebeat -e -strict..."   filebeat            running             
go-stash            "./stash -f etc/conf..."   go-stash            running             
kafka               "start-kafka.sh"         kafka               running             0.0.0.0:9092->9092/tcp, :::9092->9092/tcp
kafka-ui            "/bin/sh -c 'java --..."   kafka-ui            running             0.0.0.0:9090->8080/tcp, :::9090->8080/tcp
kibana              "/bin/tini -- /usr/l..."   kibana              running             0.0.0.0:5601->5601/tcp, :::5601->5601/tcp
zookeeper           "/bin/sh -c '/usr/sb..."   zookeeper           running             0.0.0.0:2181->2181/tcp, :::2181->2181/tcp

检查各服务是否正常运行

elastic-cluster

kafka-cluster

kafka-topic

kibana

劣势分析

通过部署文件,很明显的存在一些劣势:

  • 依赖性过高: 容器之间各自负责不同的功能,学习成本增加。
  • 资源消耗:每个容器可能需要额外的资源,如内存和CPU。
  • 复杂性:容器编排和管理需要一定的学习和运维成本。
  • 网络配置:容器间的网络通信需要合理配置,以确保数据流畅。

ISSUE

在上述部署的过程,也不是一番风顺,有些错误对一个接触相关服务较少的同学而言,就容易退缩。还好出现的常见问题在网上都能找到解决方法,主要还是需要我们保持一颗热爱学习的心

  1. Kibana的Stack Monitoring显示节点offline

  2. ElasticSearch+Kibana设置用户名密码

  3. ES开启密码安全认证后,elastichd的连接方式

  4. go-stash 依赖json-iterator版本较低

    使用我基于golang:v1.22最新构建的 go-stash镜像

  5. elasticSearch 文件权限不足,启动失败

项目地址

Log-Collect

相关推荐
Linux运维老纪10 小时前
DNS缓存详解(DNS Cache Detailed Explanation)
计算机网络·缓存·云原生·容器·kubernetes·云计算·运维开发
Elastic 中国社区官方博客11 小时前
使用真实 Elasticsearch 进行高级集成测试
大数据·数据库·elasticsearch·搜索引擎·全文检索·jenkins·集成测试
杨浦老苏12 小时前
开源音乐管理软件Melody
docker·群晖·多媒体
杨浦老苏14 小时前
面向npm的实时仪表板Dashly
网络·docker·群晖·导航
JunLan~15 小时前
Docker 部署 GLPI(IT 资产管理软件系统)
运维·docker·容器
特立独行的猫a17 小时前
使用 Docker(Podman) 部署 MongoDB 数据库及使用详解
数据库·docker·podman
画船听雨眠aa18 小时前
gitlab云服务器配置
服务器·git·elasticsearch·gitlab
LUCIAZZZ19 小时前
基于Docker以KRaft模式快速部署Kafka
java·运维·spring·docker·容器·kafka
特立独行的猫a1 天前
Golang 应用的 Docker 部署方式介绍及使用详解
开发语言·docker·golang
risc1234561 天前
【Elasticsearch 】悬挂索引(Dangling Indices)
大数据·elasticsearch·搜索引擎