Google BigTable架构详解
文章目录
- 什么是BigTable?
- 架构图
- 一、整体架构
- 二、数据存储与索引
- 存储模型
- 三、数据拆分与存储
- 四、元数据管理
- 五、读写流程
- 其他内容概览
- 负载平衡
- 其他存储和数据库选项
什么是BigTable?
Bigtable是Google开发的一个高性能、可扩展的分布式存储系统,用于管理大规模的结构化数据。其架构设计充分考虑了数据的可扩展性、可靠性和高效性。以下是Bigtable架构的详细说明:
架构图
一、整体架构
Bigtable的整体架构由三个核心组件构成:客户端库(Client Library)、主服务器(Master Server)和多个子表服务器(Tablet Server)。此外,它还依赖于Google File System(GFS)作为底层存储系统,以及Chubby作为分布式锁和目录服务。
-
客户端库:
- 提供了用户与Bigtable系统进行交互的接口。
- 负责将用户的请求转化为系统可以理解的操作,并将结果返回给用户。
- 处理一些基本的错误检查和重试逻辑,以提高系统的健壮性。
-
主服务器:
- 整个Bigtable系统的核心,负责管理所有的子表服务器。
- 维护数据的一致性,并处理客户端的请求。
- 负责数据的负载均衡和故障恢复,确保整个系统的稳定性和可用性。
-
子表服务器:
- 实际存储数据的组件,每个子表服务器都负责管理一部分数据。
- 这些数据被划分成多个子表(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 节点发生故障时,任何数据都不会丢失。
-
行键:
- 可以是任意的字节串,这为用户提供了极大的灵活性。
- 数据按照行键进行排序存储,以支持高效的扫描操作。
-
列键:
- 用于区分同一行中的不同数据字段。
- 列键被组织成列族(Column Family),每个列族可以包含多个列。
-
时间戳:
- 用于记录数据的版本信息,支持数据的多版本并发控制。
- 时间戳可以由Bigtable自动赋值,也可以由客户端显式指定。
三、数据拆分与存储
为了实现集群的可扩展性,Bigtable以行键范围对数据拆分片存储,每个分片叫Tablet。每个Tablet是相同行键前缀的数据集合。Tablet服务器负责处理至少一个或多个Tablet分片,并将数据持久化到GFS中。
-
Tablet的分配与管理:
- 主服务器负责给Tablet分配Tablet服务器,并管理Tablet服务器的状态等集群状态相关的工作。
-
数据的持久化:
- Tablet服务器使用GFS作为底层存储系统,将数据以LSM(Log-Structured Merge-tree)方式存储。
- 每个Tablet服务器使用一个WAL(Write-Ahead Logging)日志文件,用来记录接收的所管理分片的数据写入;然后将数据插入到内存中;当内存中数据达到上限,就会写入到对应的Tablet分片的新sst文件中。
四、元数据管理
Bigtable的元数据也是按Tablet方式分片、分级存储的。在Chubby中只记录顶级元数据的Tablet位置或文件名,然后通过级联二级元数据的Tablet,最终可以定位到用户数据的Tablet。每个Tablet服务器维护一个或多个Tablet分片,并处理后台sst的合并等操作。
五、读写流程
-
写流程:
- 客户端通过客户端库发送写请求到主服务器。
- 主服务器将写请求转发到相应的Tablet服务器。
- Tablet服务器将数据写入到内存中的MemTable,并同时写入到WAL日志文件中以保证数据的持久性。
- 当MemTable达到一定大小时,会被冻结并生成一个新的SSTable文件,然后写入到GFS中。
-
读流程:
- 客户端通过客户端库发送读请求到主服务器。
- 主服务器将读请求转发到相应的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 数据库。
相关文章:

Google BigTable架构详解
文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统,用于管理大规模…...

【python】如何切换ipynb的kernel至指定conda环境
需求介绍 打开(若无新建环境) 环境 conda env list conda activate cvml conda install ipykernel python -m ipykernel install --name cvml 以上完成后,打开jupyter 创建一个python文件 在kernel——>change kernel——>python[conda env:cvml] 参考资料…...
Linux【基础指令汇总】
目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…...
SpringCloud-EurekaClient
创建Module pom.xml <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> spring:application:name: provider # 应用程序的名称,…...
配置Scrapy项目
配置Scrapy项目是一个涉及多个步骤的过程,在上一篇博客中已经写了安装Scrapy、创建Scrapy项目的步骤。 接下来应该定义Item类、编写爬虫程序以及配置settings.py文件等。以下是一个详细的配置Scrapy项目的步骤: 一、定义Item类 在项目目录下…...

航顺芯片HK32MCU受邀出席汽车芯片国产化与技术创新闭门研讨会
[中国,北京,2024年9月21日]近日,深圳市航顺芯片技术研发有限公司(以下简称“航顺芯片”)产品总监郑增忠受邀出席由中国设备管理协会新能源汽车产业发展促进中心主办的“汽车芯片国产化与技术创新闭门研讨会”。 会上航…...
【深度学习】(6)--图像数据增强
文章目录 图像数据增强一、作用二、增强方法三、代码体现四、增强体现 总结 图像数据增强 数据增强(Data Augmentation),也称为数据增广,是一种在机器学习和深度学习中常用的技术,它通过对现有数据进行各种变换和处理…...
Vscode 远程切换Python虚拟环境
在VSCode中远程切换Python虚拟环境是一个涉及多个步骤的过程,包括安装必要的扩展、连接到远程服务器、创建或激活虚拟环境,并在VSCode中选择相应的Python解释器。以下是一个详细的步骤指南,包括代码示例,旨在帮助我们完成这一过程…...
Sqoop面试整理
Sqoop(SQL-to-Hadoop)是一个用于在Hadoop和关系型数据库之间传输数据的工具。以下是一些可能在Sqoop面试中会被问到的问题及其答案: 1. 什么是Sqoop?为什么使用它? 回答: Sqoop是一个用来在Hadoop和关系型数据库(如MySQL、Oracle、PostgreSQL等)之间高效传输大数据的工具…...

PyCharm 的安装和配置
环境要求: OS:Windows / macOS / Linux (此处使用 Windows 10 进行演示)Python:包括但不限于 Anaconda,miniconda,Python。在 Windows 下只要能找到 python.exe 即可 Download 进入 PyCharm 官网,选择对…...
【工具类:FastJsonRedisSerializer】
工具类:FastJsonRedisSerializer 依赖yml文件FastJsonRedisSerializer.java 依赖 <!-- 主要用于处理 JSON 数据的序列化和反序列化--><!-- 序列化:将对象转换为一种可以存储或传输的格式(如 JSON、XML、二进制等)…...

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】
Spring Cloud Alibaba-(1)搭建项目环境 Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-(3)OpenFeign【服务调用】 Spring Cloud Alibaba-(4)Sen…...

芯科科技2024年Works With开发者大会登陆上海,物联网和人工智能的变革性融合带来无限精彩
谷歌、三星等生态大厂将带来重磅演讲和圆桌讨论,亦可切身体验多样化无线技术实作 中国,北京 – 2024年9月25日 – 安全、智能无线连接技术领域的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)&a…...

