6.1.2 数据分布
Bigtable中的数据在系统中切分为大小100~200MB的子表,所有的数据按照行主键全局排序。Bigtable中包含两级元数据,元数据表及根表。用户表在进行某些操作,比如子表分裂的时候需要修改元数据表,元数据表的某些操作又需要修改根表。通过使用两级元数据,提高了系统能够支持的数据量。假设平均一个子表大小为128MB,每个子表的元信息为1KB,那么一级元数据能够支持的数据量为128MB×(128MB/1KB)=16TB,两级元数据能够支持的数据量为16TB×(128MB/1KB)=2048 PB,满足几乎所有业务的数据量需求。如图6-3所示。
图 6-3 Bigtable数据结构
客户端查询时,首先从Chubby中读取根表的位置,接着从根表读取所需的元数据子表的位置,最后就可以从元数据子表中找到待查询的用户子表的位置。为了减少访问开销,客户端使用了缓存(cache)和预取(prefetch)技术。子表的位置信息被缓存在客户端,客户端在寻址时首先查找缓存,一旦缓存为空或者缓存信息过期,客户端就需要请求子表服务器的上一级元数据表获取位置信息,比如用户子表缓存过期需要请求元数据表,元数据子表缓存过期需要请求根表,根表缓存过期需要读取Chubby中的引导信息。如果缓存为空,最多需要三次请求;如果缓存信息过期,最多需要六次请求,其中三次用来确定信息是过期的,另外三次获取新的地址。预取则是在每次访问元数据表时不仅仅读取所需的子表元数据,而是读取连续的多个子表元数据,这样查找下一个子表时不需要再次访问元数据表。