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

本文涉及的产品
可观测可视化 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日志并进行多维度分析。
目录
相关文章
|
2月前
|
NoSQL 关系型数据库 MySQL
分布式锁:不同实现方式实践测评
分布式锁:不同实现方式实践测评
28 0
|
6月前
|
SQL 安全 关系型数据库
Seata 解决分布式事务理论与实践(2)
Seata 解决分布式事务理论与实践(2)
Seata 解决分布式事务理论与实践(2)
|
6月前
|
数据库 Nacos 微服务
Seata 解决分布式事务理论与实践(1)
Seata 解决分布式事务理论与实践(1)
|
6月前
|
存储 弹性计算 监控
日志服务SLS实现云产品可观测实践
认证考试:日志服务SLS实现云产品可观测实践
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
4月前
|
存储 缓存 Java
浅析JAVA日志中的几则性能实践与原理解释
本篇文章通过几个技术点说明日志记录过程中的性能实践,计算机领域的性能往往都遵循着冰山法则,即你能看得见的、程序员能感知的只是其中的一小部分,还有大量的细节隐藏在冰山之下。
522 1
|
21天前
|
存储 Java 应用服务中间件
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
43 0
|
28天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
26 0
|
5月前
|
负载均衡 Java 应用服务中间件
分布式系列教程(23) -分布式事务解决方案(实践篇)
分布式系列教程(23) -分布式事务解决方案(实践篇)
57 0
|
1月前
|
存储 消息中间件 监控
Zoom 基于Apache Hudi 的流式日志处理实践
Zoom 基于Apache Hudi 的流式日志处理实践
43 1

热门文章

最新文章