【Apache Pinot】探究 Pinot 中存储模型的设计逻辑和 Segment 详解

news2024/11/24 23:04:48

背景

上一篇文章中,笔者简单介绍了一下分布式数据库 Pinot 的核心组件,本文主要针对其中的存储模型会做部分讲解。
如果你对读写磁盘有不错的基础的话,看起来会更轻松一些,如果没有也没关系,我会简单讲解一下这么设计的好处,会涉及一些八股,实在看不懂的可以留言,笔者知道的话会给你们的评论做解答。

存储模型

要先理解概念就得先看一下图,在脑海里面多增加印象。那么还是老样子,直接偷一波官方的图。
在这里插入图片描述
从上图,最直观的感受就是 N 个 Segment 组成一个 Table,N 个 Table 在 Tenant 下,诺干 Table 组成一个大的 Cluster。其中 Segment 是根据时间做的分区,Table 就是逻辑表,Isolate 是根据租户做隔离。
直观着看其实就是这个逻辑,但是为什么要有 Segment,租户是用来干什么的。那这块我们就先要结合 Pinot 的设计理念来探讨。

设计逻辑

Pinot 的几个标准如下,这个是他们官方网站里面写的。

  • 高可用
  • 水平可扩展
  • 延迟与存储
  • 不可变数据
  • 动态配置更改

针对上面的标准,我简单拆分为控制性能

控制

要做到上述的标准需要借助一些开源工具,高可用,水平可扩张,动态配置更改,这几块基本都是需要一个一致性比较高的注册中心。Pinot 目前使用的就是 apache Helix 来作为解决方案。

性能

那么我们可以初步把存储模型设计的核心归到延迟与存储和不可变数据。其实脱离了场景谈优化没有探讨意义,所以在笔者的观点来看,Pinot 的核心点还是围绕时间为基础,界定场景是一些更时间关系更大的相关分析场景。那么我们定一个场景就是基于查询最近某个周期范围内,我们拆分成这么多 Segment 会带来速度的提升么?

先不回答这个问题,先做一些简单的 IO 复习。其实要做到读的快,写的快不外乎两点,介质和并发。 一个线程按照 page 对其的概念,你按照每个 block 是 4KB 去读数据,那么也不会打满整个介质的 IO。用简单的公式来表达就是: 吞吐量 = 线程 * IO速度

IO 速度

大家知道不同介质下面他们的读写速度是不同的,我从网上找了数据资料,先贴到下面的表格里面。

介质顺序读顺序写随机读随机写
机械硬盘84MB/s79MB/s1MB/s1MB/s
固态硬盘220.7MB/s77.2MB/s24.654MB/s68.910MB/s

从表中我们大概可以看出来,顺读写在不同介质下的查询不大,但是读的性能差距比较明显。

线程数

简单讲就是开 N 个并发去读文件数据,但是并发读一个文件的话,其实还是会有些许性能损耗,比如文件锁。所以最好说同时读 N 个文件来打满磁盘的IO,这样冲突会更少。

上面两个点转换到读取 Segment 上,那么就是说如果一个 Table 是有 10 个 Segment 组成,那么通过 10 个线程并发去读,每个线程负责一个 Segment ,这样就可以更快的读取所有的数据。从以上知识点,我们就可以比较直观的知道拆分这么多 Segment 的简单好处。但是拆分多个 Segment 有个问题就是如果 Segment 数过多,你的查询又需要查很多 Segment,这种场景则又会出现查询放大的问题,这种时候就又导致查询变慢,因为会影响到整个集群的吞吐。这种只能根据自己的场景去做测试来确定最佳数值。

Segment

其实 Segment 归为实时表的 Segment 和 离线表的 Segment,数据可以通过某种方法生成一个 Segment 并且传到 Deep Storage 中,Server 会拉取数据存到本地的机器中。从这种流程,我们就可以知道,如果要修改某个 Segment 里面的数据就得重新替换这个 Segment,所以更改数据在 Pinot 这个数据库中非常麻烦,但是也不是没办法解决这个问题。

离线 Segment

在这里插入图片描述

实时Segment

消费完的
在这里插入图片描述
消费ING
在这里插入图片描述
从上面可以看出来,根据配置持久化的 Segment 最终会存储到 Deep Storage 中,我们用的是 hdfs,所以是 hdfs 开头的逻辑。

