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

微服务日志系统建设

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 文件的配置样例

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 文件

    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

    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

    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

    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

    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

    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
  • 现在整个日志系统基本已经搭建完毕 ~

相关推荐
张忠琳1 小时前
【Go 1.26.4】Golang Channel 深度解析
开发语言·后端·golang
阿狸猿3 小时前
论微服务架构及其应用
java·微服务·架构
兮山与4 小时前
SpringCloud1.0
微服务
张忠琳4 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
Sean‘6 小时前
在隔离内网机器上使用 Filebeat 全量采集日志并推送到 ELK 的实战
运维·服务器·elk
何以解忧,唯有..9 小时前
Go 语言安装与环境配置完整指南
开发语言·后端·golang
踏着七彩祥云的小丑10 小时前
Go 学习第6天:结构体 + 切片 + range遍历
开发语言·学习·golang·go
NG47711 小时前
【微服务学习笔记】stream与zipkin的操作和使用
微服务·stream·zipkin
浮尘笔记11 小时前
Go实现大文件异步流式采集引擎
开发语言·后端·golang
DianSan_ERP11 小时前
架构师视角:电商大促高并发下的订单API限流与防漏单架构演进
java·运维·网络·安全·微服务·架构·自动化