Google BigTable架构详解

news2024/11/18 6:48:07

文章目录

    • 什么是BigTable?
      • 架构图
      • 一、整体架构
      • 二、数据存储与索引
        • 存储模型
      • 三、数据拆分与存储
      • 四、元数据管理
      • 五、读写流程
    • 其他内容概览
      • 负载平衡
      • 其他存储和数据库选项

什么是BigTable?

Bigtable是Google开发的一个高性能、可扩展的分布式存储系统,用于管理大规模的结构化数据。其架构设计充分考虑了数据的可扩展性、可靠性和高效性。以下是Bigtable架构的详细说明:

架构图

BigTable简化架构图

一、整体架构

Bigtable的整体架构由三个核心组件构成:客户端库(Client Library)、主服务器(Master Server)和多个子表服务器(Tablet Server)。此外,它还依赖于Google File System(GFS)作为底层存储系统,以及Chubby作为分布式锁和目录服务。

  1. 客户端库

    • 提供了用户与Bigtable系统进行交互的接口。
    • 负责将用户的请求转化为系统可以理解的操作,并将结果返回给用户。
    • 处理一些基本的错误检查和重试逻辑,以提高系统的健壮性。
  2. 主服务器

    • 整个Bigtable系统的核心,负责管理所有的子表服务器。
    • 维护数据的一致性,并处理客户端的请求。
    • 负责数据的负载均衡和故障恢复,确保整个系统的稳定性和可用性。
  3. 子表服务器

    • 实际存储数据的组件,每个子表服务器都负责管理一部分数据。
    • 这些数据被划分成多个子表(Tablet),每个子表都是一个连续的、不可变的、持久化的、有序的数据集合。
    • 负责处理针对其所管理数据的读写请求,并与主服务器协同工作,以确保数据的一致性和完整性。

二、数据存储与索引

Bigtable的数据模型是一个稀疏的、分布式的、持久化的多维有序映射表。这个映射表的索引由行键(Row Key)、列键(Column Key)和时间戳(Timestamp)三个维度构成。数据以单元格(Cell)的形式存储,每个单元格都可以通过这三个维度的组合来唯一确定。

存储模型

存储模型

如图所示,所有客户端请求都是先经过前端服务器,然后再发送到 Bigtable 节点。(在原始语言中 这些节点称为“片服务器”)。通过 这些节点被整理成一个 Bigtable 集群,而 Bigtable 实例,即集群的容器。

Bigtable 表被分成多个连续的行块(称为片),旨在帮助平衡查询工作负载。(片类似于 HBase 区域。)片以 SSTable 格式存储在 Google 的文件系统 Colossus 上。SSTable 提供了一种持久、有序且不可变的键值对映射,其中键和值都可以是任意的字节字符串。每块平板电脑 与特定的 Bigtable 节点相关联。除了 SSTable 文件后,所有写入内容都会在写入后立即存储在 Colossus 的共享日志中 获得 Bigtable 确认,因而提高了耐用性。
重要的是,数据永远不会存储到 Bigtable 节点本身;每个节点都有指向 Colossus 中所存储的一组片的指针。因此:

  • 由于 不会复制实际数据Bigtable 会更新 每个节点的指针
  • 您可以快速从 Bigtable 节点故障中进行恢复,因为 只有元数据必须迁移到替换节点。
  • 当 Bigtable 节点发生故障时,任何数据都不会丢失。
  1. 行键

    • 可以是任意的字节串,这为用户提供了极大的灵活性。
    • 数据按照行键进行排序存储,以支持高效的扫描操作。
  2. 列键

    • 用于区分同一行中的不同数据字段。
    • 列键被组织成列族(Column Family),每个列族可以包含多个列。
  3. 时间戳

    • 用于记录数据的版本信息,支持数据的多版本并发控制。
    • 时间戳可以由Bigtable自动赋值,也可以由客户端显式指定。

三、数据拆分与存储

为了实现集群的可扩展性,Bigtable以行键范围对数据拆分片存储,每个分片叫Tablet。每个Tablet是相同行键前缀的数据集合。Tablet服务器负责处理至少一个或多个Tablet分片,并将数据持久化到GFS中。

  1. Tablet的分配与管理

    • 主服务器负责给Tablet分配Tablet服务器,并管理Tablet服务器的状态等集群状态相关的工作。
  2. 数据的持久化

    • Tablet服务器使用GFS作为底层存储系统,将数据以LSM(Log-Structured Merge-tree)方式存储。
    • 每个Tablet服务器使用一个WAL(Write-Ahead Logging)日志文件,用来记录接收的所管理分片的数据写入;然后将数据插入到内存中;当内存中数据达到上限,就会写入到对应的Tablet分片的新sst文件中。

四、元数据管理