实时消费 MQ 生成数据到 Segment 也有一套机制来保证数据被 exactly once。就算消费部分数据失败或者重启也会有相应的保障。这块逻辑这边就不细讲了,粗讲就是自己控制了 offset,如果消费成功并且落盘才会持久化到 zk 上,这样下次重启的时候就知道消费到哪了,而且文件和文件也有 CRC 的校验,CRC 也会存一份到注册中心,主要是减少读取文件造成的不必要损耗,直接用空间换时间来达到校验的目的,这个设计还是挺好的。很多数据库的比赛都可以借鉴这个机制。

总结

Table,Tenant 就暂时不在这讲解了,放到下一章,因为设计到的内容还是比较多,有实时表,离线表,混合表,索引这块,基本是围绕 Table 来做的。

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

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

相关文章

使用STM32进行串口实验(非中断+中断)

关于串口相关的基本知识可以看这篇文章https://blog.csdn.net/weixin_62599865/article/details/129963991?spm1001.2014.3001.5501 一.使用非中断的方式进行串口通信 串口发送/接收函数: HAL_UART_Transmit(); 串口发送数据,使用超时管理机制 HAL_…

2023最新版本Activiti7系列-Activiti7概述和入门案例

一、Activiti7概述 官网地址:https://www.activiti.org/ Activiti由Alfresco软件开发,目前最高版本Activiti 7。是BPMN的一个基于java的软件实现,不过Activiti 不仅仅包括BPMN,还有DMN决策表和CMMN Case管理引擎,并且有…

【前端 - HTML】第 1 课 - HTML 初体验

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 。 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、HTML 概念 2.1、HTML 定义 2.2、标签语法 3、HTML 基本骨架 4、标签的关系 5、注释 6、总结 1、缘起 最近在学习微信小程…

Apache Doris 冷热分层技术如何实现存储成本降低 70%?

在数据分析的实际场景中,冷热数据往往面临着不同的查询频次及响应速度要求。例如在电商订单场景中,用户经常访问近 6 个月的订单,时间较久远的订单访问次数非常少;在行为分析场景中,需支持近期流量数据的高频查询且时效…

C++ 使用一维数组和二维数组给 std::vector<cv::Point2d> 赋值的方法

文章目录 1. 一维数组给 vector 赋值的方法2. 一维 Point2d 数组给 vector<cv::Point2d> 赋值3. 二维 double 数组给 vector<cv::Point2d> 赋值 1. 一维数组给 vector 赋值的方法 &#xff08;1&#xff09;最简单的赋值方法是for循环遍历赋值&#xff0c;此处略过…

Python展开嵌套列表的五种方法

一、问题的提出 微信群中有人问&#xff0c;如何把以下内容转换成一个列表&#xff1a; 转换后&#xff1a; "[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C",&qu…

d2l学习_第二章预备知识

x.1 Data Manipulation 数据操作。在Pytorch中常用的数据操作如下&#xff1a; 对于张量&#xff0c;即torch.Tensor类型的数据&#xff0c;你的任何操作都要把他想象成一个指针&#xff0c;因为等于运算符ab&#xff0c;会将b的张量内存地址赋值给a。 torch.Tensor类型的基…

day02-JavaScript-Vue

1 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.5.1.3 JSON对象 自定义对象 在 JavaScript 中自…

linux(信号发送后)

目录&#xff1a; 1.引入什么是合适的时候 2.内核态和用户态 3.信号的处理 4.sigaction函数 -------------------------------------------------------------------------------------------------------------------------------- 1.引入什么是合适的时候 2.信号什么时候被处…

你真的会PPT配色吗?来看看这篇吧,瞬间让你的PPT高大上起来

本文档使用技巧如下截图 在色彩里使用其它填充颜色 选取这个“吸管” 用于吸别人的颜色 我曾经为了出一个“惊艳”的PPT,光吸管用了不下150次。 好的艺术家复制,伟大的艺术家偷窃!--毕加索 下面就给出几大常用配色 各位在使用时注意看这些“色卡”的规律,那就是反差色…

安卓系统浏览器开发

