您的位置:首页 > 其它

大表(Bigtable):结构化数据的分布存储系统(二)(eyson翻译)

2009-10-14 22:01 218 查看
由于在网上只找到前四章的翻译,从第五章开始的部分我试着自己翻译,水平有限,望各位批评指正。

转载请注明出处:http://blog.csdn.net/eyson

5、执行

BT的执行有三个主要部分组成:一个到每个客户端的链接库,一个主服务器,和许多子表(tablet)服务器。子表服务器可以动态的从群组中被添加和删除,以适应工作流量的改变。
主服务器的作用是给子表服务器分配子表、探测子表服务器的增加和终止、平衡子表服务器负载,和GFS系统中文件的碎片回收。此外,他还处理诸如创建表和列族之类的模式该表(schema changes)。
每一个子表服务器管理许多子表(典型的,每个子表服务器可以管理10到1000个子表)。子表服务器处理它所负载子表的读写请求,还可以将那些增长得太大的子表分割。
像许多单主机的分布式存储系统一样,客户端数据不是通过主机来传输的:客户端要读写时直接与子表服务器通信。因为BT客户端并不依赖主机来请求子表本地信息,大多数客户端从不与主机通信。结果,实际上主机的负载往往很轻。
一个BT群组存储大量的表。每一个表有许多子表,并且每个子表包含一行上所有相关的数据。最初,每个表只包含一个子表。随着表的增长,自动分成了许多的子表,默认每个子表的大小大约是100到200MB。
5.1 子表地址(Tablet Location
我们用三层等级来比拟一颗B+树,来存储子表的地址信息(图4)。
第一层是一个存储在Chubby中的文件,它包含了根子表(root tablet)的地址。根子表包含所有子表的地址信息在一个特殊的元数据表(METADATA table)中。每一个元数据表包含许多用户子表的地址信息。根子表只是元数据表中的第一个子表,但是被特别对待—它从不会被分割—以确保子表地址等级不会超过三层。
元数据表在一个行关键字之下存储一个子表的地址,它是子表的表标识符和它的尾行。每一个元数据表行在内存中存储大约1KB的数据。以一个128M大小的元数据表子表的适中限制来看,我们的三层位置地址足够来寻址234个子表{217*217}(或者261字节,每个表128M的话)。
客户端库缓存子表地址。如果一个客户端一个子表的地址,或者它发现缓存的地址信息是错误的,那么它递归的提升子表地址等级。如果客户端缓存是空的,寻址算法需要三个网络往返过程(原文:network round-trips),包括一个从Chubby的读取。如果客户端缓存是过期的,寻址算法可能要用6个往返过程,因为过期缓存入口处只能发现向上的丢失(原文:upon misses)(假设元数据表子表不会很频繁地移动)。尽管子表地址存储在内存中,所以不需要GFS访问,我们还是可以通过客户端库预提取子表地址在通常的情况下进一步降低性能损耗:在读元数据表表时它总是读取一个以上的元数据。
我们同样在元数据表中存储一些次要的信息,包括一个记录每个子表所有相关事件的日志(比如当一个服务器开始为子表服务)。这些信息对于调试和性能分析是有效的。

5.2子表分配(Tablet Assignment
每个子表一次被分配给一个子表服务器。主机跟踪活的子表服务器集,和当前子表对子表服务器的分配状况,包括那些没有被分配的子表。当一个子表还没有被分配,并且一个带有足够空间的子表服务器是可用的,主机就通过传输一个子表装载请求到子表服务器来分配子表。
BT用Chubby来跟踪子表服务器。当一个子表服务器启动时,它在一个特别的Chubby目录中创建一个唯一名字的文件,并且获得一个互斥锁。主机通过监听这个目录(服务器目录)来发现(discover)子表服务器。如果子表服务器丢失了他的互斥锁,它将停止为它的子表服务:比如由于一个网络分隔(partition)引起服务器丢失Chubby会话。(Chubby提供一种有效的机制来允许子表服务器检查它是否仍然持有它的锁,而没有遭遇网络拥塞。)子表服务器会尝试为它的文件(只要还在)再次获取一把互斥锁。如果文件不在了,子表服务器就不能再服务了,所以它终止了自己。每当一个子表服务器终止(比如,因为集群管理系统正从集群中移除子表服务器所在机器),它会尝试释放它的锁,以便主机会更快得给它重新分配小表。
主机负责探测何时子表服务器不再为它的子表服务,以便可以尽快的分配那些小表。为了发现何时子表服务器不再为它的子表服务,主机周期性的询问每一个子表服务器它们锁的状态。如果一个子表服务器报告它丢失了它的锁,或者如果主机不能在它最后的几次尝试中联系到子表服务器,主机会尝试在服务器的文件中获取一把互斥锁。如果主机能获得这把锁,那么Chubby是可用的并且子表服务器已经失效或者在于Chubby的联系上出了问题,所以主机通过探删除子表服务器的服务文件来确保它不会再工作。一旦服务文件被删除,主机可以把先前分配给这台服务器的所有子表移到未分配的子表集合中。为了确保一个BT集群在主机和Chubby的网络问题上不是脆弱的,如果主机的Chubby会话终止,主机也会自我终止。因为,就像上面描述的,主机的关闭不会改变子表服务器中子表的分配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: