从一到无穷大 #16 ByteSeries,思考内存时序数据库的必要性

news2025/2/26 14:56:54

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

引言

在[3]中我基于Gorilla讨论了时序数据库设置cache的可行性,最后得出结论:RAM去换实时查询的高效,显著增加成本的同时增加系统复杂性。

但是如果换个思路,缓存即为内存时序数据库,长久存储为为其他(分布式文件系统,对象存储,基于磁盘的时序数据库),这个选择又变得合理起来,因为不少研究对于使用内存加速数据写入和实时查询做了广泛的研究[4][5][6],这意味着内存时序数据库相比基于磁盘的时序数据库(写入过程可能存在多次IO操作,查询会触发多次IO操作)有着得天独厚的优势。

此时的权衡点回到了上篇文章中讨论的重点,是否存在Gorilla中提到的“26H”呢,如果线上负载存在的话此类假设,cache的存在是一个杀器,不但加速写入(批量写入后端磁盘存储),实时查询的速率也极其优秀(可以达到10ms级别)。

另外如果使用基于磁盘的时序数据库作为远端存储,对于历史数据的查询也会很快。但是缺陷就是宕机恢复流程会相对复杂,所以如果存在一个副本和主一样应用状态机问题就不是很大,缺陷是如果多副本宕机启动会非常慢。但是问题在于基于磁盘的时序数据库一般对于内存要求较高,无论是compaction,shard的forward index/inverted index的缓存,TSM的缓存,查询期间的内存消耗都不小,这导致如果要在基于磁盘的时序数据库内存中做cache的话要么提升机器内存规格(问题是请求进入引擎以及apply了raft log,在引擎内部做cache意味着需要在raft log外再维护一个log,用于宕机时内存数据恢复,好处是实时写入和实时查询性能提升),要么再加一层(类似于ByteSeries,Gorilla)。

结论:线上负载要求写入和实时查询高性能,时序数据库+缓存(内存时序数据库)可行。

ByteSeries的文章只是阐述了内存存储引擎,对分布式实现(数据如何分片,分布式查询聚合如何实现,难道真的只有一个节点?)和如何沉降冷数据没有提及。

内存布局

Active Segment

在这里插入图片描述

数据首先写入Active Segment,且这个关键路径不做复杂的数据转换和压缩,写入根据SeriesKey的哈希值决定写入哪个Segment ShardSegment Shard由一个追加写入的数组和动态的倒排索引组成。

分片的原因有两个:

  1. 并行数据写入
  2. 将数据从Active Segment转入Static Segment需要暂停写入,并重新分配新的segment,在分片的情况下转换可以是segment级别的,不需要执行整个缓冲区级别的内存分配。

Static Segment

线上100亿时间线的数据在元数据上可以看做10万个tag以及每个tag下数万个tag值。

Static Segment分为两个部分,Static SegmentCompressed Segment,SS数据累计到一定量时转换为CS,这里的目的主要是为了分批进行压缩,均摊昂贵的压缩开销。

在这里插入图片描述

新添加的数据直接添加到数组中,倒排索引中存储数组的偏移量,然后多个Temporary Static Segment合并成一个Static Segment,显然此时属于一个series key的数据还分布在数组的各处,并没有存储在连续空间内,也会导致索引中存储大量的下标值,而且数据点本身也没有办法压缩。

所以Static Segment会进一步转换为Compressed Segment,CS中属于一个Series key的数据都属连续存储的,这样可以减小数据的大小,索引中也只需要存储一个偏移。注意,这里其实存储结构其实是:

  1. 使用tire存储series key,指向compressed list的下标,compressed list内部指向此series key的Compressed data string
  2. Compressed data string指向压缩的数据点

文章最精髓的地方其实在于倒排索引的压缩:
在这里插入图片描述

构建倒排的步骤如下:

  1. 对所有的tagkv构建倒排索颖。即tagkv -> series keys 的偏移
  2. tagkey:使用前缀树压缩,这个思路没什么问题,不但可以极致的压缩tagkey,还允许范围查询。cedar[1]实现,个人认为redis的Redix tree也很适合这里的存储。
  3. tagvalue:把所有的series key list按顺序写入total inverted index array数组,这其中可以存在重复,因为不同的tagkey可以指向同样的serieskey,inverted index offset存储每个tagkv在total inverted index array数组的起始值,这意味这可以迅速找到tagkv对应的serieskey list。使用p4nzenc64来压缩这两个数组

其实可以看到,本质上和基于磁盘的invert index+TSM没有区别,无非去除了forward index,改为数组的下标。这带来的劣势时必须看作这个Compressed Segment已经封闭,且无法修改,不然整个结构全部都要变化。

Data Conversion Scheduler(DCS)

有三个上面提到的功能:

  1. AS转换为TSS
  2. 多个TSS与SS合并
  3. SS转换转换为CSS

值得关注的是这里需要考虑AS的写入吞吐和AS转换为TSS的速率是否匹配,否则可能导致压缩为TSS成为瓶颈,进而导致写入受限。

具体细节没什么好说的,DCS运行在一个单独的线程,执行一系列提前预设好的规则执行调度,其实就是基于维度,大小等条件判断。

评估