预置某个浏览器为系统默认的浏览器 描述: 当系统存在多个浏览器时&#xff0c;如何预置某个浏览器为系统默认的浏览器&#xff1f; 方法: 1.在PackageManagerService.java中的构造函数结尾添加&#xff1a;setDefaultBrowser(); 2.setDefaultBrowser()的具体实现&#xff…

TDengine 合作伙伴 +1,这次是「DaoCloud道客」

随着我国数字经济持续快速发展&#xff0c;各行各业都在积极拥抱云技术&#xff0c;上云成为企业加快数字化转型步伐的关键一步。在此过程中&#xff0c;越来越多的企业开始意识到云原生技术的重要性&#xff0c;利用云原生更快地开发和部署应用程序&#xff0c;提高应用程序的…

智慧信访大数据挖掘平台解决方案

TipDM数据挖掘建模平台由泰迪自主研发&#xff0c;面向大数据挖掘项目的工具。平台使用JAVA语言开发&#xff0c;采用B/S结构&#xff0c;用户不需要下载客户端&#xff0c;可通过浏览器进行访问。平台提供了基于Python、R以及Hadoop/Spark分布式引擎的大数据分析功能。平台支持…

人民大学加拿大女王大学金融硕士——为什么这么多人选金融行业呢

又是一年毕业季&#xff0c;越来越多的新人涌入职场&#xff0c;金融行业依然是择业人们的香饽饽。为什么大家会选金融行业呢&#xff1f;金融行业是一个充满挑战但也充满魅力的行业。在这个快节奏的行业中&#xff0c;人们不断地面对着机遇和挑战&#xff0c;而这个行业也为那…

TLD5097EL-ASEMI代理英飞LED驱动TLD5097EL

编辑&#xff1a;ll TLD5097EL-ASEMI代理英飞LED驱动TLD5097EL 型号&#xff1a;TLD5097EL 品牌&#xff1a;Infineon(英飞凌) 封装&#xff1a;SSOP-14-EP-150mil 类型&#xff1a;LED驱动、汽车芯片 TLD5097EL特性 输入电压范围宽&#xff0c;从4.5 V到45 V 极低关断…

【FATE联邦学习】FATE 自定义Trainer

背景 自己定义了模型后&#xff0c;需要自行定义训练方式。 这里文档给了方法&#xff0c;但是大部分还是需要自己看源码摸索。 https://fate.readthedocs.io/en/latest/tutorial/pipeline/nn_tutorial/Homo-NN-Customize-Trainer/https://fate.readthedocs.io/en/latest/tu…

如何按需下载和安装Win10补丁

如何按需下载和安装Win10补丁 一般我们都是通过系统自带的Windows更新来直接安装补丁&#xff0c;这种方式虽然方便&#xff0c;但是耗时久&#xff0c;而且更新体量也大&#xff0c;会占用很多空间&#xff0c;其实我们完全可以按需下载和安装&#xff0c;下面就给大家介绍方法…

FPGA量子类比机制-FPQA,将在量子运算设计中引发一场新的革命

1980年代现场可程式化逻辑门阵列(FPGA)的出现彻底改变了电子设计。大约40年后&#xff0c;现场可程式化量子位元阵列(FPQA)可望在量子运算电路设计中引发一场类似的革命。 1980年代现场可程式化逻辑闸阵列(FPGA)的出现彻底改变了电子设计。FPGA允许设计人员创建适合特定应用的…

3DCAT亮相糖酒会,为元宇宙展会提供实时云渲染支持

4月12日&#xff0c;第108届全国糖酒商品交易会&#xff08;下文简称“糖酒会”&#xff09;在成都正式开幕&#xff0c;吸引了众多酒类企业和行业人士的参与。 图片源自新华社 本次糖酒会上&#xff0c;某展会采用了“双线”模式&#xff0c;除了线下的实体展位&#xff0c;还…

burpsuite工具的使用(详细讲解)

一&#xff09;前言 我已经在之前详细的说明了burpsuite的安装过程&#xff0c;如果不了解的可以看 burpsuite安装教程 &#xff1a;http://t.csdn.cn/uVx9X 在这了补充说明一下&#xff0c;在安装完burpsuite并设置完代理后&#xff0c;会出现如果访问的url是使用http协议的…