华为OD机试 - 匿名信(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
Python习题 208:将二维列表数组转置
(编码)将以一下二维列表类型的数组 matrix 进行转置(注:不能用内置标准库及三方库)。 matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] 转置结果 [[1, 4, 7], [2, 5, 8], [3, 6, 9]] matrix = [[1, 2, 3],[4...
STM32F407HAL库输出互补PWM波以及死区时间计算
互补PWM波配置 STM32F407VET6的高级定时器TIM1、TIM8可以生成互补的PWM波,用HAL库配置非常方便。 我们使用高级定时器TIM1,选择一个通道(我这里选择通道二),然后选择PWM Generation CH2 CH2N。这里N的意思是互补&…...
matlab-对比两张图片的RGB分量的差值并形成直方图
%对比两张图片的RGB分量的差值并形成直方图,改个路径就能用,图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); R1I1(:,:,1); G1I1(:,:,2); B1I1(:,:,3); R2I2(:,:,1…...

SpringBoot集成Matlab软件实战
在项目中处理矩阵等复杂数据结构的时候,可以用Matlab程序来运行,其优点是很多的。 专用工具箱和强大的矩阵运算能力:MATLAB 拥有强大的数学工具箱和优化工具箱,适合处理大规模矩阵运算以及水文模型的率定。MATLAB 的 Optimization…...

Java---异常及处理
一.异常 1.概念 程序的非正常执行。高级语言都有异常处理机制(C,Java) 2.一般处理异常的方法 Scanner sc new Scanner(System.in);System.out.println("请输入一个数字:");String s sc.nextLine();if (s.matches("[0-9]&qu…...

【开源免费】基于SpringBoot+Vue.JS网上购物商城(JAVA毕业设计)
本文项目编号 T 041 ,文末自助获取源码 \color{red}{T041,文末自助获取源码} T041,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...