【大数据】bigtable,分布式数据库的鼻祖

目录

1.概述

2.数据模型

3.API

4.架构

5.一个完整的读写过程

6.如何查找到要的tablet

7.LSM树


1.概述

本文是作者阅读完bigtable论文后对bigtable进行的一个梳理,只涉及核心概念不涉及具体实操,具体实操会在后续的文章中推出。

GFS的出现虽然解决了海量数据的存储问题,但是还是存在一个问题就是如果我存放的数据是结构化的,对结构化数据的使用往往是希望如关系型数据库一样,进行复杂的数据操作的。但是GFS并没有支持基于特定属性(如行键、列名、时间戳)的高效查询、更新、聚合等操作。自然就需要大数据版本的关系型数据库,这就是分布式数据库。

BigTable 是由 Google 开发的一款分布式数据存储系统,专为管理大规模结构化数据而设计,同GFS一样,bigtable是基于Google的具体业务需求而诞生的。

Google最核心的搜索业务,其会用爬虫的方式在整个互联网上爬取网页的信息然后存储起来供搜索引擎使用,也就是要存储海量的web索引。除此之外,Google还有Google Maps(地图)、Gmail(邮件)等应用也需要对海量结构化数据进行高效的查询、更新、聚合等操作。

bigtable基于GFS而来的,底层是用的GFS来进行数据存储。

BigTable 最初的概念和技术细节在 2006 年由 Google 研究人员发表的一篇同名论文《Bigtable: A Distributed Storage System for Structured Data》中公开。这篇论文详细阐述了 BigTable 的设计理念、数据模型、架构和实现细节,对后续的大数据存储技术产生了深远影响。

前面已经说过了bigtable在业务场景中要满足的需求,所以其设计目标总结起来无非就是:

  • 能扛住海量数据

  • 能灵活进行数据操作(增删改查)

能抗住海量数据:

能抗住海量数据无非就要办成两件事:

  • 是能存海量数据

  • 能高效的对海量数据进行读写

要存海量数据自然要有良好的伸缩性,能轻松的进行节点扩展,能支持TB甚至PB级别的数据存储,要有高可靠性,要进行高性能的海量数据的读写其实就要能进行并发的读写。这些要求谁能满足?GFS就能满足,所以bigtable底层就是用GFS来存储数据的。

能灵活进行数据操作

能对海量数据进行灵活的操作(增删改查)是bigtable的核心诉求。由于海量数据其实是交给GFS来扛的,所以前面的一点bigtable其实是不需要关心的,它要关心的是怎样用一个中间层来在GFS上面实现对数据进行灵活操作。在这个中间层里bigtable用了一套巧妙的数据组织逻辑来进行数据管理,从而实现了核心诉求。

bigtable采用一种基于行键(row key)、列族(column family)和时间戳(timestamp)的多维数据模型,允许用户以高效、灵活的方式组织和访问数据。

2.数据模型

bigtable中一条数据的数据模型(格式)如下:

(row:string,column:string,time:int64)->string

这样设计数据模型,将整行打散为单列,是为了实现数据的灵活操作,bigtable的核心诉求本来就是为了尽量实现数据的灵活操作,这样打散可以在更新的时候避免操作整个行(行数据还是蛮大的,毕竟在大数据的业务场景下逻辑表基本都是大表),而是精确的操作单个列,性能更好。

举个谷歌的业务场景的例子:

爬虫会爬回来的web索引以供搜索引擎使用,这些web索引对应的内容里,可能会经常变的也就是网站的首页,其它很少会变,精确的更新就显得很有价值了。

那么为什么会有时间戳喃?因为Google面对的业务数据大量都是有时序概念的,如爬虫爬回来的web索引,网页的内容是会随着时间改变的,除此之外地图邮件等数据也是有时序属性的。

以CSDN首页为例:

row:作者名

column:头像、简介、文章列表、个人成就等

如果我的主页简介改变了,就只需要新加新的简介的那一个KV对,那对新的KV对生成新的时间序列即可。

3.API

由于数据是分布式存储的,所以其实bigtable还是没办法办到像SQL一样灵活的对数据进行操作,其只能尽力的在GFS之上封装出一套完整的增删改查操作。bigtable支持以下类型的API:

  • 建表、删表

  • 单行数据的增删查,以及用删除和增加组合出来的修改效果,只对单行数据的增删具有ACID特性。

  • 范围查询

4.架构

