广告
返回顶部
首页 > 资讯 > 数据库 >Prometheus时序数据库怎么插入数据
  • 397
分享到

Prometheus时序数据库怎么插入数据

2024-04-02 19:04:59 397人浏览 独家记忆
摘要

本篇内容主要讲解“prometheus时序数据库怎么插入数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Prometheus时序数据库怎么插入数据”吧!前言在

本篇内容主要讲解“prometheus时序数据库怎么插入数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Prometheus时序数据库怎么插入数据”吧!

前言

在之前的文章里,笔者详细的阐述了Prometheus时序数据库在内存和磁盘中的存储结构。有了前面的铺垫,笔者就可以在本篇文章阐述下数据的插入过程。

监控数据的插入

在这里,笔者并不会去讨论Promtheus向各个Endpoint抓取数据的过程。而是仅仅围绕着数据是如何插入Prometheus的过程做下阐述。对应方法:

func (a *headAppender) Add(lset labels.Labels, t int64, v float64) (uint64, error) {     ......     // 如果lset对应的series没有,则建一个。同时把新建的series放入倒排Posting映射里面     s, created := a.head.getOrCreate(lset.Hash(), lset)      if created { // 如果新创建了一个,则将新建的也放到a.series里面         a.series = append(a.series, record.RefSeries{             Ref:    s.ref,             Labels: lset,         })     }     return s.ref, a.AddFast(s.ref, t, v) }

我们就以下面的add函数调用为例:

app.Add(labels.FromStrings("foo", "bar"), 0, 0)

首先是getOrCreate,顾名思义,不存在则创建一个。创建的过程包含了seriesHashMap/Postings(倒排索引)/LabelIndex的维护。如下图所示:

Prometheus时序数据库怎么插入数据

然后是AddFast方法

func (a *headAppender) AddFast(ref uint64, t int64, v float64) error{         // 拿出对应的memSeries         s := a.head.series.getByID(ref)         ......         // 设置为等待提交状态         s.pendinGCommit=true         ......         // 为了事务概念,放入temp存储,等待真正commit时候再写入memSeries         a.samples = append(a.samples, record.RefSample{Ref: ref,T:   t,V:   v,})         //  }

Prometheus在add数据点的时候并没有直接add到memSeries(也就是query所用到的结构体里),而是加入到一个临时的samples切片里面。同时还将这个数据点对应的memSeries同步增加到另一个sampleSeries里面。

Prometheus时序数据库怎么插入数据

事务可见性

为什么要这么做呢?就是为了实现commit语义,只有commit过后数据才可见(能被查询到)。否则,无法见到这些数据。而commit的动作主要就是WAL(Write  Ahead Log)以及将headerAppender.samples数据写到其对应的memSeries中。这样,查询就可见这些数据了,如下图所示:

Prometheus时序数据库怎么插入数据

WAL

由于Prometheus最近的数据是保存在内存里面的,未防止服务器宕机丢失数据。其在commit之前先写了日志WAL。等服务重启的时候,再从WAL日志里面获取信息并重放。

Prometheus时序数据库怎么插入数据

为了性能,Prometheus了另一个Goroutine去做文件的sync操作,所以并不能保证WAL不丢。进而也不能保证监控数据完全不丢。这点也是监控业务的特性决定的。

写入代码为:

commit() |=> func (a *headAppender) log() error {     ......     // 往WAL写入对应的series信息     if len(a.series) > 0 {         rec = enc.Series(a.series, buf)         buf = rec[:0]          if err := a.head.wal.Log(rec); err != nil {             return errors.Wrap(err, "log series")         }     }     ......     // 往WAL写入真正的samples     if len(a.samples) > 0 {         rec = enc.Samples(a.samples, buf)         buf = rec[:0]          if err := a.head.wal.Log(rec); err != nil {             return errors.Wrap(err, "log samples")         }     } }

对应的WAL日志格式为:

Series records

┌────────────────────────────────────────────┐ │ type = 1 <1b>                              │ ├────────────────────────────────────────────┤ │ ┌─────────┬──────────────────────────────┐ │ │ │ id <8b> │ n = len(labels) <uvarint>    │ │ │ ├─────────┴────────────┬─────────────────┤ │ │ │ len(str_1) <uvarint> │ str_1 <bytes>   │ │ │ ├──────────────────────┴─────────────────┤ │ │ │  ...                                   │ │ │ ├───────────────────────┬────────────────┤ │ │ │ len(str_2n) <uvarint> │ str_2n <bytes> │ │ │ └───────────────────────┴────────────────┘ │ │                  . . .                     │ └────────────────────────────────────────────┘

Sample records

┌──────────────────────────────────────────────────────────────────┐ │ type = 2 <1b>                                                    │ ├──────────────────────────────────────────────────────────────────┤ │ ┌────────────────────┬───────────────────────────┐               │ │ │ id <8b>            │ timestamp <8b>            │               │ │ └────────────────────┴───────────────────────────┘               │ │ ┌────────────────────┬───────────────────────────┬─────────────┐ │ │ │ id_delta <uvarint> │ timestamp_delta <uvarint> │ value <8b>  │ │ │ └────────────────────┴───────────────────────────┴─────────────┘ │ │                              . . .                               │ └──────────────────────────────────────────────────────────────────┘

见Prometheus WAL.md

落盘存储

之前描述的所有数据都是写到内存里面。最终落地是通过compator routine将每两个小时的数据打包到一个Blocks里面。

Prometheus时序数据库怎么插入数据

到此,相信大家对“Prometheus时序数据库怎么插入数据”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: Prometheus时序数据库怎么插入数据

本文链接: https://www.lsjlt.com/news/56434.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Prometheus时序数据库怎么插入数据
    本篇内容主要讲解“Prometheus时序数据库怎么插入数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Prometheus时序数据库怎么插入数据”吧!前言在...
    99+
    2022-10-18
  • Prometheus时序数据库中怎么查询数据
    今天就跟大家聊聊有关Prometheus时序数据库中怎么查询数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Promql一个Promql表达式可以...
    99+
    2022-10-18
  • 数据库中怎么插入数据
    这篇文章主要介绍“数据库中怎么插入数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“数据库中怎么插入数据”文章能帮助大家解决问题。插入数据插入数据使用 "INSERT INTO&...
    99+
    2023-06-08
  • 数据库中怎么批量插入数据
    本文小编为大家详细介绍“数据库中怎么批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“数据库中怎么批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。批量插入批量插入使用 execute...
    99+
    2023-06-08
  • 数据库中批量插入数据时主键冲突怎么办
    小编给大家分享一下数据库中批量插入数据时主键冲突怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!客户有这样一个需求:有一个大表A,有主键,经常需要往这个表中批量插入大量数据,但插入的数...
    99+
    2022-10-19
  • php几千条数据怎么插入数据库
    本文操作环境:Windows7系统,PHP7.4版,Dell G3电脑。php几千条数据怎么插入数据库?php 怎么解决 大数据量 插入数据库(1次几千条数据)?如果是用mysql数据库的话,一条语句可以插入几千条语句。类似以下语句:ins...
    99+
    2015-04-23
    php
  • mysql数据库表插入数据
    如何向mysql数据表中插入数据? 答:你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: 如果数据是字符型,必须使用单引...
    99+
    2023-08-31
    数据库 mysql php
  • python 插入mysql数据库数据
    建立数据库连接def create_db_connect():    """    brief info for: create_db_connect &nbs...
    99+
    2022-10-18
  • SQLServer数据库中怎么插入图像
    SQLServer数据库中怎么插入图像,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  1、创建存储过程  CREATEPROCEDUREsp...
    99+
    2022-10-18
  • php数据库插入失败怎么办
    前言PHP是一种非常流行的脚本语言,广泛用于Web开发。其强大的数据库支持使它成为Web应用程序开发的理想选择。然而,在使用PHP进行数据库操作时,我们有时会遇到数据库插入失败的问题。本文将讨论这个问题的原因和解决方法。希望对您有所帮助。问...
    99+
    2023-05-14
  • SpringBootMybatis批量插入Oracle数据库数据
    目录前端数据数据表结构后端Controller:mapperxml前端数据 有如下需求,前端提交一个对象cabinData,保存到数据表中,对象结构如下:  {      "ship...
    99+
    2022-11-13
  • 使用java怎么向mysql数据库批量插入数据
    今天就跟大家聊聊有关使用java怎么向mysql数据库批量插入数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. An...
    99+
    2023-06-14
  • 利用MyBatis怎么将数据插入到Oracle数据库中
    这篇文章将为大家详细讲解有关利用MyBatis怎么将数据插入到Oracle数据库中,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、mybatis批量插入数据到Oracle中的两种方式:第一...
    99+
    2023-05-31
    mybatis oracle
  • MySQL数据库——MySQL INSERT:插入数据(添加数据)
    数据库与表创建成功以后,需要向数据库的表中插入数据。在 MySQL 中可以使用 INSERT 语句向数据库已有的表中插入一行或者多行元组数据。 基本语法 INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSE...
    99+
    2023-08-31
    数据库 mysql sql
  • PHP后端连接数据库插入数据
    一、打开phpstudy。怎么搭建phpstudy,我上一个文章里有教。   二、编写代码 在网站根目录下(默认是www文件下)创建一个任意名称的文件夹,文件夹里创建两个php后缀的文件,一个html后缀的文件,名称自定义。但为了方便理解我...
    99+
    2023-09-15
    数据库 前端 php mysql
  • Android批量插入数据到SQLite数据库
      Android中在sqlite插入数据的时候默认一条语句是一个事务,因此如果存在上万条数据插入的话,那需要执行上万次插入操作,操作速度可想而知。因此在Android中插...
    99+
    2022-06-06
    数据 sqlite数据库 SQLite Android
  • MySQL数据库怎么正常插入并显示中文数据
    本篇内容主要讲解“MySQL数据库怎么正常插入并显示中文数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据库怎么正常插入并显示中文数据”吧!  一...
    99+
    2022-10-18
  • Android怎么把正确的把数据插入到数据库中
    这篇文章主要讲解了“Android怎么把正确的把数据插入到数据库中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么把正确的把数据插入到数据库...
    99+
    2022-10-18
  • C#怎么读取Excel中数据并插入到数据库中
    本篇内容主要讲解“C#怎么读取Excel中数据并插入到数据库中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么读取Excel中数据并插入到数据库中”吧!C#读取Excel中数据,首先上传选...
    99+
    2023-06-18
  • InnoDB中怎么插入数据
    本篇文章给大家分享的是有关InnoDB中怎么插入数据,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。表空间/Tablespace假如,我想成为一...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作