当前位置: 首页 > news >正文

云原生时代,如何构建高效分布式监控系统

文章目录

  • 一.监控现状
  • 二.Thanos原理分析
    • Sidecar
    • Querier
    • Store
    • Compactor
  • 三.Sidecar or Receiver
    • Thanos Receiver工作原理
  • 四.分布式运维架构

一.监控现状

Prometheus是CNCF基金会管理的一个开源监控项目,由于其良好的架构设计和完善的生态,迅速成为了监控领域事实上的标准,尤其是在云原生领域。
Prometheus的优势有很多,服务自动发现,社区众多exporter基本涵盖了所有的开源软件,与k8s深度结合。对于一家小型公司,Prometheus够用了,足以应对所有监控需求。
但随着监控数据量的不断增多,Prometheus的局限性逐渐显现出来了:

  1. 扩展性差,Prometheus自身的TSDB是一个单机的数据库,不支持分布式
  2. 扩展性差的第二个方面在于Prometheus对大量metrics的数据分析能力很差,内存使用 量成线性增长
  3. Prometheus不支持降采样,单机存储捉襟见肘

Prometheus社区也意识到了这个问题,因此推出了prometheus高可用的解决方案—Thanos

二.Thanos原理分析

分层是一个很好的思想,如果划分一层解决不了的问题,利用分层的思想能将复杂问题化整为零。

长短期指标分离:短期指标用来提供给告警系统高频查询近期数据,长期指标用来提供给人查询时间集。在这里插入图片描述
Thanos架构图如上图所示,主要由四个组件组成:Querier、Slidercar、Store和Compactor。

Sidecar

每个Prometheus节点都配置了一个Sidecar组件,通过k8s的部署可以将Prometheus和Sidecar容器集成到一个容器中,Sidecar主要有两个作用和一个后来新增的可选功能,一是用来代理Querier对Prometheus本地数据的读取;二是将Prometheus本地的监控数据(一般是未压缩的块)通过对象存储接口保存到对象存储中,Sidecar每30s读取一次本地元数据,看是否有新的监控数据产生,如果有则读取本地数据块将其上传到对象存储,标记最新的读取时间并且通过本地的JSON文件保存相关信息,包含块的元信息,例如统计信息,时间范围和压缩机制,避免重复上传。

Querier

Querier是Thanos实现多集群监控以及全局视图的关键。Querier接收HTTP的PromQL查询,组件负责数据查询汇聚,查询流程如下图:
简而言之,就是从基础StoreAPI查询所需的数据返回结果。Querier是完全无状态的并且可以水平扩展。Thanos Querier本质上允许在单个Prometheus Query端点下聚合和可选地对多个度量后端进行重复数据删除。对于Querier来说,可以整个Store API的所有内容,因此可以从任意数量的不同存储中聚合数据,例如:* Prometheus(需要包含Sidecar) * 对象存储 * 记录规则和警报规则 * 符合Promtheus远程读写的标准的数据库 * 另外一个Querier * 非Prometheus系统,例如OpenTSDB Querier不仅可以从多个后端获取数据,将他们汇总还可以对其中的重复数据删除,必须为整个集群选择固定的单个或多个副本标签,然后在启动时将其传递给查询节点。仅通过给定副本标签区分的两个或多个序列将合并为一个时间序列。这也掩盖了单个数据源收集方面的差距。
在这里插入图片描述

Store

Store在对象存储中的历史数据之上实现StoreAPI,使对象存储中的数据可以作为Querier查询的后端。Store主要有两个作用,一个在对象存储中数据实现StoreAPI,使对象存储中的数据可以被查询,二是充当一个API网关,可以负责所有StoreAPI的服务发现,因此Store不需要大量的本地磁盘空间。它在启动的时候加入Thanos集群,并发布它可以安全访问的数据。他在本地磁盘上保留有关所有远程块的少量信息,并使它与桶同步。

Compactor

Compator是一个批处理组件,主要针对对象存储的数据压缩,可以将历史的小对象(block,块)合并压缩成大文件对象,对其数据并且删除这些小文件,从而节省存储占用。
Compator是Thanos实现无限存储的关键组件。

Compator主要有两个作用,一个是负责对数据的压缩,另一个是负责历史数据的降准。

三.Sidecar or Receiver

Thanos支持两种方式与Prometheus集成:Sidecar和Receiver
Thanos Sidecar工作原理
在这里插入图片描述
如上图所示,为了实现高可用,Prometheus实例与sidecar组件一起运行,sidecar每隔一段时间抓取prometheus数据,存储在对象存储中。此外Sidecar在Prometheus的远程读API上实现了Thanos的Store API,从而可以从Thanos Queries组件中查询Prometheus的数据。因此 Queries组件在Store API中查询历史数据,最新未上传数据可通过Sidecar查询下层Prometheus数据。

