分布式系统日志管理实践(二)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
可观测可视化 Grafana 版,10个用户账号 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志管理是分布式系统,微服务架构中,经常使用的运维方案,可以提高问题定位速度,便于快速解决程序异常,找到程序缺陷。本文将从项目实践的角度总结提炼日志管理方案。 技术选型是ELK+Filebeat,最后将与上文的Loki+Promtail+Grafana选型方案进行优缺点比较,方便大家比较参考使用。

1、架构

选用流行的日志选型框架,Elasticsearch+Logstash+Kibana

  • Elasticsearch:存储日志,提供搜索功能
  • Logstash:监控,过滤,收集日志
  • Kibana : 提供web界面,支持查询,统计和图标展现

除了使用ELK之外,还采用Filebeat收集应用主机上的日志。

  •  Filebeat:一个轻量级开源日志文件数据搜索器,Filebeat读取文件内容,发送到Logstash进行解析后进入Elasticsearch,或者直接发送到Elasticsearch进行集中式存储和分析。

image.png    原理

  • Filebeat负责收集应用写到磁盘上的日志,并将日志发送给logstash。
  • logstash处理来自filebeat的日志,并将处理后的日志保存elasticsearch索引库。
  • elasticsearch存储来自logstash的日志。
  • kibana从elasticsearch搜索日志,并展示到页面。  

2、部署

本次测试验证采集测试环境2个应用的业务日志。

2.1、应用部署

为了简单,并且节省资源,elasticsearch、logstash、kibana全部部署在10.16.44.193主机上,在项目中使用本方案,可根据实际需求进行分布式节点扩展。

分别部署filebeat在2个被采集应用的主机上。

2.2、采集流程

      1)首先部署filebeat在应用主机,采集日志后将日志输出到193主机上的logstash

      2)logstash接收到filebeat传输的应用日志后,将日志再次输入到elasticsearch中

      3)kibana中配置elasticsearch信息

      4)在kibana页面检索日志

2.3、下载地址

  • Elasticsearch

下载地址:https://www.elastic.co/downloads/elasticsearch

版本号:7.14.1

  • Logstash

    下载地址:https://www.elastic.co/downloads/logstash

    版本号:7.14.1

  • Kibana

    下载地址:https://www.elastic.co/downloads/kibana

    版本号:7.14.1

  • Filebeat

下载地址:https://www.elastic.co/downloads/beats/filebeat

    版本号:7.14.1


3、配置

3.1、filebeat配置文件

filebeat.inputs:    - type: log   
    paths:       - /home/admin/taobao-tomcat-production-7.0.59.3/logs/catalina.out
output.logstash:   #logstash的IP:PORT    hosts: ["10.16.44.193:5044"]

3.2、logstash配置文件