bigtable架构中最核心的概念是tablet。存放tablet的节点在bigtable体系中叫做tablet server,一个tablet server中存放多个tablet。

bigtable在最底层把数据按照key进行排列后,进行分区,一个分区就是一个tablet,而一个tablet就是GFS中的一个文件。

tablet只是一个逻辑概念,并不直接存储数据,只是指代特定范围内的数据行。真正干活儿的是memtable和sstable以及下面的GFS。memtable是缓存,一个tablet对应着一个memtable,其中记录着当前节点的tablet中的所有数据(key值+数据指针)。为了容错和可靠,memtable每隔一段时间或者到了一定的阈值后会落磁盘进行持久化,持久化为SSTable,一个tablet存在多个SSTable,这样设计的目的是省去了新老sstable合并带来的额外磁盘IO拉低吞吐量,也可以起到数据版本记录的目的。

所以tablet server我们可以理解为长这个样子:

memtable和sstable中存放的什么内容:数据的key+数据存在 GFS 的哪个 DataNode 上

各个tablet server各自管理着一部分tablet信息,所以还需要一个全局的协调者(master节点)来负责记录下全局的:

哪些key在哪个tablet中,以及哪些tablet在哪些节点上。

所以综上所述整个bigtable的架构图如下:


最后这里问出一个核心的问题:

为什么要设计出tablet的概念喃?

这是因为在关系型数据库中数据量是没那么大的,在管理粒度上细到单个数据上是没什么问题的。因为当我们想用树形结构来进行查找上的性能优化的时候(索引)倒是没什么问题(B+树完全扛得住),但是在大数据系统中动辄上TB和PB的数据量级,仍然细到单个数据上这棵树形结构该有多深?多大?所以是扛不住的,最佳的方式当然是先用tablet来“分块”一下,树形结构直接管理到tablet层面即可,tablet内部再来进行自我的数据组织(内部再维护一种树形结构),这样就扛得住了,树也不会太深。

5.一个完整的读写过程

读取过程:

  • 客户端发起读请求: 客户端应用程序指定要读取的表名、行键(Row Key)以及(可选的)列族(Column Family)、列限定符(Qualifier)、时间戳范围等参数,构造一个读请求。

  • 查找 Tablet 位置: 客户端将读请求发送给 Bigtable 的 Master 节点。 Master 节点根据行键在 Tablet 分布图中查找对应的 Tablet 信息(包括 Tablet ID 和负责的 Tablet Server 地址)。

  • 转发读请求: Master 节点将查找到的 Tablet 位置信息返回给客户端。 客户端直接将读请求发送给对应的 Tablet Server。

  • Tablet Server 处理读请求: Tablet Server 接收到读请求后,根据请求参数在本地存储的 SSTable 文件和 Memtable 中查找数据。 若数据存在于 SSTable 文件: Tablet Server 通过 GFS API 查询 SSTable 文件的元数据,获取其内部数据块(chunk)在 GFS 集群中的分布信息。 根据数据块位置信息,通过 GFS API 从相应的 DataNode 读取所需数据块内容。 将读取到的数据块内容拼接成完整的数据项,返回给客户端。 如果数据存在于多个版本(不同时间戳),按需选择合适的版本返回。 如果数据跨越多个 SSTable 或 Memtable,可能需要进行多版本合并或筛选。

  • 响应客户端: Tablet Server 将查询结果打包成响应消息,发送回客户端。 客户端接收到响应后,解析并使用读取到的数据。

写入过程:

  • 客户端发起写请求: 客户端应用程序指定要写入的表名、行键、列族、列限定符以及值(Cell Value)和时间戳(默认为当前时间),构造一个写请求

  • 查找 Tablet 位置: 类似于读取过程,客户端首先将写请求发送给 Master 节点。 Master 节点查找对应的 Tablet 信息并返回给客户端。

  • 转发写请求: 客户端直接将写请求发送给对应的 Tablet Server。

  • Tablet Server 处理写请求: Tablet Server 接收到写请求后,将其写入内存中的 Memtable。 Memtable 刷写到 SSTable: 当 Memtable 达到一定大小或达到其他触发条件,Tablet Server 会触发 Memtable 刷写到本地磁盘,生成新的 SSTable 文件。 生成 SSTable 文件: Tablet Server 通过 GFS API 创建一个新的 SSTable 文件,并写入文件头、索引等元数据。 将 Memtable 中的数据按需排序,并组织成 SSTable 文件格式的数据块。 分散存储数据块: 将 SSTable 文件内部数据块(chunk)分散存储在 GFS 集群中: Tablet Server 通过 GFS API 将 SSTable 文件的数据块上传到 GFS 集群中的多个 DataNode。 GFS 根据其数据分布策略(如复制因子)自动将数据块复制到其他 DataNode,确保数据冗余和高可用。

  • 响应客户端: Tablet Server 完成写入操作后,向客户端发送确认消息,表示写入成功。

