我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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时序数据库怎么插入数据”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

数据库中怎么插入数据

这篇文章主要介绍“数据库中怎么插入数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“数据库中怎么插入数据”文章能帮助大家解决问题。插入数据插入数据使用 "INSERT INTO" 语句:demo_m
2023-06-08

mysql数据库url怎么写 mysql数据库怎么插入数据

mysql 数据库 url 编写:格式为 jdbc:mysql://[hostname]:[port]/[database name],其中 hostname 为服务器地址,port 为监听端口(默认 3306),database name
mysql数据库url怎么写 mysql数据库怎么插入数据
2024-08-13

Prometheus怎么存储时间序列数据

Prometheus 是一款开源的监控系统,通常用于存储和查询时间序列数据。它使用一种称为“metric”的数据模型来表示时间序列数据,每个 metric 都包含一个名称和一组键值对的标签。Prometheus 使用一种称为 TSDB(时间
Prometheus怎么存储时间序列数据
2024-04-09

数据库中怎么批量插入数据

本文小编为大家详细介绍“数据库中怎么批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“数据库中怎么批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。批量插入批量插入使用 executemany(
2023-06-08

php几千条数据怎么插入数据库

php实现插入几千条数据的方法:1、打开相应的代码文件;2、使用“insert into table_name (field1,field2) values (1,2),(2,3),(3,5),(5,6)”语句插入即可。
2015-04-23

怎样在SQLite数据库中插入数据

在SQLite数据库中插入数据,你可以使用INSERT INTO语句。以下是一个示例:INSERT INTO table_name (column1, column2, column3) VALUES ('value1'
怎样在SQLite数据库中插入数据
2024-04-09

MySQL插入锁与数据库数据恢复时间预估

在MySQL中,插入锁是一种在插入数据时对表进行锁定以防止其他事务同时对同一记录进行操作的锁。当一个事务在插入数据时获取了插入锁,其他事务必须等待该事务完成插入操作后才能继续对该表进行操作。数据恢复时间的预估取决于多个因素,包括数据库的大
MySQL插入锁与数据库数据恢复时间预估
2024-08-14

利用MyBatis怎么将数据插入到Oracle数据库中

这篇文章将为大家详细讲解有关利用MyBatis怎么将数据插入到Oracle数据库中,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、mybatis批量插入数据到Oracle中的两种方式:第一
2023-05-31

使用java怎么向mysql数据库批量插入数据

今天就跟大家聊聊有关使用java怎么向mysql数据库批量插入数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. An
2023-06-14

编程热搜

目录