input {#采用beats插件  beats {#监听5044端口    port => 5044
}}output {   elasticsearch {#elsaticsearch IP+PORT      hosts => ["10.16.44.193:9200"]#设置索引      index => "amc-log"}}

3.3、elasticsearch配置文件

# ======================== Elasticsearch Configuration =========================# ---------------------------------- Cluster -----------------------------------#是否开启跨域访问http.cors.enabled: true 
##跨域连接相关设置 http.cors.allow-origin: "*"http.cors.allow-headers: Authorization
cluster.name: Es-test
## ------------------------------------ Node ------------------------------------# Use a descriptive name for the node:node.name: test-1
node.master: true# ----------------------------------- Paths ------------------------------------# Path to log files:path.logs: /home/admin/es/logs
# ---------------------------------- Network -----------------------------------network.host: 0.0.0.0http.port: 9200# --------------------------------- Discovery ----------------------------------## Pass an initial list of hosts to perform discovery when this node is started:# The default list of hosts is ["127.0.0.1", "[::1]"]transport.tcp.compress: truediscovery.seed_hosts: ["10.16.44.193","10.16.44.194","10.16.44.195"]cluster.initial_master_nodes: ["test-1"]

3.4、kibana配置文件

# Kibana is served by a back end server. This setting specifies the port to use.server.port: 5601server.host: "10.16.44.193"# The Kibana server's name.  This is used for display purposes.server.name: "your-hostname"# The URLs of the Elasticsearch instances to use for all your queries.#设置elasticsearch主机ip+端口elasticsearch.hosts: ["http://10.16.44.193:9200"]# Kibana uses an index in Elasticsearch to store saved searches, visualizations and# dashboards. Kibana creates a new index if the index doesn't already exist.kibana.index: ".kibana"#设置elasticsearch用户名和密码 如果有的话#elasticsearch.username: "kibana_system"#elasticsearch.password: "pass"

注:此处展示的是其中一个应用的filebeat配置文件,另外一个应用的配置文件除了端口号不同,其余相同;logstash配置文件此处展示其中一个应用的,另外一个应用同理。

4、启动

filebeat:nohup ./filebeat -e -c filebeat.yml > filebeat.log &;tail -f filebeat.log

kibana:nohup ./kibana &

logstash:nohup ./logstash   &

elasticsearch:./elasticsearch


5、查看日志

  • 访问kibana页面:

          http://10.16.44.193:5601/

  • 创建索引

     选择右上角创建索引

输入索引名称,点击下一步,与elasticsearch中创建的索引匹配

  • 检索日志

   Discover查询索引下日志

image.png

 时间检索:@timestamp < "2021-12-15T10:55:59"

image.png

 关键字检索:610111111111111112112154656559

image.png

6、Loki和ELK日志方案的比较

优点

缺点

ES+Logstash+Filebeat+kibana

1、可实现更复杂的查询;

2、适合根据需求在kibana制作图表,更加可视化;

3、分片机制提供更好的分布性,将索引分割到不同容器或者分片中,可以存在单个节点或多个节点,在集群节点间平衡这些分片,为了更好地扩展索引和搜索负载;

4、分片高可用,一个分片可以设置多个复制,使得某台服务器宕机的情况下,集群仍旧可以照常运行,并会把由于服务器宕机丢失的复制恢复到其它可用节点上,复制每个分片提供数据备份,防止硬件问题导致数据丢失;

5、Kibana是ELK堆栈的一部分,用于数据分析和日志监视。

6、将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。

1、Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患;Filebeat替换了Logstash,将Filebeat部署在应用端,Filebeat可以防止数据丢失,解决了logstash在系统中占用资源高的问题,但可能会发送重复。

2、ES存储内容最多,因此存储成本比较高

3、数据库字段太多,查询太慢,索引没有办法再做优化。

4、允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,操作苦难。很多功能往往用不上,大多数查询只关注一定时间范围和一些简单的参数(如host、service等),使用这些解决方案就有点杀鸡用牛刀的感觉了。

5、询消耗CPU资源高;

6、Kibana的仪表盘是公开的,没有进行基于角色的访问控制。如果你需要针对多个用户设置不同的权限级别,就得增加额外的配置预算采购 Shield了。

7、Kibana 旨在仅与 Elasticsearch 一起使用,因此不支持任何其他类型的数据源。

8、日志查询界面与服务器中日志展示的格式不一致,不直观

Loki+promtail+grafana

1、资源消耗少,轻便

2、Grafana 附带内置用户控制和身份验证机制,允许您限制和控制对仪表板的访问,包括使用外部 SQL 或 LDAP 服务器。此外,Grafana 的 API可用于保存特定仪表板、创建用户和更新数据源等任务。您还可以创建特定的 API 密钥并将它们分配给特定的角色。

3、使用了类似Prometheus的方式进行日志的匹配过滤,查询速度快;

4、只索引与日志相关的元数据标签 ,而日志内容则以压缩方式存储于对象存储中, 不做任何索引。相较于ES这种全文索引的系统,数据可在十倍量级上降低,加上使用对象存储,最终存储成本可降低数十倍甚至更低,

5、特别适合储存 Kubernetes Pod 日志。诸如 Pod 标签之类的元数据会被自动删除和编入索引;

6、Grafana 原生支持;

7、Grafana支持多数据源

8、日志查询界面与服务器的日志输出展示一致,更直观

9、Loki 允许多个租户使用单个 Loki 实例。不同租户的数据与其他租户完全隔离。通过在代理中分配租户 ID 来配置多租户。

10、Loki 在小范围内运行良好。在单进程模式下,所有需要的微服务都在一个进程中运行。单进程模式非常适合测试 Loki、在本地运行或小规模运行。Loki 还旨在为大规模安装进行横向扩展。Loki 的每个微服务组件都可以分解为单独的进程,并且配置允许对组件进行单独扩展。

1、 grafana中不支持loki的图表形式,只有log形式;

2、 受制于该工具比较新,很多地方还待完善。如dashboard对Loki的支持力度远远不够,基于Loki日志的告警目前也很不方便。


笔者正在尝试将项目日志方案替换为Loki+promtail+grafana,以上供大家参考。

THE END

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
48 1
|
4月前
|
存储 监控 数据库
Django 后端架构开发:高效日志规范与实践
Django 后端架构开发:高效日志规范与实践
77 1
|
2月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
99 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
3月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
2月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
52 1
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
49 2
|
3月前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
276 1
|
4月前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
114 1
|
4月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
188 0
|
4月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
103 0