当前位置: 首页 > news >正文

搭建日志系统ELK(二)

搭建日志系统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: logenabled: truepaths:- /var/lib/docker/containers/*/*-json.logfilebeat.config:modules:path: ${path.config}/modules.d/*.ymlreload.enabled: falseprocessors:- add_cloud_metadata: ~- add_docker_metadata: ~output.kafka:enabled: truehosts: ["kafka:9092"]#要提前创建topictopic: "openui-log"partition.hash:reachable_only: truecompression: gzipmax_message_bytes: 1000000required_acks: 1

go-stash.yml

Clusters:- Input:Kafka:Name: gostashBrokers:- "kafka:9092"Topics:- openui-logGroup: proConsumers: 16Filters:- Action: dropConditions:- Key: k8s_container_nameValue: "-rpc"Type: contains- Key: levelValue: infoType: matchOp: and- Action: remove_fieldFields:# - message- _source- _type- _score- _id- "@version"- topic- index- beat- docker_container- offset- prospector- source- stream- "@metadata"- Action: transferField: messageTarget: dataOutput: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.4container_name: elasticsearchuser: rootenvironment:- discovery.type=single-node- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- TZ=Asia/Shanghaivolumes:- ./data/elasticsearch/data:/usr/share/elasticsearch/data- ./data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.ymlrestart: alwaysports:- 9200:9200- 9300:9300networks:- openui_net#查看elasticsearch数据 - Kibana to view Elasticsearch datakibana:image: kibana:7.13.4container_name: kibanaenvironment:- elasticsearch.hosts=http://elasticsearch:9200- elasticsearch.username="elastic"- elasticsearch.password="tester"- TZ=Asia/Shanghairestart: alwaysnetworks:- openui_netports:- "5601:5601"depends_on:- elasticsearch#elasticsearch UIelastichd:container_name: elastichdimage: containerize/elastichdrestart: alwaysnetworks:- openui_netports:- "9800:9800"depends_on:- elasticsearchkafka-ui:container_name: kafka-uiimage: provectuslabs/kafka-ui:latestports:- 9090:8080environment:DYNAMIC_CONFIG_ENABLED: 'true'KAFKA_CLUSTERS_0_NAME: kafka-workKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092depends_on:- kafkanetworks:- openui_net#消费kafka中filebeat收集的数据输出到es - The data output collected by FileBeat in Kafka is output to ESgo-stash:image: eilinge/go-stash # golang:v1.22container_name: go-stashenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghaiuser: rootrestart: alwaysvolumes:- ./deploy/go-stash/etc:/app/etcnetworks:- openui_netdepends_on:- elasticsearch- kafka#收集业务数据 - Collect business datafilebeat:image: elastic/filebeat:7.13.4container_name: filebeatenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghaiuser: rootrestart: alwaysentrypoint: "filebeat -e -strict.perms=false"  #解决配置文件权限问题 - Solving the configuration file permissionsvolumes:- ./deploy/filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml- /var/lib/docker/containers:/var/lib/docker/containersnetworks:- openui_netdepends_on:- kafka#zookeeper是kafka的依赖 - Zookeeper is the dependencies of Kafkazookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghairestart: alwaysports:- 2181:2181networks:- openui_net#消息队列 - Message queuekafka:image: wurstmeister/kafkacontainer_name: kafkaports:- 9092:9092environment:- KAFKA_ADVERTISED_HOST_NAME=kafka- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181- KAFKA_AUTO_CREATE_TOPICS_ENABLE=false- TZ=Asia/Shanghairestart: alwaysvolumes:- /var/run/docker.sock:/var/run/docker.socknetworks:- openui_netdepends_on:- zookeepernetworks:openui_net:driver: bridgeipam: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

相关文章:

搭建日志系统ELK(二)

搭建日志系统ELK(二) 架构设计 在搭建以ELK为核心的日志系统时,Logstash作为日志采集的核心组件,负责将各个服务的日志数据采集、清洗、过滤。然而缺点也很明显: 占用较多的服务器资源。配置复杂,学习曲线陡峭。处理大数据量时…...

常用排序算法的实现与介绍

常用排序算法的实现与介绍 在计算机科学中,排序算法是非常基础且重要的一类算法。本文将通过C语言代码实现,介绍几种常见的排序算法,包括冒泡排序、选择排序、插入排序和快速排序。以下是这些排序算法的具体实现和简要介绍。 1. 冒泡排序&am…...

仓颉语言 -- 宏

使用新版本 (2024-07-19 16:10发布的) 1、宏的简介 宏可以理解为一种特殊的函数。一般的函数在输入的值上进行计算,然后输出一个新的值,而宏的输入和输出都是程序本身。在输入一段程序(或程序片段,例如表达…...

Nginx代理minIO图片路径实现公网图片访问

1、网络部署情况 VUE前端项目Nginx部署在公司内网,端口7790 后台接口项目部署在公司内网,端口7022 minIO服务部署在公司内网,端口9000 公网IP设备将80端口映射到7790端口(具体映射方式不详),实现通过互…...

从零开始掌握tcpdump:参数详解

Linux tcpdump命令详解 1. 语法 tcpdump [-adeflnnNOpqStvxX] [-c <数据包数目>] [-dd] [-ddd] [-F <表达文件>] [-i <网络界面>] [-r <数据包文件>] [-s <数据包大小>] [-tt] [-T <数据包类型>] [-vv] [-w <数据包文件>] [输出数…...

漏洞挖掘 | edusrc记一次某中学小程序渗透测试

一、搜集渗透目标 现在的EDU挖web端的上分效率远不如小程序&#xff0c;因此这篇文章浅浅记录一次小程序的挖掘吧。如果各位大牛想要快速出洞&#xff0c;不妨跳过大学&#xff0c;学院等小程序&#xff0c;而重点关注小学、中学、幼儿园等&#xff0c;这些小程序的出洞率还是…...

vulhub:nginx解析漏洞CVE-2013-4547

此漏洞为文件名逻辑漏洞&#xff0c;该漏洞在上传图片时&#xff0c;修改其16进制编码可使其绕过策略&#xff0c;导致解析为 php。当Nginx 得到一个用户请求时&#xff0c;首先对 url 进行解析&#xff0c;进行正则匹配&#xff0c;如果匹配到以.php后缀结尾的文件名&#xff…...

备战秋招:2024游戏开发入行与跳槽面试详解

注意&#xff1a;以下为本次分享概要&#xff0c;视频版内容更全面深入&#xff0c;详见文末 1.游戏开发领域秋招准备与面试技巧 本次分享由优梦创客机构的创始人雷蒙德主讲&#xff0c;专注于2024年秋招期间游戏开发领域的入行与跳槽面试准备。本次分享重点在于提供面试技巧…...

红外热成像手持终端:从建筑检测到野外搜救的全方位应用

红外热成像手持终端&#xff0c;凭借其独特的红外探测与夜视功能&#xff0c;广泛应用于多个关键领域。无论是军事侦察、消防救援中的夜间作业&#xff0c;还是电力巡检、野生动物观察等多样场景&#xff0c;其精准的红外热成像技术均能提供至关重要的实时数据&#xff0c;助力…...

day07 项目启动以及git

spring框架 spring 负责整合各种框架&#xff0c;把new对象的部分交给spring去做&#xff0c;对象new不出来&#xff0c;项目就启动不起来&#xff0c;这样可以有效保证所需要的对象都在容器中存在&#xff0c;后续的部分都可以顺利执行控制反转&#xff1a;业务对象创建依赖资…...

学会网络安全:开启广阔职业与责任之旅

在数字化时代&#xff0c;网络安全已成为社会经济发展的重要基石。随着互联网的普及和技术的飞速发展&#xff0c;网络安全威胁日益复杂多变&#xff0c;对国家安全、社会稳定以及个人隐私构成了严峻挑战。因此&#xff0c;掌握网络安全技能不仅意味着拥有了一项高价值的职业技…...

UE5 镜头

只狼镜头 Spring Arm 中 开启 Use Pawn Control Rotation&#xff1a;让镜头跟着鼠标移动BP_Character(Self) 中关闭 Use Controller Rotation Yaw&#xff1a;不要让人物和鼠标移动Character Movement 的 Rotation Setting 中 关闭 Use Controller Desired Rotation&#xff…...

SpringBoot如何实现简单的跨域配置

在SpringBoot中实现简单的跨域配置&#xff0c;主要通过全局CORS配置来完成。这通常涉及到实现WebMvcConfigurer接口并覆盖addCorsMappings方法。以下是一个简单的示例&#xff0c;展示了如何在SpringBoot应用中配置CORS策略以允许跨域请求。 首先&#xff0c;需要创建一个配置…...

vue列表进入详情页实现上一篇下一篇功能

概述&#xff1a;需求就是需要可以看列表&#xff0c;然后点击列表的右侧详情看详情&#xff0c;通过详情来实现新增上一份&#xff0c;下一份按钮来实现直接看之后的详情。 网上的解决方法有很多 1.后台获取将全量的id&#xff0c;前台再去直接取下一个id方式。&#xff08;…...

kalman的python实现

前面的kalman都是matlab的&#xff0c;这里在理解的基础上&#xff0c;尝试使用python实现&#xff0c;力求理解更多的内涵。 需要的包 import numpy as np import matplotlib.pyplot as plt 代码 KF algorith demo by Leo 2020.01.06 ZJG CAMPUS,ZJU import numpy as np…...

查找算法:线性查找,golang实现

目录 前言 线性查找 代码示例 1. 算法包 2. 线性查找代码 3. 模拟程序 4. 运行程序 循环次数 假如目标值正好在数组中的第一位 假如目标值正好在数组中的第五位 假如目标值正好在数组中的最后一位 假如目标值不在数组中 线性查找的思想 1. 顺序遍历 2. 比较 3.…...

【图像识别】十大数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 DanishFungi2020 发布方&#xff1a; Google 发布时间&#xff1a; 2021 简介&#xff1a; 补充材料&#xff1a;丹麦真菌 2020 - 不仅仅是另一个图像识别数据集为了支持细粒度植…...

C++ | Leetcode C++题解之第312题戳气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxCoins(vector<int>& nums) {int n nums.size();vector<vector<int>> rec(n 2, vector<int>(n 2));vector<int> val(n 2);val[0] val[n 1] 1;for (int i 1; i &l…...

SSM学习11:springboot基础

教学视频 黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关 springboot基础 搭建项目 修改配置文件 修改application.yml&#xff08;后缀名不对&#xff0c;可以改成这个&#xff09;&#xff0c;配置数据库 spr…...

【前端 18】安装Node.js

Node.js 安装指南 在今天的博客中&#xff0c;我们将一起探讨如何在您的计算机上安装Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许你在服务器端运行 JavaScript 代码。无论您是前端开发者希望探索全栈开发&#xff0c;还是后端开发者寻…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...