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

简介: 日志管理是分布式系统,微服务架构中,经常使用的运维方案,可以提高问题定位速度,便于快速解决程序异常,找到程序缺陷。本文将从项目实践的角度总结提炼日志管理方案。技术选型是Loki+Promtail+Grafana;之后还会专门写一篇ELK方案以及二者的对比,方便大家比较参考使用。

1、为什么要用Loki+Promtail+Grafana:

项目采用微服务的架构,服务很多,每个服务都有自己的日志,分别存放在不同的服务器上。当查找日志时需要分别登录不同的服务器,有大量的请求的情况下,在日志文件中查找信息十分困难。想要搭建一个日志系统,ELK分布式日志系统对于中小型公司来说开发维护成本太高,经过调研,选择Loki轻量级日志系统。

2、Loki架构:

image.png

  • Promtail是代理,负责收集日志并将其发送给Loki。
  • Loki是主服务器,负责存储日志和处理查询。
  • Grafana用于查询和显示日志,UI显示。

简言之:只要在应用程序服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够,可以部署多个Loki进行存储及查询)。作为一个日志系统不光只有查询分析日志的能力,还能对日志进行监控和报警。

3、原理分析:

  • promtail收集并将日志发送给loki的 Distributor 组件
  • Distributor会对接收到的日志流进行正确性校验,并将验证后的日志分批并行发送到Ingester
  • Ingester 接受日志流并构建数据块,压缩后存放到所连接的存储后端
  • Querier 收到HTTP查询请求,并将请求发送至Ingester 用以获取内存数据 ,Ingester 收到请求后返回符合条件的数据 ;
  • 如果 Ingester 没有返回数据,Querier 会从后端存储加载数据并遍历去重执行查询 ,通过HTTP返回查询结果

4、与 ELK 较优势

ELK虽然功能丰富,但规模复杂,资源占用高,操作苦难,很多功能往往用不上,有点杀鸡用牛刀的感觉。

loki 不对日志进行全文索引。通过存储压缩非结构化日志和索引元数据,Loki 操作起来会更简单,更省成本。

通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。

安装部署简单快速,且受 Grafana 原生支持。


5、Linux部署

5.1、下载loki、promtail、Grafana

  • Loki:

下载地址:https://github.com/grafana/loki/releases

下载包:【loki-linux-amd64.zip】

版本:v2.4.1

  • Promtail:

下载地址:https://github.com/grafana/loki/releases

下载包:【promtail-linux-amd64.zip】

版本:v2.4.1

  • Grafana:

下载地址:https://dl.grafana.com/oss/release/grafana-7.1.0-1.x86_64.rpm

下载包:【grafana-7.1.0-1.x86_64.rpm】

版本:v7.1.0

目前线上部署的版本替换成了7.3

下载地址:https://dl.grafana.com/oss/release/grafana-7.3.0-1.x86_64.rpm

下载包:【grafana-7.3.0-1.x86_64.rpm】

版本:v7.3.0

注意:目前Grafana没有官方的汉化包,只有一些基于官网的汉化教程可参考。

5.2、在日志服务器上部署loki和Grafana

5.2.1 安装loki

  • 在日志服务器10.101.17 上创建目录:/home/admin/data、/home/admin/loki

image.png

  • 将 loki-linux-amd64.zip 解压后传到/home/admin/loki下
  • 将yaml 配置文件也上传到/home/admin/loki下,配置内容如下:
auth_enabled: falseserver:  http_listen_port: 3100ingester: # 配置ingester的生命周期如何运行,以及它将在哪里注册以进行发现  lifecycler:    address: 10.10.101.17 #部署loki服务器的ip    ring: # ring用于发现并连接到Ingesters      kvstore:        store: inmemory # 用于连接后端存储,支持的值有:consul etcd inmemory      replication_factor: 1 # 写入和读取的指数    final_sleep: 0s
  chunk_idle_period: 5m # 空闲时间  chunk_retain_period: 30s # 保留时间schema_config:  configs:  - from: 2021-07-01
    store: boltdb
    object_store: filesystem
    schema: v11
    index:      prefix: index_
      period: 168h   #每张表的时间范围7天storage_config:  boltdb:    directory: /home/admin/data/loki/index   #索引文件存储地址  filesystem:    directory: /home/admin/data/loki/chunks  #块存储地址limits_config:  enforce_metric_name: false  reject_old_samples: true  reject_old_samples_max_age: 168h
chunk_store_config:# 最大可查询历史日期 28天,这个时间必须是schema_config中的period的倍数,否则报错。只适用于即时日志  max_look_back_period: 672h
# 表的保留期28天table_manager:  retention_deletes_enabled: true  retention_period: 672h

5.2.2 启动loki

  • 在/home/admin/loki下,输入命令:
nohup ./loki-linux-amd64 -config.file=./config.yaml >./loki.log 2>&1 &

image.png

image.png

5.2.3 安装Grafana

  • 上传包到日志服务器10.101.17,路径:/home/admin

image.png

  • 执行命令:rpm -ivh  ./grafana-7.1.0-1.x86_64.rpm ,报错如下,没有插件依赖

