Go微服务: 日志系统ELK核心架构设计

news2024/11/19 9:34:57

微服务日志系统建设


1 )为什么需要日志系统

  • 业务发展越来越庞大,服务器越来越多
  • 各种访问日志,应用日志,错误日志量越来越多,无法管理
  • 开发人员排查问题,需要到服务器上查日志

2 )Elastic Stack

  • 它是 Elasticsearch, Logstash, Kibana, +Beats 组成的
  • Elasticsearch 是分布式搜索引擎,提供搜集,分析,存储数据三大功能
  • Logstash: 主要是用来日志的搜集,分析,过滤日志的工具
  • Kibana:提供友好的Web界面,可以汇总,分析和搜索数据
  • Beats: 是一个轻量级的日志收集处理工具 (Agent)

3 )Beats 的六种主要工具

  • Packetbeat: 网络数据(收集网络流量数据)
  • Metricbeat: 指标 (收集系统,进程和文件系统级别的数据)
  • Filebeat: 日志文件 (收集文件数据)
  • Winlogbeat: windows事件日志(收集Windows事件日志数据)
  • Auditbeat: 审计数据 (收集审计日志)
  • Heartbeat: 运行时间监控 (收集系统运行时的数据)

4 )ELK 系统的特点

  • 强大的收集能力:能够采集多种来源的日志数据
  • 稳定的传输能力: 能够把日志数据传输到中央系统
  • 分布式存储:可根据业务需求存储日志数据,可动态扩容
  • 分析&展示&提醒: 具备数据分析能力,数据展示能力和告警能力

5 )ELK 架构图

  • Fliebeat放到了一台机器上去,不同的机器
  • 不同的机器也可以放不同的Filebeat
  • Filebeat 即能直接传输到 Es 中去
  • 也可以通过 Logstash 处理完再传输到 Es 中
  • ES 负责存储我们的数据,也负责提供一些复杂的搜索
  • 通过存储和提供一些搜索能力,Kibana 可以通过Es的数据可以多维度的展示数据
  • 如果 Filebeat 和 es 中间压力比较大,还可以加一个 kafka

FileBeat


1 )基本组成

  • Prospector (勘测者) 负责管理 Harvester 并找到所有读取源
  • Harvester (收割机)负责读取单个文件内容,每个文件启动一个

2 )工作原理

  • 这里有2个 prospector
  • 上面一个 prospector 会给每个 log 文件建立一个 harvester, 负责文件内所有数据的上传
  • 下面一个 prospector 是监控 apache2目录下的 log 文件,同样的原理
  • 它会把上面日志文件的数据整理出来,发送到 es, logstash, kafka 或 redis 上

3 )Filebeat 如何记录文件状态

  • 文件状态记录在文件中 (默认在 /var/lib/filebeat/registry)
  • Filebeat 会记录发送前的最后一行,并再可以连接的时候继续发送
  • 每个Prospector 会为每个找到的文件记录一个状态
  • Filebeat 存储唯一标识符以检测文件是否先前被收集
  • 由此,可见,Filebeat是记录一系列的状态,来记录文件传输的过程

4 )Filebeat 如何保证事件至少被输出一次

  • Filebeat 将每个事件的传递状态保存在文件中
  • 在未得到输出方确认时,Filebeat 会尝试一直发送,直到得到回应
  • 任何在Filebeat 关闭之前未确认的事件,都会在 filebeat 重启之后重新发送
  • 可确保至少发送一次,但有可能会重复

5 )filebeat.yml 文件的配置样例