6.如何查找到要的tablet

在上一章节(第5章节)中我们大致聊了聊bigtable一次完整的读写过程,整个过程聊的粒度比较粗,这里面值得我们展开聊一聊的是在读写的时候如何准确的找到要的tablet。我们在读写的时候都是持有key值然后进来找其对应的tablet。这个找的过程是顺序遍历吗?肯定不是,大数据系统里面数据量这么多,顺序遍历性能肯定扛不住,所以在master上是维护着一个类树型的层级结构的:

树形结构与排列顺序:

  • 根节点:Root Tablet: 作为树的根节点,root tablet 是整个元数据层次结构的起始点。 它固定存储在一个已知的位置,如高度可靠的分布式锁服务(如 Chubby)中。

  • 中间节点:Metadata Tablets: 除 root tablet 外的 metadata tablets 可以看作是树的中间节点。 这些节点按照某种规则(如基于 tablet 行键范围的划分)组织成多层结构,形成一个分层的索引系统。 每个中间节点(metadata tablet)负责存储其子节点(通常是更低层级的 metadata tablets 或 user table tablets)的位置信息。

  • 叶子节点:User Table Tablets: User table tablets 作为树的叶子节点,代表实际存储用户数据的tablet。 它们没有进一步的子节点,每个叶子节点直接关联到一个具体的 user table tablet,包含其行键范围和 TabletServer 地址。

Metadata Tablet可以理解为专门用来在这个类树形结构里维护这个类树形结构的,用来维护好真正负责数据存储的user tablet在整个类树形结构中所处位置,便于进行高效的读写。

层级遍历:

  • 从根出发: 客户端首先访问 root tablet,获取到第一级 metadata tablets 的位置信息。

  • 逐层深入: 对于每一级 metadata tablets,客户端按照某种顺序(如行键范围的字典序)遍历它们,查询其中存储的子节点(下一级 metadata tablets 或 user table tablets)的位置信息。 如果子节点是 user table tablets,则定位完成;如果子节点是下一级 metadata tablets,则继续深入下一层进行遍历。

  • 定位目标: 在遍历过程中,客户端根据待查询或写入的行键,判断其所属的行键范围是否与当前遍历到的 tablet 匹配。 当找到包含目标行键范围的 user table tablet 时,遍历结束,此时客户端已经确定了目标tablet的位置。

7.LSM树

这里留个尾巴,前面一个章节我们说了在找具体的tablet的时候为了查找效率会维护着一个类树形的结构,那么作为直接负责数据存储的user tablet,其内部在进行数据查找的时候肯定也不是通过顺序遍历来实现的,也是有一定的数据结构来保证查找效率的,这就是LSM树,下一篇文章我们将聊一聊LSM树。

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

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

相关文章

指针专题(2)

前言 上一节我们学习了指针的相关内容,本节我们继续学习指针专题,更加深入的了解指针,那么废话不多说,我们正式进入今天的学习 1.对数组名的深入理解 在上一节的内容中,我们提到了用指针来访问数组的操作&#xff0c…

Linux 基于 TCP 协议的简单服务器-客户端应用

目录 一、相关函数 1、listen() 2、accept() 3、connect() 4、两种IP地址转换方式 5、TCP和UDP数据发送和接收函数对比 5、log.hpp自定义记录日志 二、udp_server.hpp单进程版本 三、tcp_server.cc 四、Telnet客户端(代替tcp_client.cc) 五…

ColBERT和ColBERTv2:兼具Bi-encoder和cross-encoder优势的多向量排序模型

文章目录 简介ColBERTColBert 原理ColBERT如何训练ColBERT 如何使用离线索引用ColBERT 实现top-k Re-ranking用ColBERT 实现top-k 端到端的检索 ColBERTv2ColBERTv2原理SupervisionRepresentation IndexingRetrieval 总结参考资料 简介 ColBERT是一种多向量排序模型&#xff0…

