搭建日志系统ELK(二)
创始人
2024-11-15 13:07:11
0

搭建日志系统ELK(二)

架构设计

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

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

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

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

架构图

log-collect

各服务功能

  • 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

|-- deploy |   |-- filebeat |   |   -- conf |   |       -- filebeat.yml |   -- go-stash |       -- etc |           -- config.yaml |-- docker-compose.yaml 

配置文件

filebeat.yml

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

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

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 

环境服务搭建

[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

elastic-cluster

kafka-cluster

kafka-cluster

kafka-topic

kafka-topic

kibana

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

相关内容

热门资讯

微扑克游戏辅助器(微扑克)微扑... 微扑克游戏辅助器(微扑克)微扑克发牌规律性(透视)总是是真的有挂(详细辅助新2025版);在进入微扑...
透视线上(德州wepower)... 透视线上(德州wepower)德扑起手牌胜率图(透视)竟然是有挂(详细辅助揭秘攻略)1、透视线上(德...
微扑克wpk透视辅助(微扑克)... 微扑克wpk透视辅助(微扑克)微扑克辅助哪里有卖(透视)一贯是真的有挂(详细辅助2025新版教程)1...
透视攻略(德州俱乐部)德扑之星... 透视攻略(德州俱乐部)德扑之星作弊(透视)总是真的有挂(详细辅助透牌教程)1、操作简单,无需注册,只...
透视ai代打(云扑克德州)智星... 透视ai代打(云扑克德州)智星德州菠萝外挂(透视)竟然真的是有挂(详细辅助插件教程)1、上手简单,内...
透视教程(线上德州)智星德州菠... 透视教程(线上德州)智星德州菠萝开挂(透视)都是是有挂(详细辅助解密教程)1、智星德州菠萝开挂透视辅...
透视代打(德州wepower)... 透视代打(德州wepower)德扑ai智能(透视)一直是有挂(详细辅助AI教程)1、任何德扑ai智能...
透视能赢(wepower德州)... 透视能赢(wepower德州)德州ai人工智能(透视)都是真的是有挂(详细辅助切实教程);1、德州a...
透视系统(德州之星)智星德州菠... 透视系统(德州之星)智星德州菠萝(透视)竟然真的是有挂(详细辅助教你攻略);1、下载好智星德州菠萝辅...
透视计算(wepower德州)... 透视计算(wepower德州)德州ai辅助有用(透视)总是是有挂(详细辅助必备教程)1、德州ai辅助...