image.png

  • 执行命令:yum install fontconfig urw-fonts -y加载插件(注意:该命令必须用root权限

image.png

image.png

  • 再次执行命令:rpm -ivh  ./grafana-7.1.0-1.x86_64.rpm(切换到admin账号后会报错,因为用rpm安装软件必须要用root权限)

image.png

如下图表示安装成功

image.png

5.2.4 启动Grafana

  • 输入命令:systemctl daemon-reload(需要用root权限),该命令重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,如果新服务的服务程序配置文件生效,需重新加载。

image.png

  • 使用root权限重新输入命令,如下图则表示启动成功

image.png

命令详解:

systemctl daemon-reload   #重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。systemctl enable grafana-server.service
systemctl start grafana-server.service    #服务启动systemctl status grafana-server.service   #服务状态查看

image.png

首次登录会弹出修改密码界面

image.png

image.png

  • 修改默认端口如下:/usr/share/grafana/conf/defaults.ini

image.png

image.png

5.3、在应用服务器部署 promtail

5.3.1 安装promtail

  • 在应用服务器 上创建目录(此处采集某应用开发环境日志)路径为:/home/datashare/basharingsrv/promtail
  • 解压【promtail-linux-amd64.zip】,然后在/home/datashare/basharingsrv/promtail下上传解压后的【promtail-linux-amd64】
  • 在/home/datashare/basharingsrv/promtail下上传配置文件yaml

image.png

  • 配置文件如下:
server:  http_listen_port: 9083  # 若部署多台服务器,端口不能重复使用  grpc_listen_port: 0positions:  filename: /home/datashare/basharingsrv/promtail/positions.yaml  # 记录读取日志的位置信息文件,Promtail重新启动时需要它clients:  - url: http://10.10.101.17:3100/loki/api/v1/push  ## Loki的api服务的地址scrape_configs:## dingtalk日志收集并打标签 - job_name: datasharesrv
   static_configs:   - targets:       - 39.99.197.216 #应用服务器ip   - labels:      job: datasharesrv
      host: 39.99.197.216  #应用服务器ip      __path__: /home/datashare/basharingsrv/taobao-tomcat-7.0.59/logs/catalina.out  #应用日志路径

5.3.2 启动promtail

启动命令:nohup ./promtail-linux-amd64 -config.file=./promtail.yaml > ./promtail.log 2>&1 &、

image.png

启动日志:

image.png

5.4、使用Grafana查看日志

5.4.1 配置数据源

image.png

image.png

image.png

image.png


出现如下提示,表示已连接数据源并找到标签。image.png

5.4.2 查看日志

image.png

在log_labels下面出现的filename、host、job就是在promtail中配置的

image.png

image.png查询语句详解:

{job="datasharesrv"}|~"库表"#匹配job=datasharesrv且包含库表{job="varlogs"}#匹配job=varlogs{job=~"datasharesrv|auth"}#匹配job=datasharesrv和job=auth{filename="/var/log/xx.log"}#按文件名匹配{job="varlogs"} |= "192.168.0.100"#匹配192.168.0.100机器的job=varlogs{job="datasharesrv"}|~"库表"

image.png

  • {filename="/home/datashare/basharingsrv/taobao-tomcat-7.0.59/logs/catalina.out"}|~"库表"

image.png

  • {host="39.99.197.216"}|~"库表生成"

image.png

the end

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
4月前
|
人工智能 安全 Java
分布式 Multi Agent 安全高可用探索与实践
在人工智能加速发展的今天,AI Agent 正在成为推动“人工智能+”战略落地的核心引擎。无论是技术趋势还是政策导向,都预示着一场深刻的变革正在发生。如果你也在探索 Agent 的应用场景,欢迎关注 AgentScope 项目,或尝试使用阿里云 MSE + Higress + Nacos 构建属于你的 AI 原生应用。一起,走进智能体的新世界。
1052 64
|
4月前
|
关系型数据库 Apache 微服务
《聊聊分布式》分布式系统基石:深入理解CAP理论及其工程实践
CAP理论指出分布式系统中一致性、可用性、分区容错性三者不可兼得,必须根据业务需求进行权衡。实际应用中,不同场景选择不同策略:金融系统重一致(CP),社交应用重可用(AP),内网系统可选CA。现代架构更趋向动态调整与混合策略,灵活应对复杂需求。
|
6月前
|
数据采集 消息中间件 监控
单机与分布式:社交媒体热点采集的实践经验
在舆情监控与数据分析中,单机脚本适合小规模采集如微博热榜,而小红书等大规模、高时效性需求则需分布式架构。通过Redis队列、代理IP与多节点协作,可提升采集效率与稳定性,适应数据规模与变化速度。架构选择应根据实际需求,兼顾扩展性与维护成本。
172 2
|
5月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
1032 82
|
9月前
|
人工智能 安全 应用服务中间件
阿里巴巴 MCP 分布式落地实践:快速转换 HSF 到 MCP server
本文分享了阿里巴巴内部将大规模HSF服务快速转换为MCP Server的实践经验,通过Higress网关实现MCP协议卸载,无需修改代码即可接入MCP生态。文章分析了MCP生态面临的挑战,如协议快速迭代和SDK不稳定性,并详细介绍了操作步骤及组件功能。强调MCP虽非终极解决方案,但作为AI业务工程化的起点具有重要意义。最后总结指出,MCP只是AI原生应用发展的第一步,未来还有更多可能性值得探索。
1380 48
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文探讨了日志管理中的常见反模式及其潜在问题,强调科学的日志管理策略对系统可观测性的重要性。文中分析了6种反模式:copy truncate轮转导致的日志丢失或重复、NAS/OSS存储引发的采集不一致、多进程写入造成的日志混乱、创建文件空洞释放空间的风险、频繁覆盖写带来的数据完整性问题,以及使用vim编辑日志文件导致的重复采集。针对这些问题,文章提供了最佳实践建议,如使用create模式轮转日志、本地磁盘存储、单线程追加写入等方法,以降低日志采集风险,提升系统可靠性。最后总结指出,遵循这些实践可显著提高故障排查效率和系统性能。
1372 21
|
5月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
9月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
3120 57
|
9月前
|
安全 JavaScript 前端开发
HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
859 35
|
10月前
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。