Thanos Receiver工作原理

在这里插入图片描述
Receiver 是作为一个单独的 StatefulSet 来运行的,在这种方法中,Thanos 的所有其他组件都以与 Sidecar 方式相同的方式存在和运行,但 Receiver 取代了 Sidecar 组件,TSDB 的查询和传输到对象存储的方式发生了巨大的变化。

Receiver 组件实现了 Prometheus 的远程写 API,直接接收 Prometheus 的数据,Receiver 将数据上传到对象存储 Bucket 中去,并且也有自己的保留期,Querier 被配置为通过 Store 查询 Receiver 和存储桶上的数据。
Receiver 则是基于 push 的模式,TSDB 由 Prometheus 实例本身远程写入到 Receiver,从而使 Prometheus 最接近无状态。然后数据从 Receiver 进一步上传到对象存储。

结论:具体应该选用哪种类型,要根据具体的业务场景:如果Sidecar数量非常多且Sidecar距离Queries比较远,每次查询Querise都会调用Sidecar,会消耗很多资源,并且速度很慢,而我们看监控大多数都是看最新的数据。
而Receiver模式下,数据实时push到Receiver组件中,Querise组件无需去sidecar中查询最新数据了。但这种模式下大量的数据汇总到Receiver组件,也会增加Receiver的压力,需要给Receiver较多的计算和存储资源。当然设计这个组件时肯定会考虑这个问题,Receiver 实现了一致性哈希,支持集群部署,所以即使规模很大也不会成为性能瓶颈。
没有完美的方案,具体应用哪种模式,需要我们压测和取舍。

四.分布式运维架构

上一节我们了解了Thanos的力量和能力,总结一下:Thanos提供了可靠、低成本的规模化历史数据存储,在上层提供了统一的全局查询视图,通过降准采样特性满足长时间范围的数据查询分析,全局的告警规则。特别适合集团—子公司这种数据架构的应用场景

注意⚠️:Thanos的每个组件都可以部署多个副本,实现高可用
我们通过架构图描述整个的监控架构
在这里插入图片描述

Thanos部署实战可参考:
http://www.dockone.io/article/10053
https://blog.csdn.net/csdnzxm/article/details/120279085

参考文档:
http://dockone.io/article/9988
http://dockone.io/article/6019
https://mp.weixin.qq.com/s/YFx1cY5IsrcHzXFEEu8Z6A
https://zhuanlan.zhihu.com/p/383969247
https://blog.csdn.net/csdnzxm/article/details/120279085
https://blog.csdn.net/u012140251/article/details/121454958

相关文章:

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目,由于其良好的架构设计和完善的生态,迅速成为了监控…...

什么是CIDR技术? 它是如何解决路由缩放问题的

什么是CIDR技术? 它是如何解决路由缩放问题的 一. 什么是 CIDR?二. CIDR 是如何工作的?1. 高效地址分配2. 路由聚合(Route Aggregation)3. 精确满足需求 三. CIDR 的计算详解1. 子网掩码计算2. 地址范围计算3. 可用 IP…...

Unity URP 获取/设置 Light-Indirect Multiplier

Unity URP 获取/设置 Light-Indirect Multiplier 他喵的代码的字段名称叫:bounceIntensity ~~~~~~...

用Python和Tkinter标准模块建立密码管理器

用Python和Tkinter标准模块建立密码管理器 创建一个简单的密码管理器应用程序,帮助用户存储和管理他们的密码。使用Python的tkinter模块来创建一个图形用户界面(GUI)。 本程序支持 添加、查看、搜索、复制、修改、删除 功能。 本程序使用 …...

PyQt5菜单加多页签实现

pyqt tabs标签_哔哩哔哩_bilibili 代码实现 # coding:utf-8 import sys from PyQt5.QtCore import Qt from PyQt5 import QtCore,QtWidgets from PyQt5.QtWidgets import QApplication,QWidget from QhTabs01 import Ui_Form from PyQt5.Qt import *class QhLiangHuaGUI(QWidg…...

关注搜索引擎蜘蛛压力

以前在建站的时候,他们说蜘蛛来抓取的频率越多越好,因为蜘蛛来抓取说明了网站更新速度快,受搜索引擎的欢迎,但是在最近的网站统计中,发现很多蜘蛛爬取的频次非常的高,比如有的蜘蛛一天能来网站几万次&#…...

Python3 OS模块中的文件/目录方法说明三

