Bigtable阶段性总结(版本1)
Bigtable的角色:为大规模的结构化数据提供高效的存储、管理与查询。
Bigtable的针对性:
- 大规模数据需要大规模集群支持,带来了存储、管理、查询、容错上的复杂性。
- 关系型数据库在数据规模较大时复杂性迅速上升,效率大幅下降。
Bigtable的特点:
- 只支持简单的数据模型,所有key和value都是字符串,具体含义由用户自行解释。
- 运行时可单独为每行调整布局。
- 根据key排序,且相近的key处于相近的位置,用户可由此推断局部性。
- 底层存储平台为GFS,无须担心数据的存储问题。用户也可指定将数据存储在内存中。
- 由Chubby提供分布式环境下的锁机制,对Chubby有依赖性。
Bigtable的逻辑结构:
- 数据按行key排序,相近的行数据也相近。行中的每个读/写操作都是原子的。
- 每个table可分为若干个行范围,每个范围称为一个tablet,是数据分布与均衡的单位。
- 行内的列可分为若干个列族。列族需要在列之前创建,数量不能太多,而列的数量则没有限制。
- 列的标识符格式为“列族:标识名”。列族也是访问控制、资源统计的单位。
- 每个列族可单独设定最多保存的版本数或时间长度。
- 查找时的key可为行或行+列,等等(猜测)。
Bigtable的组织结构:
- Bigtable与GFS处于同一集群内,也是单master的结构。
- master负责:
- 给tablet server指定tablet。
- 追踪所有加入和退出的tablet server。
- 针对tablet server平衡负载。
- 进行GFS的垃圾回收。
- 建立表或列族等改变表模式的操作。
- tablet server:
- 可在运行时动态加入或退出。
- 负责管理若干tablet,在tablet太大时将其分裂。
- client:
- 读写操作直接与tablet server通信,不经过master。
- 会缓存tablet的位置信息。
Bigtable的存储结构:
- 所有tablet的位置信息存储在METADATA表中。查找一个tablet的位置需要通过一个3层的类似B+树的结构:
- 首层是Chubby中的一个文件,它储存METADATA的第一个tablet即root tablet的位置。
- root tablet永远不会分裂,以保持3层结构。它保存后面的所有tablet的元信息,如位置、行key范围等(此句不确定,自己的猜测)。
- METADATA的其它tablet负责保存用户tablet的元数据(位置、范围、日志等)。tablet的位置信息都在内存中。
- client发起的一次成功的查找需要3次网络通信,而若缓存失效,则最多需要6次(前3次发现缓存失效)。
- 每个tablet会维持若干个memtable(猜测:每个列族一个memtable),对tablet的读写操作会先反映到memtable上。memtable会在某些条件触发时(猜测:体积或更新次数达到阈值)将内容写入GFS。
- tablet在GFS中的基本存储单位是SSTable,它提供一种不可改且排序的key/value映射。每个SSTable由多个排序的block组成,SSTable的最后就是各block的索引,在SSTable打开时索引就在内存中,查找时先在内存中定位到block。
- tablet内的各SSTable间为乱序,查找时需要依次查找每个SSTable,因此在SSTable数量达到阈值后要分裂。
master对tablet server的追踪:
- 每个tablet server都会在Chubby的指定文件夹下持有一个唯一的文件并上锁。在失去锁后,若文件存在,则尝试重上锁;若文件不存在或上锁失败若干次,则放弃对tablet的管理并自杀。tablet server退出前也会释放锁。
- 在生命期中master会监视Chubby文件夹中的文件。若新增文件,则表明有新tablet server。若master获得了已有文件的锁,说明对应的tablet server错误,则master会删除此文件并将其管理的tablet标记为未分配。
- master在运行中也会定期询问tablet server的状态,若无回应若报告失去锁,则视其为错误。
master对tablet的追踪
- master在启动后会试图获取Chubby中唯一的master锁。随后master扫描Chubby指定文件夹下的文件,获取当前活跃的tablet server的列表,并询问每个tablet server所管理的tablet列表。
- master随后查找root tablet的位置,并将其加入未分配的tablet集合。从root tablet开始,master扫描整个METADATA,并记录所有未分配的tablet。
- 在tablet server分裂tablet时,tablet server首先修改METADATA,然后通知master。若master丢失此通知,则会在与tablet server通信时发现分裂的tablet(这里不太懂)。
日志:
- 对tablet的写操作会首先检查操作的完整性,并对比Chubby中有写权限的用户列表来检查合法性,再写入日志。
- 新的更新会存在memtable中,memtable会定期写入SSTable,其中包含当时日志的指针。
- 每个tablet server的所有tablet共用一个日志,可以减少产生的文件数,但在恢复时需要的操作比较多。
- 每个tablet server有两个写日志的线程,同时只有一个活跃,在活跃线程写性能低于阈值时切换为另一个。
tablet数据管理:
- memtable的大小达到阈值时会冻结memtable,创建新的memtable,并将旧memtable的内容写入SSTable,称为minor compaction。目的是减少内存使用和恢复数据时需要读取的日志量。
- master定期会发起major compaction,即将若干个SSTable和memtable中的有效记录合并为一个SSTable,并丢弃输入的旧SSTable。可以回收资源,还能保证已删除数据的存活时间不会太长。
- 多个列族可合并成一个局部组,每个局部组会生成单独的SSTable,也可以单独设定为存放在内存中(如METATABLE中的位置信息)。
- 每个SSTable可以单独指定压缩。常用的是一种两段压缩方案。
- tablet server使用了两段cache:scan cache缓存由SSTable接口返回的kv对;block cache缓存由block从GFS中读出的数据。
- 在tablet中查找时,先通过bloom filter来检查某个SSTable是否可能包含目标数据。
- 恢复tablet时,tablet server首先读一系统SSTable,再将最后一个SSTable后写入日志的更新依次redo到memtable中。
- 有tablet server死掉时,它管理的大量tablet都需要恢复。为了避免重复读取日志,master首先将日志进行排序,之后可以顺序读取。排序时在不同的tablet server上并行排序。
- 有tablet要移到新的tablet server上时,旧tablet server首先对它进行minor compaction,再冻结,在卸载前再进行一次minor compaction,这样移动完成后不需要再读取日志。
- 因为SSTable中的数据不可变,对它的读取可并行进行,且在tablet分裂时,新的2个tablet共享原有的所有SSTable。
Chubby的职责:
- 为master提供singlon服务。
- 为master提供动态的tablet server状态追踪。
- 为tablet位置的查询提供唯一的入口。
- 存储每个tablet的模式信息。
- 存储访问权限列表。
Bigtable阶段性总结(版本1)的更多相关文章
- 几款主流 NoSql 数据库的对比
最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...
- HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比
最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...
- SourceTree的基本使用
1. SourceTree是什么 拥有可视化界面的项目版本控制软件,适用于git项目管理 window.mac可用 2. 获取项目代码 1. 点击克隆/新建 2. 在弹出框中输入项目地址,http或者 ...
- NoSql 数据库
几款主流 NoSql 数据库的对比 posted @ 2016-05-11 21:36 vajoy 阅读(915) 评论(3) 编辑 收藏 最近小组准备启动一个 node 开源项目,从前端亲和力. ...
- 全球分布式数据库:Google Spanner(论文翻译)
本文由厦门大学计算机系教师林子雨翻译,翻译质量很高,本人只对极少数翻译得不太恰当的地方进行了修改. [摘要]:Spanner 是谷歌公司研发的.可扩展的.多版本.全球分布式.同步复制数据库.它是第一个 ...
- MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
NoSQL的四大种类 NoSQL数据库在整个数据库领域的江湖地位已经不言而喻.在大数据时代,虽然RDBMS很优秀,但是面对快速增长的数据规模和日渐复杂的数据模型,RDBMS渐渐力不从心,无法应对很多数 ...
- WordPress版微信小程序2.4版发布
自从发布2017年9月16日WordPress版微信小程序2.2.8版本后,这个一个多月来,WordPress版微信小程序,在经过一些比较小的更新后,今天发布阶段性的版本:2.4版 .这版本主要是功能 ...
- MongoDB、Hbase、Redis等NoSQL分析
NoSQL的四大种类 NoSQL数据库在整个数据库领域的江湖地位已经不言而喻.在大数据时代,虽然RDBMS很优秀,但是面对快速增长的数据规模和日渐复杂的数据模型,RDBMS渐渐力不从心,无法应对很多数 ...
- HBase与列存储
传统的行存储和(HBase)列存储的区别 1.为什么要按列存储 列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的 ...
随机推荐
- linux 中怎样返回上一层目录的命令?
可以使用cd命令,cd命令的功能是切换到指定的目录:命令格式:cd [目录名]目录名有几个符号有特殊的含义,“..”代表上一级目录.“~”代表HOME目录.“-”代表前一目录.因此返回上一级目录可以使 ...
- 【BZOJ5110】[CodePlus2017]Yazid 的新生舞会 线段树
[BZOJ5110][CodePlus2017]Yazid 的新生舞会 Description Yazid有一个长度为n的序列A,下标从1至n.显然地,这个序列共有n(n+1)/2个子区间.对于任意一 ...
- Redis高级进阶
目录 本章目标 Redis配置文件 Redis存储 Redis事务 Redis发布订阅 Redis安全 本章目标 Redis配置文件 Redis的存储 Redis的事务 Redis发布订阅 Redis ...
- 04.ActiveMQ与Spring JMS整合
SpringJMS使用参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html ...
- java web 打印(lodop)案例
应需求接触到lodop 打印. 首先在lodop官网下载相关文件(js.css等):http://www.lodop.net/download.html 在下载好的包里 除了html页面 其他的j ...
- Oracle HA 之 RAC one node实战
--创建rac one node步骤 安装grid软件,配置grid集群:安装oracle软件:dbca创建rac one node. >试验创建的rac one node数据库信息如下: gl ...
- 前端程序员:月薪 5K 到 5 万
入行行头:5 大硬件 请准备好以下东西 一颗人类的大脑:智商在平均水平线以上即可 一份强烈的渴望:我的代码要可以运行在任何一个有浏览器的设备上. 一台笔记本电脑:不需要花费很多钱得那种,只要它可以运行 ...
- 设计模式之——Observer模式
Observer模式又叫做观察者模式,当观察对象状态发生变化的时候,就会通知给观察者.这种模式适用于根据对象状态进行响应的场景! 实例程序是一个输出数字的程序. 观察者Observer类用于每500m ...
- Qt::QWindow多窗口争抢置顶状态解决方案
有时候我们会有这种需求,自己的桌面程序需要置顶,但是程序包含了很多窗口,可能我们要求窗口1,2都在其它桌面程序之上,但是窗口1必须随时在窗口2之上. Qt提供的置顶方式是在windowsflags上增 ...
- Crossed ladders---poj2507(二分+简单几何)
题目链接:http://poj.org/problem?id=2507 题意就是给你x y c求出?的距离: h1 = sqrt(x*x-d*d); h2 = sqrt(y*y-d*d); (h1 ...