苹果公司开源FoundationDB的简单分析

作者:网友投稿 时间:2018-06-16 16:47

字号

很久没有写点技术性的东西, 主要还是自己偷懒了。今天写一篇。

美国时间 2018年4月19日,苹果公司宣布开源FoundationDB。FoundationDB 本来是一个开源项目,于2015年被苹果收购以后,其代码从GitHub上删除进入闭源代状态,直到苹果宣布重新开源。

这篇文章主要分析一下FoundationDB是什么,它和同类产品比较起来的优势和劣势在哪里。

大数据开源社区繁荣昌盛,涌现出传统数据库和NoSQL两类产品。传统数据库提供了强一致性(Strong Consistency),事务处理的ACID支持,可靠性高,但是并发和可扩展性上有局限。 NoSQL,尤其是通常的Key-Value Store通过牺牲强一致性来达到更高的可用性和可扩展性。所以这些系统通常采取最终一致性(Eventual Consistency)模型。

苹果公司开源FoundationDB的简单分析

大数据时代的Key-Value Store大体上分为两类:

以BigTable和HBase为代表的,分区键(Partition Key)全局排序,通常采用的是范围分区(Range Partition)

以DynamoDB和Cassandra为代表,分区键(Partition Key)不排序,通常采用的是哈希分区(Hash Partition)

前者不但能支持对分区键的点查询(Point Query),而且对分区键的范围查询(Range Query)也能比较好的支持。后者则只支持分区键的点查询。从性能上来说,后者因为使用哈希分区,其扩展性上更好一些。

FoundationDB是一个开源数据库项目,最初于2012年1月进行Alpha测试,2013年4月进行Beta测试。2013年8月20日正式发布了1.0版本。两年后的2013年3月25日被苹果公司收购以后不再开源。苹果公司于2018I年4月19日再次开源。

FoundationDB的核心是一个Key-Value Store,类似谷歌的BigTable,而非亚马逊的DynamoDB。它是按照分区键全局排序,使用范围分区的方式来分区。每个本地分区则使用B+树保存数据。从这个实现来讲,FoundationDB对于分区键的点查询和范围查询都有比较好的支持,但是其在扩展性上应该类似于谷歌的BigTable,不如亚马逊的DymamoDB。

和其他NoSQL不一样的是,FoundationDB的Key-Value Store实现了强一致性,而非最终一致性。严格的来说,它实现了在操作系统里面的sequence consistency,这基本上等价于数据库里面讨论ACID的时候说的隔离级别(Isolation level)里面的可串行化(serializable)。在数据库系统里,这也是最高的隔离级别。

在核心外, FoundationDB通过分层设计的方式,实现了对各种数据模型,比如文档数据库,图数据库,关系数据库的支持。数据模型通过映射到一组到多组的Key-Value Store上实现对数据的存储。

因此,从更高级的层次上看,FoundationDB通过统一的引擎:一个继续全局排序的Key-Value Store,和可扩展性设计,实现了对多种数据模型的支持。并且在存储层提供了强一致性和ACID的支持,其隔离级别是可串行化。

和传统的Key-Value Store比,无论是谷歌的BigTable或者其开源克隆版HBase,还是和亚马逊的Dyanmo或者其克隆版Cassandra,FoundationDB一方面在存储层实现的是强一致性,另外一方面通过可扩展的层次方式支持更多的数据模型。

和传统数据库比,因为底层使用了Key-Value Store,FoundationDB又比传统数据库有更好的扩展性。

整个市场上有两个产品和FoundationDB有类似的地方:

微软的CosmosDB

国产的TiDB

微软的CosmosDB的整体设计思路和FoundationDB有很多类似的地方:底层存储引擎统一,上层通过映射实现对多种数据模型的支持。不同之处主要有几个方面:

微软底层存储引擎如何实现未知,但是想来应该不是简单的Key-Value Store

微软的一致性模型有很多种,可以供用户选择,既没有简单的实现最终一致性,也没有简单的实现强一致性。

TiDB是一款国产开源数据库。它也是经纬投资的创业公司。腾讯云目前提供的HTAP云数据库服务背后基于TiDB技术。TiDB和FoundationDB的底层实现非常类似,简单来说TiDB底层也实现了一个Key-Value Store,用的是开源的RocksDB。RocksDB是Facebook维护的从谷歌LevelDB出来的一个开源项目。而谷歌LevelDB则是谷歌BigTable本地存储数据的格式,主要思想是LSM Tree。

在这层之上TiDB实现了关系数据库到Key-Value Store的映射。这和FoundationDB实现多种数据模型到Key-Value Store的映射之间关系也很类似。所不同的是TiDB上层只支持关系数据库,下层也为支持关系数据库而进行了专门的优化。

两者的区别就是实现细节的不同了。没有仔细阅读源码很难指出设计上的大的不同的地方,目前可以看到的是存储结构是B+树v.s. LSM Tree。一致性协议前者是Paxos后者是Raft。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接