# Filebeat 输入
filebeat.inputs:
    # 类型
    - type: log
      enabled: true
      # 要抓取的文件路径
      paths:
        - ./*.log
# 输出 这里输出到 logstash, 也可输出到 es
output.logstash:
    # logstash 地址
    hosts: ["localhost: 5044"]

Logstash 工作原理

  • 主要是三个阶段:inputs -> filters -> outputs
    • 第一阶段是 Input 输入,会把数据输入到 logstash
    • 第二阶段是 Filters 过滤清洗
      • 数据中间处理,对数据进行操作, 它会有自己的插件
    • 第三阶段是 Outputs 数据输出
      • outputs 是 logstash 处理管道的最末端组件
      • 可以发送给es来存储和索引

1 )Logstash-Input 阶段常见的输入

  • file:从文件系统的文件中读取,类似于 tail -f 命令
  • syslog:在 514端口上监听系统日志消息,并根据RFC3164标准进行解析
  • beats:从 Filebeat 中读取

2 )Logstash-Input 常用样例

  • .conf 文件
    input {
        beats {
            port => 5044
        }
        tcp {
            port => 5000
        }
    }
    
    • beats 常用的 5044 是 Inputs 常用样例
    • 下面的 tcp 也可以不用写

3 )Logstash-Filter 数据中间件处理插件 grok (可解析任意文本数据)

  • Grok 基础语法,如: %{SYNTAX:SEMANTIC}
    • SYNTAX:代表匹配值的类型
    • SEMANTIC:代表存储该值的一个变量名称
  • %{ERROR|DEBUG|INFO|WARN: log_level}

4 )Logstash-Output 数据输出

  • 输出到 kafka 和 es 也可以输出到 redis
  • 输出到 es 样例
    output {
        elasticsearch {
            hosts => "elasticsearch: 9200"
            user => "elastic"
            password => "changeme"
            index => "%{[@metadata][-xxxxx]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
        }
    }
    

Docker-Compose 安装 ELK


1 )ELK docker-compose 编写

  • elasticsearch : 先拉镜像,再对配置进行修改
  • logstash:配置它的input和output
  • kibana: 搭建kibana平台, 有日志生成了, filebeat把程序log传到kibana
  • 现在编写代码,ELK 通过一个 docker-stack.yml 来进行管理
  • docker-stack.yml
    version: '3.3'
    services:
      elasticsearch:
        image: elasticsearch:7.9.3
        ports:
          - "9200:9200"
          - "9300:9300"
        volumes:
          - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
        environment:
          ES_JAVA_OPTS: "-Xmx256m -Xms256m"
          ELASTIC_PASSWORD: xxxxxpwd
          discovery.type: single-node
          network.publish_host: _eth0_
      logstash:
        image: logstash:7.9.3
        ports:
          - "5044:5044"
          - "5000:5000"
          - "9600:9600"
        volumes:
          - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
          - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
        environment:
          LS_JAVA_OPTS: "-Xmx256m -Xms256m"
      kibana:
        image: kibana:7.9.3
        ports:
          - "5601:5601"
        volumes:
          - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    

2 ) 各类配置文件编写

  • elasticsearch/config/elasticsearch.yml
    ---
    cluster.name: "xxxxx-cluster"
    network.host: 0.0.0.0
    
    xpack.license.self_generated.type: trial
    xpack.security.enabled: true
    xpack.monitoring.collection.enabled: true
    
  • logstash/config/logstash.yml
    ---
    http.host: "0.0.0.0"
    xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]
    
    xpack.monitoring.enabled: true
    xpack.monitoring.elasticsearch.username: elastic
    xpack.monitoring.elasticsearch.password: xxxxxpwd
    
  • logstash/pipeline/logstash.conf
    input {
        beats {
            port => 5044
        }
        tcp {
            port => 5000
        }
    }
    
    output {
        elasticsearch {
            hosts => "elasticsearch:9200"
            user => "elastic"
            password => "xxxxxpwd"
            index => "%{[@metadata][-xxxxx]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
        }
    }
    
  • kibana/config/kibana.yml
    ---
    server.name: kibana
    server.host: 0.0.0.0
    elasticsearch.hosts: ["http://elasticsearch:9200"]
    monitoring.ui.container.elasticsearch.enabled: true
    
    elasticsearch.username: elastic
    elasticsearch.password: xxxxxpwd
    

3 ) 启动和检查

  • 启动:$ docker-compose -f docker-stack.yml up -d
  • 检查:$ docker-compose -f docker-stack.yml ps
    NAME                  IMAGE                 COMMAND                  SERVICE             CREATED              STATUS              PORTS
    elk-elasticsearch-1   elasticsearch:7.9.3   "/tini -- /usr/local…"   elasticsearch       About a minute ago   Up About a minute   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
    elk-kibana-1          kibana:7.9.3          "/usr/local/bin/dumb…"   kibana              About a minute ago   Up About a minute   0.0.0.0:5601->5601/tcp
    elk-logstash-1        logstash:7.9.3        "/usr/local/bin/dock…"   logstash            About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp, 0.0.0.0:9600->9600/tcp
    
  • 现在整个日志系统基本已经搭建完毕 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue从入门到实战 Day08~Day10

智慧商城项目 1. 项目演示 目标:查看项目效果,明确功能模块 -> 完整的电商购物流程 2. 项目收获 目标:明确做完本项目,能够收获哪些内容 3. 创建项目 目标:基于VueCli自定义创建项目架子 4. 调整初始化目录 目…

刷题之和为k的数组(leetcode)

和为k的数组 这个思路一直想不到&#xff0c;参考了官方答案&#xff0c;哈希表记录[0,i]的和 class Solution { public:int subarraySum(vector<int>& nums, int k) {int result0;unordered_map<int, int>map;int pre0;//前缀和&#xff08;前面的和&…

必应崩了?

目录 今天使用必应发现出现了不能搜索&#xff0c;弹出乱码的情况。 搜了一下&#xff0c;发现其他人也出现了同样的问题。 使用Edge浏览器的话&#xff0c;可以试着改一下DNS&#xff0c;有可能会恢复正常&#xff08;等官方修复了记得改回来&#xff09; 使用谷歌浏览器打开…

哪些AI写作软件好用,这三款强大的AI写作软件必知

在当今信息爆炸的时代&#xff0c;AI写作软件逐渐成为许多人提高写作效率和质量的得力助手。面对众多的选择&#xff0c;哪些AI写作软件真正好用呢&#xff1f;以下为大家介绍三款强大的AI写作软件。 第一款&#xff1a;火呱AI写作 它凭借其强大的语言理解和生成能力脱颖而出。…

C++随机数生成神器:rand(),让你的代码更加引人入胜!

更多资源请关注纽扣编程微信公众号 使用 rand 函数可以获取 机数大小是在0到RAND_MAX&#xff0c;值为2147483647&#xff0c;它是在stdlib中定义的&#xff0c;如果我们希望在某个范围内&#xff0c;可以使用 % 结合 / 来实现 但是不难发现&#xff0c;这里获得的随机数是…

k8s 1.24.x之后如果rest 访问apiserver

1.由于 在 1.24 &#xff08;还是 1.20 不清楚了&#xff09;之后&#xff0c;下面这两个apiserver的配置已经被弃用 了&#xff0c;简单的说就是想不安全的访问k8s是不可能了&#xff0c;所以只能走安全的访问方式也就是 https://xx:6443了&#xff0c;所以需要证书。 - --ins…

MySQL 主备环境搭建 docker

MySQL 主备环境搭建 docker 拉取docker镜像 sudo docker pull mysql:8.0 启动容器 docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0配置 M…

通过域名接口申请免费的ssl多域名证书

来此加密已顺利接入阿里云的域名接口&#xff0c;用户只需一键调用&#xff0c;便可轻松完成域名验证&#xff0c;从而更高效地申请证书。接下来&#xff0c;让我们详细解读一下整个操作过程。 来此加密官网 免费申请SSL证书 免费SSL多域名证书&#xff0c;泛域名证书。 首先&a…

linux 错误记录(三)

这里的内核源码路径&#xff1a; cd /usr/src/linux-headers-5.4.0-150-generic/ 内核版本&#xff1a; $ uname -r 5.4.0-150-generic 错误现象 ./include/uapi/asm-generic/int-ll64.h:12:10: fatal error: asm/bitsperlong.h: No such file or directory 搜索后是有的 …

STM32控制HC-SR04超声模块获取距离

欢迎入群共同学习交流 时间记录&#xff1a;2024/5/23 一、模块介绍 &#xff08;1&#xff09;引脚介绍 VCC&#xff1a;电源引脚&#xff0c;接单片机3.3/5V GND&#xff1a;电源地 Trig&#xff1a;超声信号触发引脚 Echo&#xff1a;超声信号接收引脚 &#xff08;2&…

热红外传感器

热红外传感器 一、热红外测温原理二、热红外传感器三、MLX90640-D55(MLX90640-BAB)测试 一、热红外测温原理 自然界中当物体的温度高于 绝对零度 时&#xff0c;由于它内部 热运动 的存在,就会不断地向四周辐射电磁波&#xff0c;其中就包含了波段位于0.75&#xff5e;100μm …

Unity Render入门

概述 在unity中渲染相关的组件是和Render关联的&#xff0c;比如我们常见的3D模型中的MeshRender&#xff0c;UI中的RenderCanvas等都是和Render相关联的&#xff0c;相信在unity的学习过程中&#xff0c;一定看到过非常多和Render相关的内容&#xff0c;那让我们学习一下这部…

Invoking “make cmake_check_build_system“ failed

前言&#xff1a; 在看过站内其他的方法且试过之后没奏效之后&#xff0c;偶然&#xff0c;无意间&#xff0c;随手整对了&#xff0c;然后后续在老赵的文档也找到了原因&#xff0c;对的上号&#xff0c;那在此我提出一种新的方法&#xff0c;且很简单的小tips。首先先来看看…

对列表进行统计和计算

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python的列表提供了内置的一些函数来实现统计、计算的功能。下面介绍几种常用的功能。 &#xff08;1&#xff09;获取指定元素出现的次数 使用列表…

shell 脚本笔记2

3.env与set区别 env用于查看系统环境变量 set用于查看系统环境变量自定义变量函数 4.常用环境变量 变量名称含义PATH命令搜索的目录路径, 与windows的环境变量PATH功能一样LANG查询系统的字符集HISTFILE查询当前用户执行命令的历史列表 Shell变量&#xff1a;自定义变量 目标…

极光笔记|EngageLab AppPush引入全封装语音播报SDK

推送语音播报简介 语音播报是一种通知方式&#xff0c;在收到通知的时候&#xff0c;用户不用拿起手机查看&#xff0c;直接通过语音播报方式了解通知内容&#xff0c;节省时间提高工作效率。主要适用于商家交易收费通知&#xff0c;用户之间转账通知、公交车到站等场景。 语…

虚拟机安装Windows server 2022时蓝屏Boot Manager解决方案

文章目录 问题一、问题思路分析二、解决方案总结 问题 我在VMware虚拟机中安装Windows server 2022时无法正常安装&#xff0c;会进入Boot Manager界面 点击 Boot normally后过一会儿还会跳转到此页面 一、问题思路分析 简单的判断一下这是一个引导问题&#xff0c;那么可能是…

容器组件:栅格布局,侧边栏容器(HarmonyOS学习第四课【4.5】)

栅格布局 栅格布局可以为布局提供规律性的结构&#xff0c;解决多尺寸多设备的动态布局问题&#xff0c;保证不同设备上各个模块的布局一致性。 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明 该组件从API Version 9开始支持。后续版本…

Day35 代码随想录打卡|二叉树篇---二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;二叉树的层序遍历感觉是相对简单的&#xff0c;只需要定义一个队列&#xff0c;从根节点开始放入队列…

ArrayBlockQueue原理分析

1.简介 它是带有生产者-消费者模式实现的并发容器&#xff0c;同样用来解决高并发场景下多线程之间数据共享的问题。Arra不支持扩缩容&#xff0c;其容量大小在初始化时就已经确定好了&#xff0c;尽管字面意义上来看它属于阻塞队列的一种&#xff0c;但它同时还提供了一些非阻…