文章中把ByteSeries与 tsdc, Prometheus and Gorilla三个数据库从三个维度做了评估,分别为:

  1. 每个维度使用的字节数
  2. 写入速率
  3. single group bydouble group by查询速率

可以预想的,在高维度的场景下ByteSeries原数据所使用的内存非常少,这也很好理解,因为tagkey本身被极致压缩,元数据还只需要指向一个index。写入速率受转换的原因不如Gorilla。

总结

很优秀的内存压缩元数据思路,事实上可以认为这种方法是解决维度爆炸场景下写入和实时查询性能的一种可行方式。

引用:

  1. cedar - C++ implementation of efficiently-updatable double-array trie
  2. TurboPFor-Integer-Compression
  3. 从一到无穷大 #15 Gorilla,论黄金26H与时序数据库缓存系统的可行性
  4. Btrdb: Optimizing storage system design for timeseries processing FAST 2016
  5. Akumuli Numeric B+tree
  6. RTSI: An Index Structure for Multi-Modal Real-Time Search on Live Audio Streaming Services ICDE 2018

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

许可分析 license分析 第十章

许可分析是指对软件许可证进行详细的分析和评估,以了解组织内部对软件许可的需求和使用情况。通过许可分析,可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤: 软件许可证供应商管理:评估和管理…

CSS 浮动布局

浮动的设计初衷 float: left/right/both;浮动是网页布局最古老的方式。 浮动一开始并不是为了网页布局而设计,它的初衷是将一个元素拉到一侧,这样文档流就能够包围它。 常见的用途是文本环绕图片: 浮动元素会被移出正常文档流,…

Redis集群总结

Redis,作为一款开源的、内存中的数据结构存储系统,以其出色的性能和丰富的数据结构在业界赢得了广泛的认可。然而,当我们面临大量数据和高并发请求时,单个 Redis 实例可能无法满足我们的需求。这时,我们就需要使用到 R…

Kubernetes实践:从入门到实践

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

认识Git的工作区、暂存区与版本库

使用 git init 命令在 gitcode 文件夹下创建如下图所示的Git仓库。现在思考这样一个问题:gitcode目录下创建的README文件可以直接被git管理和追踪吗? 答案是否定的,因为只有 Git 本地仓库中的文件才可以被版本控制。什么?难道当前…

内网隧道代理技术(二十七)之 DNS隧道介绍

DNS隧道介绍 DNS协议介绍 域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符…

第二篇------Virtual I/O Device (VIRTIO) Version 1.1

上篇文章:https://blog.csdn.net/Phoenix_zxk/article/details/132917657 篇幅太大,所以分开写,接下来续上 4.3.3.2.1 设备要求:Guest->Host 通知 设备必须忽略 GPR2 的位 0-31(从左边数)。这样可以使…

Eclipse开源代码下载

当前插件开发,需要修改eclipse源码,如需要修改remote相关的代码,所以需要下载相关源码。网上大多资料都说的不清不楚的,也可能我太小白,不明白,反正就是折腾了一两天才感觉有点思路,改如何找源码…

Linux安全加固:保护你的服务器

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

基于springboot+vue的问卷调查系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

聊天机器人

收集窗帘相关的数据 可以用gpt生成,也可以用爬虫 图形化界面 gradio 向量数据库 faiss python代码 import gradio as gr import random import timefrom typing import Listfrom langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstor…

央媒发稿不能改?媒体发布新闻稿有哪些注意点

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 “央媒发稿不能改”是媒体行业和新闻传播领域的普遍理解。央媒,即中央主要媒体,是权威性的新闻源,当这些媒体发布新闻稿或报道时,其他省、…

服务器监控工具:选择与应用

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

积木报表 JimuReport v1.6.2-GA5版本发布—高危SQL漏洞安全加固版本

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

活锁 死锁

一、活锁(liveLock) 活锁是指线程间资源冲突激烈,引起线程不断的尝试获取资源,不断的失败。活锁有点类似于线程饥饿,虽然资源并没有被别人持有,但由于各种原因而无法得到。最常见的原因是进程组的执行顺序…

gRpc入门和springboot整合

gRpc入门和springboot整合 一、简介 1、gprc概念 gRpc是有google开源的一个高性能的pc框架,Stubby google内部的rpc,2015年正式开源,云原生时代一个RPC标准。 tips:异构系统,就是不同编程语言的系统。 2、grpc核心设计思路 grpc核心设计…

【C++深入浅出】日期类的实现

目录 一. 前言 二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 /- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码 一. 前言 通过前面两期类和对象的学习,我们已经对C的…

MFC读取obj格式文件2

前文读取了obj格式文件中顶点相关的数量信息,下面读取显示obj格式文件中顶点相关的坐标信息;使用前面的立方体obj文件; void CObjtest2View::OnDraw(CDC* pDC) {CObjtest2Doc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw co…

【无公网IP内网穿透】Windows搭建Web站点

什么是cpolar? cpolar是一个非常强大的内网穿透工具,开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口,使得公网用户可以轻松访问您的内网服务器,无需部署至公网服务器。支持永久免费使…

redis 主存复制

1. 前言 Redis的持久化机制,它很好的解决了单台Redis服务器由于意外情况导致Redis服务器进程退出或者Redis服务器宕机而造成的数据丢失问题。 在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。 通常…