Bigtable的元数据也是按Tablet方式分片、分级存储的。在Chubby中只记录顶级元数据的Tablet位置或文件名,然后通过级联二级元数据的Tablet,最终可以定位到用户数据的Tablet。每个Tablet服务器维护一个或多个Tablet分片,并处理后台sst的合并等操作。

五、读写流程

  1. 写流程

    • 客户端通过客户端库发送写请求到主服务器。
    • 主服务器将写请求转发到相应的Tablet服务器。
    • Tablet服务器将数据写入到内存中的MemTable,并同时写入到WAL日志文件中以保证数据的持久性。
    • 当MemTable达到一定大小时,会被冻结并生成一个新的SSTable文件,然后写入到GFS中。
  2. 读流程

    • 客户端通过客户端库发送读请求到主服务器。
    • 主服务器将读请求转发到相应的Tablet服务器。
    • Tablet服务器首先在内存中查找数据,如果找不到则去SSTable文件中查找。
    • 如果SSTable文件中也没有找到数据,则返回查找失败的结果给客户端。

综上所述,Bigtable的架构设计充分考虑了数据的可扩展性、可靠性和高效性。通过分布式架构、面向列的数据模型、稀疏性设计以及元数据管理等机制,Bigtable能够高效地处理大规模数据集,满足各种复杂的应用需求。

其他内容概览

负载平衡

每个 Bigtable 区域都是由一个主实例进程管理,该进程可使集群内的工作负载和数据量达到平衡。此过程会拆分成较繁忙或更大的区域 将不常用的平板电脑/较小的平板电脑合并在一起, 根据需要在节点之间重新分配它们。如果某个片遇到流量高峰,Bigtable 会先将该片拆分成两部分,然后再将其中一个新片移至另一个节点。Bigtable 可自动管理拆分、合并和再平衡操作,从而节省了手动管理片的工作量。了解性能部分详细介绍了此过程。

为了使 Bigtable 达到最佳写入性能,请尽可能均匀地在各节点间分配写入操作,这一点非常重要。实现这一目标的方法之一 目标是使用不遵循可预测顺序的行键。例如,用户名在整个字母表中的分布往往是大致均匀的,因此将用户名包含在行键的开头位置通常会使写入操作得到均匀分布。