一. 简介 前面文章简单学习了Python3中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS模块中文件、目录的操作方法:os.fdopen()方法、os.fpathconf() 方法、os.fstat() 方法、os.fstatvfs() 方法。 二. Python3 OS模块中的文件/目录方法说明三 1. os.fdop…...

2024年终总结:技术成长与突破之路

文章目录 前言一、技术成长:菜鸟成长之路1. 学习与实践的结合2. 技术分享与社区交流 二、生活与事业的平衡:技术之外的思考1. 时间管理与效率提升2. 技术对生活的积极影响 三、突破与展望:未来之路1. 技术领域的突破2. 未来规划与目标 四、结…...

mysql-06.JDBC

目录 什么是JDBC: 为啥存在JDBC: JDBC工作原理: JDBC的优势: 下载mysql驱动包: 用java程序操作数据库 1.创建dataSource: 2.与服务端建立连接 3.构造sql语句 4.执行sql 5.关闭连接,释放资源 参考代码: 插…...

使用python调用JIRA6 进行OAuth1认证获取AccessToken

Jira配置应用程序链接 1) 创建应用程序链接 登录 JIRA 管理后台。转到 Administration > Applications > Application Links。在输入框中输入外部应用程序的 URL(例如 GitLab 或自定义应用),然后点击 Create new link。 2) 配置 Con…...

HTML5使用favicon.ico图标

目录 1. 使用favicon.ico图标 1. 使用favicon.ico图标 favicon.ico一般用于作为网站标志,它显示在浏览器的地址栏或者标签上 制作favicon图标 选择一个png转ico的在线网站,这里以https://www.bitbug.net/为例。上传图片,目标尺寸选择48x48&a…...

黑龙江锅包肉:酸甜香酥的东北经典

黑龙江锅包肉:酸甜香酥的东北经典 黑龙江锅包肉,作为东北菜的代表之一,尤其在黑龙江省哈尔滨市享有极高的声誉。这道美食不仅承载着丰富的历史文化内涵,更以其鲜明的地域特色,成为了黑龙江省乃至整个东北地区的标志性菜肴。 历史渊源 锅包肉的历史可以追溯到清朝光绪年间,其…...

Unity阿里云OpenAPI 获取 Token的C#【记录】

获取Token using UnityEngine; using System; using System.Text; using System.Linq; using Newtonsoft.Json.Linq; using System.Security.Cryptography; using UnityEngine.Networking; using System.Collections.Generic; using System.Globalization; using Cysharp.Thr…...

winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件

最近研究不安装office也可以保存Excel文件,在网上查询资料找到这个方法。 第一步:下载EPPlus.dll文件(自行去网上搜索下载) 第二步:引用到需要用的项目中,如图所示: 第三步:写代码…...

【C++基础】多线程并发场景下的同步方法

如果在多线程程序中对全局变量的访问没有进行适当的同步控制(例如使用互斥锁、原子变量等),会导致多个线程同时访问和修改全局变量时发生竞态条件(race condition)。这种竞态条件可能会导致一系列不确定和严重的后果。…...

C语言#define TSLP0 (TSLP_Regdef *)TSENSORO BASE ADDR)的含义?

在C语言中,#define指令用于定义宏。宏是一种预处理器指令,它允许你为代码片段指定一个名称,以便在编译时进行替换。 从你的描述来看,似乎你想定义一个名为 TSLP0 的宏,其值是某个寄存器地址。假设 TSENSORO_BASE_ADDR…...

微信小程序wxs实现UTC转北京时间

微信小程序实现UTC转北京时间 打脸一刻:最近在迭代原生微信小程序,好一段时间没写原生的,有点不习惯; 咦,更新数据咋不生效呢?原来还停留在 this.xxx; 哟,事件又没反应了&#xff1f…...

提示词的艺术 ---- AI Prompt 进阶(提示词框架)

提示词的艺术 ---- AI Prompt 进阶(提示词框架) 写在前面 上周发布了一篇《提示词的艺术----AI Prompt撰写指南》,旨在帮助读者理解提示词的作用,以及简单的提示词撰写指南。本篇作为进阶内容,将给出常用的提示词框架…...

WPF常见面试题解答

以下是WPF(Windows Presentation Foundation)面试中常见的问题及解答,涵盖基础概念、高级功能和实际应用,帮助你更好地准备面试: 基础概念 什么是WPF? WPF是微软开发的用于构建桌面应用程序的UI框架&#x…...

TypeScript 学习

TypeScript 类型 准备本地环境 初始化 TypeScript 项目, 生成 package.json 文件: npm init -y安装 typescript: yarn add typescript -D初始化 TypeScript 配置文件: npx tsc--init输出: Created a new tsconfig.json with:target: es2016module: commonjsstrict: true…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...