错误博客( cuowu.com )发布于 2019-06-10 19:08:56

BigTable架构

虽然数据库可以履行文档数据库的职责,但规模庞大的文档集合需要特殊的文档存储系统。BigTalbe是一个众所周知的文档存储系统(Chang et al. 2006)。至少有两个开源项目都使用了类似的方法,但BigTable是内部使用的一个运行系统。在接下来的段落中,将看到BigTable的架构,了解文档存储是如何影响它的设计的。

在开始用于存储网页时,BigTable是一个分布式数据库系统。BigTable实际上的确是一个很庞大的表;它的规模可以超过1PB(1024TB),但每一个数据库只含有一个表。每个表被分割成为小块,称为tablet,通过上千台的机器提供支持(见图3-12)。

BigTable架构

如果你了解关系数据库,就会使用过SQL(Struc-tured Query Language,结构化查询语言)。SQL支持用户书写一些复杂的、大计算量的查询,数据库系统的任务之一就是优化这些对查询的处理,尽可能快地完成这些处理过程。由于其中的一些查询可能需要花费很长的时间才能完成,所以一些大型的关系数据库采用了复杂的锁定系统,以保证大量用户同时对数据库进行读或写操作时,数据库不会崩溃。将众多的用户互相隔离开是一个很困难的任务,很多文章和书籍都讨论了如何能更好地使用户相互分离。

BigTable方法有很大的不同。没有查询语言,也就没有复杂的查询,只有 row-level事务,从关系数据库的标准来看,这是很简单的任务。然而,如果采用价格低廉的计算机,这个简单的模型会使BigTable达到很大的数据规模,尽管这样的计算机易于出现故障。

BigTable的实现中,绝大部分的任务是关于故障恢复的。tablet是逻辑表中很小的部分,复制到另外一个文件系统中进行存储,该文件系统可以被BigTable中所有的tablet服务器存取。BigTable中tablet的变化记录在事务日志中,日志存储在一个共享的文件系统中。如果某个tablet服务器死机了,另外一台服务器可以立即从文件系统中读取tablet数据和事务日志,并将工作承担过来。

绝大多数的关系数据库将数据存放在文件中,该文件会被不停地进行修改。相反,BigTable将文件存储在永远不变的(不能改变的)文件中。一旦数据写入到了BigTable的文件中,它就不再变化了。这样做也有助于故障的恢复。关系数据库中,故障恢复需要一系列复杂的操作来保证文件不会被破坏,因为在计算机出现故障之前只完成了部分写操作。BigTable中文件或者是不完整的(这时候文件可以被丢掉,可以从其他的BigTable文件和事务日志重新创建),或者是完整的,因此不会被破坏。最新的数据存储在RAM中以支持表的更新,而过时的数据存储在一系列的文件中。这些文件周期性地合并在一起,以减少磁盘文件的数目。

bigtable中的一行

BigTable逻辑上是以行的方式组织的(见图3-13)。图中,该行存储了一个单独网页的数据。URL地址为www.cuowu.com,是该行的主键,用于对该行的查找。行中有很多列,每个列有唯一的名字。每一列可以有一些时间标记,在图中没有给出来。行的主键、列的主键以及时间标记组合在一起,指向一行中的一个单元(cell)。

图中,对于文档的全文有一个文本列,还有一个标题列,这样,不需要对全部的文档文本进行分析,就可以快速地找到文档的标题。有两列用于锚文本。一个是 anchor : xiaoxiaoketang.com,包含从站点 xiaoxiaoketang.com 指向 cuowu.com 的超链接的锚文本;如图中的单元所示,超链接上的文本是“cuowu”。anchor : xitong110.com 描述了从 xitong110.com 指向 cuowu.com 的一个超链接上的锚文本是“点击此处”。这些列都属于锚文本列组(column group)。可以向该列组中增加其他的列,以增加更多的链接信息。

BigTable中,每行可以有许多列,所有的行具有相同的列组,并不是所有的行都有相同的列。这是和关系数据库系统最主要的区别,但这种灵活性是很重要的,部分原因是由于没有那么多表。在关系数据库系统中,锚文本对应的列会存储在一个表中,而文档文本存储在另外一个表中。BigTable中只有一个表,所有的锚文本信息需要包装在一个记录中。将文档和所有的锚文本数据存储在一起,读取所有的文档数据只需要一次磁盘读取。在具有两个表的关系数据库中,要得到所有的文档数据,至少需要两次对磁盘的读取操作。

行根据它们的主键被分割为tablet。例如,所有以 a 开始的URL地址可以放在一个tablet中,而以 b 开始的URL地址可以存放在另外一个tablet中。这种基于范围的分割使得BigTable的客户端很容易就可以确定每一行是由哪个服务器提供服务的。要查找一个特定的行,客户端查阅行主键的范围列表来确定该行属于哪个tablet。接下来,客户端与这个tablet的服务器建立连接,来获取该行。行主键的范围在客户端进行缓存,这样可以保证大多数的网络通信都是在客户端和tablet服务器之间的。

BigTable的架构被设计用于提高速度和增大规模,而且出于经济上的考虑,使用廉价的、易于出故障的计算机。为了实现这些目标,BigTable牺牲了关系数据库中的一些主要特征,如复杂的查询语言和多表格的数据库。然而,这样的架构很适用于存储和找到网页的工作,该工作的主要任务是对各行进行高效的查找和更新。


2020年错误博客亲测项目系列

错误教程( cuowu.com )专注网推培训、SEO培训和网赚培训,微信/电话:13722793092

关注微信公众号:第一时间获得错误博客最新教程,让我们一起成长!

公众号二维码