数据分析案例-中国黄金股票市场的EDA与价格预测

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Redis的Stream 和 实现队列的方式【List、SortedSet、发布订阅、Stream、Java】

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB,订阅/发布模式基于Stream类型的实现与Java的集成 消息队列问…

算法打卡day39

今日任务: 1)卡码网57. 爬楼梯(70. 爬楼梯进阶版) 2)322.零钱兑换 3)279.完全平方数 4)复习day14 卡码网57. 爬楼梯(70. 爬楼梯进阶版) 题目链接:57. 爬楼梯…

ipv4Bypass:一款基于IPv6实现的IPv4安全绕过与渗透测试工具

关于ipv4Bypass ipv4Bypass是一款基于IPv6实现的安全绕过与渗透测试工具,该工具专为红队研究人员设计,可以帮助广大研究人员通过IPv6绕过目标安全策略,以此来检测安全检测机制的健壮性。 20世纪90年代是互联网爆炸性发展时期,随着…

Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?

“有史以来最强大的开源大模型”Llama 3引爆AI圈,马斯克点赞,英伟达高级科学家Jim Fan直言,Llama 3将成为AI大模型发展历程的“分水岭”,AI顶尖专家吴恩达称Llama3是他收到的最好的礼物。 4月18日,AI圈再迎重磅消息&a…

写一个uniapp的登录注册页面

目录 一、效果图 二、代码 1、登录 (1)页面布局代码 (2)逻辑实现代码 (3)css样式 2、注册 (1)页面布局代码 (2)逻辑实现代码 (3&#x…

一个完全用rust写的开源操作系统-Starry

1. Starry Starry是2023年全国大学生计算机系统能力大赛操作系统设计赛-内核实现赛的二等奖作品。Starry是在组件化OS的arceos的基础上,进行二次开发的操作系统内核,使用宏内核架构,能够运行Linux应用的内核。 原始的操作系统大赛的仓库为 …

51-42 NÜWA:女娲,统一的多模态预训练模型

21年11月,微软、北大联合发布了NUWA模型,一个统一的多模态预训练模型,在 8 个下游任务上效果惊艳。目前该项目已经发展成为一系列工作,而且都公开了源代码。 Abstract 本文提出了一种统一的多模态预训练模型N̈UWA,该…

【精简改造版】大型多人在线游戏BrowserQuest服务器Golang框架解析(1)——功能清单

1.匿名登录 2.服务连接 3.新手引导 4.随机出生点 5.界面布局 6.玩法帮助 7.NPC会话 8.成就系统 9.成就达成 10.用户聊天 11.战斗&信息展示 12.药水使用 13.副本传送 14.玩家死亡 15.超时断开

实验:使用FTP+yum实现自制yum仓库

实验准备 FTP服务器端:centos-1(IP:10.9.25.33) 客户端:centos-2 两台机器保证网络畅通,原yum仓库可用,已关闭防火墙和selinux FTP服务器端 ①安装vsftpd并运行,设定开机自启动 安装vsftpd…

金融数字化能力成熟度指引

1 范围 本文件提出了金融数字化能力成熟度模型、成熟度计算方法,明确了不同维度金融数字化转型能力 相应的分档要求。 本文件适用于金融机构衡量金融科技应用和数字化转型发展水平,检视自身数字化发展优势与短板, 加快数字化转型&#xff0c…

金蝶云星空和金蝶云星空单据接口对接

金蝶云星空和金蝶云星空单据接口对接 来源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台。K/3Cloud支持的协同应用包括但…

Linux Makefile

1.开发背景 linux 下编译程序需要用到对应的 Makefile,用于编译应用程序。 2.开发需求 编写 Makefile 编译应用程序 1)支持多个源文件 2)支持多个头文件 3)支持只编译修改的文件,包括源文件和头文件 4)支持…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算(判断) 1~100中哪些是素数、哪些是合数。 素数也称为质数,是只能被1及其自身整除的自然数。与素数相对应的是合数,合数可以被分解为若干个素数的乘积,这些素数称为这个合数的质…

数据结构从入门到实战——顺序表的应用

目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁 2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息 2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中 2.9…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch(先看四!先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

【图解计算机网络】网络协议分层解析

网络协议分层解析 网络协议分层应用层传输层网络层数据链路层 TCP/IP分层模型通讯示例 网络协议分层 网络协议分层一共有OSI七层网络协议,TCP/IP四层网络网络协议,还有五层网络协议。 七层由于分层太多过于复杂,实际应用中并没有使用&#x…