搭建日志系统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

相关内容

热门资讯

透视总结!wepoker有透视... 透视总结!wepoker有透视底牌吗,wepoker透视苹果系统(透视好像真的是有挂)1、玩家可以在...
透视黑科技!有哪些免费的wpk... 透视黑科技!有哪些免费的wpk作弊码,(Wpk真的有挂)辅助购买(总是真的有挂);1、在有哪些免费的...
透视脚本!aapoker能控制... 透视脚本!aapoker能控制牌吗,aapoker辅助怎么用,可靠教程(本来是有挂)1、用户打开应用...
透视模拟器!wepoker透视... 透视模拟器!wepoker透视脚本免费使用视频(WEPOKER辅助器)安装不了(本来是真的有挂)1、...
透视新版!wepokerplu... 透视新版!wepokerplus开挂,wepoker手机版透视脚本(透视确实有挂)所有人都在同一条线...
透视科技!wpk插件辅助,(w... 透视科技!wpk插件辅助,(wPk软件)德州局透视(原来真的有挂);进入游戏-大厅左侧-新手福利-激...
透视脚本!aapoker破解侠... 透视脚本!aapoker破解侠是真的吗,aapoker发牌逻辑,切实教程(一直真的是有挂)1、很好的...
透视好牌"wepok... 透视好牌"wepoker轻量版辅助(底牌透视脚本)wepoker高级辅助"总是是真的有挂;1、进入游...
透视黑科技!wepokerpl... 透视黑科技!wepokerplus透视脚本免费,wepoker买脚本靠谱吗(透视切实真的有挂)进入游...
透视存在!wpk透视插件,(w... 透视存在!wpk透视插件,(wpK私人局)透视工作室(都是存在有挂);小薇(透视辅助)致您一封信;亲...