同时,对相关行进行分组以使它们彼此相邻也很有用,这可让您更高效地同时读取多个行。例如,如果您要存储一段时间内不同类型的天气数据,您可以在行键中依次添加收集了这些数据的位置和时间戳(例如 WashingtonDC#201803061617)。这种类型的行键会将来自一个位置的所有数据组织成连续范围的行。对于其他位置,所属的行将以不同的标识符开头;如果有多个位置都在以相同速率收集数据,那么写入操作仍然会均匀分布到各片之中。

其他存储和数据库选项

Bigtable 不是关系型数据库,不支持 SQL 查询联接多行事务

  • 需要对联机事务处理 (OLTP) 的全面 SQL 支持 系统请考虑使用 Spanner 或 Cloud SQL。
  • 如果您需要在一个在线分析处理 (OLAP) 系统中进行互动式查询,请考虑使用 BigQuery。
  • 如果您必须在文档数据库中存储高度结构化的对象, 支持 ACID 事务和类似 SQL 的查询,请考虑 Firestore。
  • 如需低延迟的内存中数据存储,请考虑使用 Memorystore。
  • 要实时同步用户之间的数据,可考虑使用 Firebase Realtime 数据库。

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

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

相关文章

Error running Application.Command line is too long

问题解析 本质上就是执行启动类Application的时候,执行的指令太长了,所以运行失败。 解决方案 1.打开Edit Configuration。 2.点击Modify options 3.勾选 Shorten command line 4.选择classpath file。 最终解决问题。

深入理解包管理工具

目录 引入npm配置文件常见属性版本理解package-lock.jsonnpm install其他命令发布自己的包 yarncnpmnpxpnpm安装和使用硬链接和软链接非扁平node\_modules存储store 引入 随着前端技术的发展,项目依赖的第三方库和工具越来越多(例如:React、V…

信用卡验证-卢恩算法

卢恩算法 什么是 Luhn 算法? Luhn算法,也称为“模10算法”,是一种用于确定用户提供的标识号是否准确的公式。它广泛应用于验证信用卡号码以及其他数字序列,例如政府的社会安全号码 (SSN)。如今,Luhn算法是电子支付系…

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HandlerInter…

OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面

目录 前端创建页面的开发一 创建一个路由 用acro design写 前端创建页面的开发二 题目管理页面 搜索 最終效果 题目更新页面的开发 携带参数的那种 修改路由 页码更新细节 我们先处理菜单项的权限控制和权限隐藏 在这里改 属性绑定一个函数 可以参考聚合搜索项目…

金属增材制造咋突破?纳米纹理粉末如何助力金属增材制造?

大家好,今天我们来了解一篇金属增材制造文章——《High absorptivity nanotextured powders for additive manufacturing》发表于《Science Advances》。金属增材制造在医疗、航空航天等领域,它潜力巨大,但目前可打印的金属材料有限&#xff…

word中的表格全部设置宽度100%

1、背景 我们用工具将数据库或其他的数据导出成word时,表格有的会大于100%,超过了边界。word没有提供全局修改的方法。如果我们想改成100%。 一种方式是通过宏,全局改。一种是手动改。 2、宏修改 如果表格多,可以通过这种方式。…

文献阅读——基于拉格朗日乘子的电力系统安全域边界通用搜索方法

摘要 为提升电力系统安全域(security region,SR)的构建效 率,提出一种基于拉格朗日乘子(Lagrange multiplier,LM) 的电力系统安全域边界(security region boundary,SRB)通用搜索方法。 首先,根据电力系统静态安全性问…

15.面试算法-树基础

1. 树基础 树在工程中有非常广泛的应用,在算法中也是一个极为庞大的体系,我们前面链表的文章中说过“没学会反转,链表相当于白学”,现在再加一句“没学会树的问题,算法相当于没学”。 本文我们将系统地学习相关问题。…

PLC程序加密的一种方法(密钥授权管理程序)

引文: 前段时间有客户跟我说,他们客户到期没有打款,所以想在PLC中开发一套授权管理程序,这样可以根据实际情况,给予客户不同的授权; 探讨: PLC怎么实现程序授权管理! 对于国内工程师…

五星级可视化页面(28):3D园区—模型与数据的完美结合。

将园区3D模型和数据图表结合起来形成高大上的可视化效果有以下几方面的意义: 1. 提升信息表达效果: 通过将园区3D模型和数据图表结合,可以更生动地展现园区的空间结构和布局,同时将数据图表融入其中,直观地展示园区各…

Redis实战--Redis集群的搭建与使用

Redis是一个开源的高性能key-value数据库,它以其出色的性能和丰富的特性而广受欢迎。随着业务的发展,单机Redis可能无法满足大规模数据存储和高并发访问的需求。这时,Redis集群就显得尤为重要。本文将详细介绍Redis集群的概念、搭建过程以及使…

进阶美颜功能技术开发方案:探索视频美颜SDK

视频美颜SDK(SoftwareDevelopmentKit)作为提升视频质量的重要工具,越来越多地被开发者关注与应用。接下俩,笔者将深入探讨进阶美颜功能的技术开发方案,助力开发者更好地利用视频美颜SDK。 一、视频美颜SDK的核心功能 …

【CSS in Depth 2 精译_039】6.3 CSS 定位技术之:相对定位(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…

IDEA插件:Maven Helper插件强势优化【某个依赖包被哪些maven项目模块引用,快速定位】体验真好!

背景: 开发的项目是maven多模块,子模块数量多,已经超过10个。 而且经常会被扫描漏洞,并进行依赖包升级。 在使用过程中,发现MavenHelper插件和IDEA自带的Analyze Dependencies都有个缺点:只能是单个模块…

【C++笔试强训】如何成为算法糕手Day3

​ 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题:除2! 第二题:dd爱框框 第三题:简写单词 第一题:除2! 牛客网…

前端独立实现页面是否有发布

1、自动更新js (AutoUpdate.js) import { Modal } from "antd"let lastSrcs; const scriptReg /\<script.*src["](?<src>[^"])/gm; async function extractNewScripts() {const html await fetch(/?_timnestamp Date.now()).then(res > …

追随 HarmonyOS NEXT,Solon v3.0 将在10月8日发布

Solon &#xff08;开放原子开源基金会&#xff0c;孵化项目&#xff09;原计划10月1日发布 v3.0 正式版。看到 HarmonyOS NEXT 将在 10月8日启用公测&#xff0c;现改为10月8日发布以示庆贺。另外&#xff0c;Solon 将在2025年启动“仓颉”版开发&#xff08;届时&#xff0c;…

(11)(2.1.2) DShot ESCs(四)

文章目录 前言 6 混合ESC协议 7 IOMCU DShot限制 8 参数说明 前言 DShot 是一种数字 ESC 协议&#xff0c;它允许快速、高分辨率的数字通信&#xff0c;可以改善飞行器控制&#xff0c;这在多旋翼和 quadplane 应用中特别有用。 6 混合ESC协议 虽然 ArduPilot 自动驾驶仪…

Redis 为什么用跳表实现有序集合

近几年针对 Redis 面试时会涉及常见数据结构的底层设计&#xff0c;其中就有这么一道比较有意思的面试题&#xff1a;“Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡树、红黑树或者 B树&#xff1f;”。 本文就以这道大厂常问的面试题为切入点&#xff0c;带大家…