NoSQL的复兴和模型简化的力量(上篇)

Posted 尚学堂IT之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoSQL的复兴和模型简化的力量(上篇)相关的知识,希望对你有一定的参考价值。

在介绍 NoSQL 之前,我想提两个公司,一个是Google,另一个是Amazon

Google

Google 应该是第一个将分布式存储技术应用到大规模生产环境的公司,同时也是在分布式系统上积累最深的公司,可以说目前工业界的分布式系统的工程实践及思想大都来源于 Google。比如 2003 年的 GFS 开创了分布式文件系统,2006 年的Bigtable 论文开创了分布式键值系统,直接催生的就是 Hadoop 的生态;至于 2012 年发表论文的SpannerF1更是一个指明未来关系型数据库发展方向的里程碑式的项目,这个我们后续会说。

Amazon

另一个公司是 Amazon2007 年发表的Dynamo的论文尝试引入了最终一致性的概念, WRN 的模型及向量时钟的应用,同时将一致性 HASHmerkle tree 等当时一些很新潮的技术整合起来,正式标志着 NoSQL 的诞生——对后来业界的影响也是很大,包括后来的 CassandraRiakDBVoldemort等数据库都是基于 Dynamo 的设计发展起来的。


新思潮

另外这个时期(2006 年前后持续至今)一个比较重要的思潮就是数据库(持久化)和缓存开始有明确的分离——我觉得这个趋势是从 memcached 开始的。随着业务的并发越来越高,对于低延迟的要求也越来越高;另外一个原因是随着内存越来越便宜,基于内存的存储方案渐渐开始普及。当然内存缓存方案也经历了一个从单机到分布式的过程,但是这个过程相比关系型数据库的进化要快得多。

这是因为 NoSQL 的另外一个重要的标志——数据模型的变化——大多 NoSQL 都抛弃了关系模型,选择更简单的键值或者文档类型进行存储。数据结构和查询接口都相对简单,没有了SQL 的包袱,实现的难度会降低很多。

另外 NoSQL 的设计几乎都选择牺牲掉复杂 SQL 的支持及 ACID 事务换取弹性扩展能力,也是从当时互联网的实际情况出发:业务模型简单、爆发性增长带来的海量并发及数据总量爆炸、历史包袱小、工程师强悍,等。其中最重要的还是业务模型相对简单。

嵌入式存储引擎

在开始介绍具体的开源的完整方案前,我想介绍一下嵌入式存储引擎们。

随着 NoSQL 的发展,不仅仅缓存和持久化存储开始细分,再往后的存储引擎也开始分化并走上前台。之前很难想象一个存储引擎独立于数据库直接对外提供服务,就像你不会直接拿着 InnoDB 或者 MyISAM甚至一个 B-tree 出来用一样(当然,bdb 这样鼎鼎大名的除外)。人们基于这些开源的存储引擎进行进一步的封装,比如加上网络协议层、加上复制机制等等,一步步构建出完整的风格各异的 NoSQL 产品。

这里我挑选几个比较著名存储引擎介绍一下。

TC

我最早接触的是TokyoCabinet(TC)TC 相信很多人也都听说过,TC 是由日本最大的社交网站 Mixi 开发并开源的一个混合 Key-Value 存储引擎,其中包括 HASHTable B+ Tree 的实现。但是这个引擎的一个缺陷是随着数据量的膨胀,性能的下降会非常明显,而且现在也基本不怎么维护了,所以入坑请慎重。于 TC 配合使用的Tokyo Tyrant(TT)是一个网络库,为 TC 提供网络的接口使其变成一个数据库服务,TT + TC 应该是比较早的 NoSQL 的一个尝试。


LevelDB

2011 年,Google 开源了 Bigtable的底层存储擎:LevelDBLevelDB 是一个使用 C++ 开发的嵌入式的 Key-Value 存储引擎,数据结构采用了LSM-Tree,具体 LSM-Tree 的算法分析可以很容易在网上搜索到,我就不赘述了。其特点是,对于写入极其友好,LSM 的设计避免了大量的随机写入;对于特定的读也能达到不错的性能(热数据在内存中);另外LSM-Tree B-tree 一样是支持有序 Scan ;而且 LevelDB 是出自 JeffDean 之手,他的事迹做分布式系统的朋友一定都知道,不知道的可以去 Google 搜一下。

LevelDB 拥有极好的写性能,线程安全,BaTCh Write Snapshot 等特性,使其很容易的在上层构建 MVCC 系统或者事务模型,对于数据库来说非常重要。

另外值得一说的是,Facebook维护了一个活跃的 LevelDB 的分支,名为 RocksDBRocksDB LevelDB 上做了很多的改进,比如多线程Compactor、分层自定义压缩、多MemTable 等。另外 RocksDB对外暴露了很多 Configration ,可以根据不同业务的形态进行调优;同时Facebook 在内部正在用 RocksDB来实现一个全新的 mysql 存储引擎:MyRocks,值得关注。RocksDB 的社区响应速度很快也很友好,实际上 PingCAP 也是 RocksDB 的社区贡献者。我建议新的项目如果在 LevelDB RocksDB 之间纠结的话,请果断选择 RocksDB

B-tree 家族

当然,除了LSM-Tree 外,B-tree的家族也还是有很多不错的引擎。首先大多数传统的单机数据库的存储引擎都选择了B+TreeB+Tree 对磁盘的读比较友好,第三方存储引擎比较著名的纯 B+Tree 实现是LMDB。首先 LMDB 选择在内存映像文件 (mmap) 实现 B+Tree,同时使用了 Copy-On-Write 实现了 MVCC 实现并发事务无锁读的能力,对于高并发读的场景比较友好;同时因为使用的是 mmap 所以拥有跨进程读取的能力。因为我并没有在生产环境中使用过 LMDB ,所以并不能给出 LMDB 的一些缺陷,见谅。

 

 


以上是关于NoSQL的复兴和模型简化的力量(上篇)的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB数据库基础

NOSQL数据模型和CAP原理

我需要关于 NoSQL/MongoDb 和数据/模型结构的建议

nosql 愿望清单模型 - 参考和嵌入文档之间的斗争

如何使用 NoSQL 进行数据模型

NOSQL 非规范化数据模型