赞
踩
BigTable是google研发一个管理结构化数据的分布式存储系统,构建在GFS、Chubby等技术之上。其中:
BigTable按key(row:string, column:string, time:int64) -> value(string)方式排序,方便快速索引。更细节地说,先按行名升序、如果行名相同再按列名升序、最后按时间戳为版本号降序排列。最后在文件系统中GFS中按lsm方式存储。
为了实现集群,BigTable以行名范围对数据拆分片存储,每个分片叫tablet。每个tablet是相同行键前缀的数据集合。假设用户的数据行健以用户id开头、用户id为9位,那么以行健前9位划分tablet,就可以让相同用户的数据内聚到一个tablet中。
首先,BigTable是用于管理结构化数据。但它与传统的SQL又有一些差异:
整个BigTable由三部分组成,即client(客户端lib库)、master系统、tablet服务;然后基于Chubby和GFS实现。其中:
从前面可以看出BigTable最终数据是存储在GFS中,那么它是如何找到每个tablet分片在哪个GFS文件中的呢?其实元数据也是按tablet方式分片、分级存储的。与ceph自包含(或者说自存储)文件元数据一个原理。在Chubby中只记录顶级元数据的tablet位置或文件名。然后通过级联二级元数据的tablet,最终可以定位到用户数据的tablet。具体如下:
因为每个tablet由若干个sst文件组成,所以location在实现细节方面可以是一个文件序列,也可以像leveldb一样指向一个manifest文件,然后由manifest文件存储相关的多个sst文件。
每个tablet服务器维护一个或多个tablet分片,每个tablet服务器使用一个WAL日志文件,用来记录接收的所管理分片的数据写入;然后将数据插入到内存中;当内存中数据达到上限,就会写入到对应的tablet分片的新sst文件中。此外,tablet服务还会处理后台sst的合并。整个过程与leveldb类似。
读取流程与leveldb也是类似的过程。先读取tablet服务内存中是否有数据;若没有就会读取tablet分片的sst文件中是否有数据;最后都没有才会返回查找失败。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。