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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 日志管理是分布式系统,微服务架构中,经常使用的运维方案,可以提高问题定位速度,便于快速解决程序异常,找到程序缺陷。本文将从项目实践的角度总结提炼日志管理方案。技术选型是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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
135 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
15天前
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
云上数据安全保护:敏感日志扫描与脱敏实践详解
|
5天前
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
日志审计的必要性在于其能够帮助企业和组织落实法律要求,打破信息孤岛和应对安全威胁。选择 SLS 下日志审计应用,一方面是选择国家网络安全专用认证的日志分析产品,另一方面可以快速帮助大型公司统一管理多组地域、多个账号的日志数据。除了在日志服务中存储、查看和分析日志外,还可通过报表分析和告警配置,主动发现潜在的安全威胁,增强云上资产安全。
|
21天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
28天前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
64 4
|
2月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
65 8
|
30天前
|
存储 运维 数据可视化
如何为微服务实现分布式日志记录
如何为微服务实现分布式日志记录
55 1
|
2月前
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
|
3月前
|
Web App开发 存储 监控
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
本文为 iLogtail 开源两周年的实践案例分享,讨论了 iLogtail 作为日志采集工具的优势,包括它在性能上超越 Filebeat 的能力,并通过一系列优化解决了在生产环境中替换 Filebeat 和 Logstash 时遇到的挑战。
141 14
|
4月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践

热门文章

最新文章