配了几种主机,大师看看3d建模主机用哪种就可以了,太差了卡,太好了也浪费,提个建议,弄个合适的。

MongoDB的官方文档基本是how to do的介绍而关於how it worked却少之又少,本人也刚买了《MongoDB TheDefinitive Guide》的影印版还没来得及看,本文原作者将其书中一些关于MongoDB内部现实方面的一些知识介绍如下值得一看。

今天下载了《MongoDB The Definitive Guide》电子版浏览了里面的内容,还是挺丰富的是官网文档实际应用方面的一个补充。和官方文档类似介绍MongoDB的内部原理昰少之又少,只有在附录的一个章节中介绍了相关内容

对于大多数的MongoDB的用户来说,MongoDB就像是一个大黑盒但是如果你能够了解到MongoDB内部一些構造的话,将有利于你更好地理解和使用MongoDB

在MongoDB中,文档是对数据的抽象它被使用在Client端和Server端的交互中。所有的Client端(各种语言的Driver)都会使用這种抽象它的表现形式就是我们常说的BSON(Binary JSON )。

BSON是一个轻量级的二进制数据格式MongoDB能够使用BSON,并将BSON作为数据的存储存放在磁盘中

当Client端要將写入文档,使用查询等等操作时需要将文档编码为BSON格式,然后再发送给Server端同样,Server端的返回结果也是编码为BSON格式再放回给Client端的

使用BSON格式出于以下3种目的:

BSON是为效率而设计的,它只需要使用很少的空间即使在最坏的情况下,BSON格式也比JSON格式再最好的情况下存储效率高

茬某些情况下,BSON会牺牲额外的空间让数据的传输更加方便比如,字符串的传输的前缀会标识字符串的长度而不是在字符串的末尾打上結束的标记。这样的传输形式有利于MongoDB修改传输的数据

最后,BSON格式的编码和解码都是非常快速的它使用了C风格的数据表现形式,这样在各种语言中都可以高效地使用

更多关于BSON的介绍,可以参考:

Client端访问Server端使用了轻量级的TCP/IP写入协议。这种协议在中有详细介绍它其实是茬BSON数据上面做了一层简单的包装。比如说写入数据的命令中包含了1个20字节的消息头(由消息的长度和写入命令标识组成),需要写入的Collection洺称和需要写入的数据

在MongoDB的数据文件夹中(默认路径是/data/db)由构成数据库的所有文件。每一个数据库都包含一个.ns文件和一些数据文件其Φ数据文件会随着数据量的增加而变多。所以如果有一个数据库名字叫做foo那么构成foo这个数据库的文件就会由等平台的驱动程序。(

SQL or NoSQLThat’s a question!SQL 与 NoSQL 嘚争论从来没有停息过,但其实任何一种技术都不会是适合一切应用场景的重要的是你要充分了解自己的需求,再充分了解你要选择的技术的优劣

下面是一个关于 MongoDB 优缺点的列表,希望对打算使用 MongoDB 的同学能有一些作用:

快速!(当然,这和具体的应用方式有关通常来說,它比一般的关系型数据库快5位左右)

很高的可扩展性 – 轻轻松松就可实现PB级的存储(但是可能我们并不需要PB级的存储,10TB可能就够了)

他的存储格式是Json的这对Java来说非常好处理,对javascirpt亦然

运维起来非常方便,你不用专门为它安排一个管理员

它有一个非常活跃的社区(峩提出的一个bug在20分钟内就能得到修复。多谢Elliot)

他的版本控制非常清楚

MongoDB 背后的公司(10gen)已经准备好了明天在 MongoDB 上面的投入的资金了。

应用经驗缺乏我们都没有相关NoSQL 产品的使用经验。

项目相对来说还比较新

和以往的存储相比,数据的关系性操作不再存在

本文详细讲下Memcached和Mongodb一些看法,以及结合应用有什么好处希望看到大家的意见和补充。

  Memcached的优势我觉得总结下来主要体现在:

  1) 分布式可以由10台拥有4G內存的机器,构成一个40G的内存池如果觉得还不够大可以增加机器,这样一个大的内存池完全可以把大部分热点业务数据保存进去,由內存来阻挡大部分对数据库读的请求对数据库释放可观的压力。

  2) 单点如果Web服务器或App服务器做负载均衡的话,在各自内存中保存嘚缓存可能各不相同如果数据需要同步的话,比较麻烦(各自自己过期还是分发数据同步?)即使数据并不需要同步,用户也可能洇为数据的不一致而产生用户体验上的不友好

  3) 性能强。不用怀疑和数据库相比确实是根源上还是内存的读写和磁盘读写效率上幾个数量级的差距。有的时候我们在抱怨数据库读写太差的情况下可以看看磁盘的IO如果确实是瓶颈的话装啥强劲的数据库估计也档不了,强不强无非是这个数据库多少充分的利用了内存

  但是也不太建议在任何情况下使用Memcached替代任何缓存:

  1) 如果Value特别大,不太适合因为在默认编译下Memcached只支持1M的Value(Key的限制到不是最大的问题)。其实从实践的角度来说也 不建议把非常大的数据保存在Memcached中因为有序列化反序列化的过程,别小看它消耗的CPU说到这个就要提一下,我一直觉得 Memcached适合面向输出的内容缓存而不是面向处理的数据缓存,也就是不太適合把大块数据放进去拿出来处理之后再放进去而是适合拿出来就直接给输出了,或是拿出来不需要处理直接用

  2) 如果不允许过期,不太适合Memcached在默认情况下最大30天过期,而且在内存达到使用限制后它也会回收最少使用的数据因此,如果我们要把它当 作static变量的话僦要考虑到这个问题必须有重新初始化数据的过程。其实应该这么想既然是缓存就是拿到了存起来,如果没有必定有一个重新获取重噺缓存的过程而不是想着它永远存在。

  在使用Memcached的过程中当然也会有一些问题或者说最佳实践:

  1) 清除部分数据的问题Memcached只是一個Key/Value的池,一个公共汽车谁都可以上我觉得对于类似的公共资源,如果用的人都按照自己的规 则来的话很容易出现问题因此,最好在Key值嘚规范上上使用类似命名空间的概念 每一个用户都能很明确的知道某一块功能的Key的范围,或者说前缀带来的好处是我们如果需要清空嘚话可以根据这个规范找到我们自己的一批Key然后再去 清空,而不是清空所有的当然有人是采用版本升级的概念,老的Key就让它过去吧到時候自然会清空,这也是一种办法不过Key有规范总是有好处的,在 统计上也方便一点

  2) Value的组织问题。也就是说我们存的数据的粒度比如要保存一个列表,是一个保存在一个键值还是统一保存为一个键值这取决于业务。如果粒度很小的话最好是在获取的时候能批量獲取在保存的时候也能批量保存。对于跨网络的调用次数越少越好可以想一下,如果一个页面需要输出100行数据每一个数据都需要获取一次,一个页面进行上百次连接这个性能会不会成问题

  那么Memcached主要用在哪些功能上呢?

  其实我觉得平时能想到在内存中做缓存嘚地方我们都可以考虑下是不是可以去适用分布式缓存但是主要的用途还是用来在前端或中部挡一下读的需求来释放Web服务器App服务器以及DB嘚压力。

  Mongodb是一款比较优良的非关系型数据库的文档型的数据库它的优势主要体现在:

  1) 开源。意味着即使我们不去改也可以充汾挖掘它MS SQL除了看那些文档,谁又知道它内部如何实现

  2) 免费。意味着我们可以在大量垃圾服务器上装大量的实例即使它性能不怎么高,也架不住非常多的点啊

  3) 性能高。其它没比较过和MS SQL相比,同样的应用(主要是写操作)一个撑500用户就挂了一个可以撑箌2000。在数据量上到百万之后即使没索引,MS SQL的插入性能下降的也一塌糊涂其实任何事物都有相对性的,在变得复杂变得完善了之后会牺牲一部分的性能MS SQL体现的是非常强的安全性数据完整性,这点是Mongodb办不到的

  4) 配置简单并且灵活。在生产环境中对数据库配置故障转迻群集和读写分离的数据库复制是很常见的需求MS SQL的配置繁琐的步骤还是很恐怖的,而Mongodb可以在五分钟之内配置自己所需要的故障转移组讀写分离更是只需要一分钟。灵活性体现在我们可以配置一个M一个S,两个M一个S(两个M写入的数据会合并到S上供读取)一个M两个S(一个M寫入的数据在两个S上有镜像),甚至是多个M多个S(理论上可以创建10个M10个S,我们只需要通过轮询方式随便往哪个M上写需要读的时候也可鉯轮训任意一个S,当然我们要知道不可能保证在同一时间所有的 S都有一致的数据)那么也可以配置两个M的对作为一套故障转移群集,然後这样的群集配置两套再对应两个S,也就是4个M对应2个S保证M点具有故障 转移。

  5) 使用灵活在之前的文章中我提到甚至可以通过SQL到JS表达式的转换让Mongodb支持SQL语句的查询,不管怎么说Mongodb在查询上还是很方便的

  之前也说过了,并不是所有数据库应用都使用采用Mongodb来替代的咜的主要缺点是:

  1) 开源软件的特点:更新快,应用工具不完善由于更新快,我们的客户端需要随着它的更新来升级才能享受到一些新功能更新快也意味着很可能在某一阶段会缺乏某个重要功能。另外我们知道MS SQL在DEV/DBA/ADM多个维度都提供了非常好的GUI工具对数据库进行维护洏Mongodb虽然提供了一些程序,但是并不是非常友好我们的 DBA可能会很郁闷,去优化Mongodb的查询

  2) 操作事务。Mongodb不支持内建的事务(没有内建事務不意味着完全不能有事务的功能)对于某些应用也就不适合。不过对于大部分的互联网应用来说并不存在这个问题

  在使用Mongodb的过程中主要遇到下面的问题:

  1) 真正的横向扩展?在使用Memcached的过程中我们已经体会到这种爽了基本可以无限的增加机器来横向扩展,因為什么因为我们是通过客户端来决定键值保存在那个实例上,在获取的时候也很明确它在哪个实例上即使是一次性获取多个键值,也昰同样而对于数据库来说,我们通过各种各样的方式进行了 Sharding不说其它的,在查询的时候我们根据一定的条件获取批量的数据怎么样詓处理?比如我们按照用户ID去分片而查询根本不在乎用户ID, 在乎的是用户的年龄和教育程度最后按照姓名排序,到哪里去取这些数据不管是基于客户端还是基于服务端的Sharding都是非常难做的,并且即使有了 自动化的Sharding性能不一定能有保障最简单的是尽量按照功能来分,再丅去就是历史数据的概念真正要做到实时数据分散在各个节点,还是很困难

  2) 多线程,多进程在写入速度达不到预期的情况下峩们多开几个线程同时写,或者多开几个Mongodb进程(同一机器)也就是多个数据库实例,然后向不同 的实例去写这样是否能提高性能?很遺憾非常有限,甚至可以说根本不能提高为什么使用Memcached的时候多开线程可以提高写入速度?那是因为内 存数据交换的瓶颈我们没达到洏对于磁盘来说,IO的瓶颈每秒那么几十兆的是很容易达到的一旦达到这个瓶颈了,无论是开多少个进程都无法提高性能了还 好Mongodb使用内存映射,看到内存使用的多了其实我对它的信心又多了一点(内存占用多了我觉得CPU更容易让它不闲着),怕就怕某个DB不使用什 么内存看着IO瓶颈到了,内存和CPU还是吃不饱

  其实有了Memcached和Mongodb我们甚至可以让80%以上的应用摆脱传统关系型数据库。我能想到它们其实可以互相配合彌补对方的不足:

  Memcached适合根据Key保存Value那么有的时候我们并不知道需要读取哪些Key怎么办呢?我在想是不是可以把Mongodb或 说数据库当作一个原始數据这份原始数据中分为需要查询的字段(索引字段)和普通的数据字段两部分,把大量的非查询字段保存在Memcached中小粒 度保存,在查询嘚时候我们查询数据库知道要获取哪些数据一般查询页面也就显示20-100条吧,然后一次性从Memcached中获取这些数据也就是 说,Mongodb的读的压力主要是索引字段而数据字段只是在缓存失效的时候才有用,使用Memcached挡住大部分实质数据的查询反过来说,如果我们要清空Memcached中的数据也知道要清涳哪些Key

NoSQL 数据库在上年炒得很热,于是我也萌生了使用 NoSQL 数据库写一个应用的想法首先来认识一下 NoSQL。NoSQL 是一个缩写含义从最初的 No-SQL 到现在已經成为了 Not-Only-SQL。确实后面一种解释比较符合 NoSQL 的使用场景

现在网络上被人所知的 NoSQL 数据库可以在这个网页()看到。这个列表林林总总一大堆偠选择哪个数据库入手呢?

在我关注的 Web 领域特别是 Ruby on Rails 社区,比较多提到的是这几个数据库:

另一个apache基金会下的非关系数据库。

特点是運行在内存中,速度很快相比于用来持久化数据,也许更接近于 memcached 这样的缓存系统或者用来实现任务队列。(比如)

在这些候选名单中峩选择了MongoDB因为它最近在 RoR 社区中的露脸率比较高,网页文档完善并且项目主页的设计也不错

在陈述 MongoDB 的特性之前,还是给第一次接触 NoSQL 的人提个醒:不要意图用 NoSQL 全盘取代 SQL 数据库非关系数据库的出现不是为了取代关系数据库。具体的说MongoDB 并不支持复杂的事务,只支持少量的原孓操作所以不适用于“转帐”等对事务和一致性要求很高的场合。而 MongoDB 适合什么场合请继续阅读。

关系数据库比如 MySQL通常将不同的数据劃分为一个个“表”,表的数据是按照“行”来储存的而关系数据库的“关系”是指通过“外键”将表间或者表内的数据关联起来。比洳文章-评论 的一对多关系可以用这样的表来实现:

实现关联的关键就是 comments 表的最后一个 post_id 字段将 comment 数据的 post_id 字段设为评论目标文章的 id 值,就可以鼡 SQL 语句进行相关查询(假设要查的文章 id 是 1):
相对于关系数据库的行式储存和查询MongoDB 作为一个文档型数据库,可以支持更具层次感的数据上面举的 文章-评论 结构,在 MongoDB 里面可以这样设计

可以看到,文档性数据库从储存的数据项上就跟 SQL 数据库不同在 MongoDB 中,文档是以  格式(类姒 JSON)储存的可以支持丰富的层次的结构。由于数据结构的表达能力更强用 MongoDB 储存文档型数据可以比 SQL 数据库更直观和高效。

在 SQL 数据库中為表达数据的从属关系,通常要将表间关系分为 one-to-oneone-to-many,many-to-many 等模式进行设计这通常会需要很多链接表的辅助。在MongoDB 中如果关联文档体积较小,凅定不变并且与另一文档是主从关系,那么通常可以嵌入(Embed)主文档

常见情景:评论、投票点击数据、Tag。

这类场景的有时单个数据项體积很小但是数量巨大,与之相应的是查询成本也会上升如果将这些小数据嵌入所属文档,在查询主文档时一并提取查询效率要比 SQL 高,后者通常需要开支较大的 JOIN 查询并且根据文档介绍,每个文档包括 Embed 部分在物理硬盘上都是储存在同一区域的IO 部分也会比 SQL 数据库快。(注MongoDB 有单文档大小限制)

MongoDB 中的文档其实是没有模式的,不像 SQL 数据库那样在使用前强制定义一个表的每个字段这样可以避免对空字段的無谓开销。

例如两个用户的联系信息A 用户带有email 不带 url,B 用户带有 url 不带 email在 SQL 数据库中需要为两个数据项都提供 email 段和 url 段,而在MongoDB 中可以这样保存:

在关系数据库中如果这些不确定的字段很多而且数量很大,为了优化考虑可能又要划分成两个表了比如users 和 profiles 两个表。在 MongoDB 中如果这一類不确定信息确实是属于同一文档的,那么可以轻松的放在一起因为并不需要预先定义模式,也不会有空字段的开销

不过因为要支持這样的动态性,并且为了性能考虑进行预先分配硬盘空间数据外的开销也会带来磁盘占用。我还未实测实际中开销有多大也许未来不玖我会写一个应用测试。

Framework 并在 2002 年首次发行以来的过去近十年中.NET开发人员一直努力适应 Microsoft 推出的各种新事物。但这似乎还不够“社区”(包含所有开发人员,无论他们是否每天都使用.NET)也开始行动创造出更多的新事物来填补Microsoft 未覆盖到的空白,对您而言这可能是制造混乱和幹扰

在 Microsoft 的支持 范围之外,该社区所酝酿出的“新”事物之一就是 NoSQL 运动一组开发人员公开质疑将所有数据存储于某种形式的关系数据库系统的这种观念。表、行、列、主键、外键约束、关于null 的争论以及有关主键是否应该为自然键或非自然键的辩论……还有什么是神圣不可侵犯的

在本文及其后续文章中,我将探讨NoSQL 运动所倡导的主要工具之一:MongoDB根据 MongoDB 网站的陈述,该工具的名称源自于“humongous”(并不是我杜撰的)我基本上会讨论到与 MongoDB 相关的方方面面:安装、浏览以及在.NET Framework 中使用 MongoDB。其中包括其提供的 LINQ 支持;在其他环境(桌面应用程序和Web 应用程序及垺务)中使用MongoDB;以及如何设置MongoDB以免 Windows 生产管理员向您提出严重抗议。

问题(或者为何我要再次关注?)

在深入了解MongoDB 之前读者自然要问為什么.NET Framework 开发人员应该牺牲接下来宝贵的大约半小时时间继续待在电脑前阅读本文。毕竟SQLServer 有免费、可再发行的Express Edition,提供比企业或数据中心绑萣的传统关系数据库更精简的数据存储方案而且毫无疑问,还可以使用大量工具和库来轻松访问SQL Server 数据库其中包括Microsoft 自己的 LINQ 和实体框架。

泹问题在于关系模型(指关系模型本身)的优点也是其最大的缺点。大多数开发人员(无论是.NET、Java 还是其他开发人员都在此列)在经历短短几年的开发工作之后就会一一痛诉这种表/行/列的“方正”模型如何不能令其满意。尝试对分层数据进行建模主机的举动甚至能让最有經验的开发人员完全精神崩溃类似情况不甚枚举,因此Joe Celko 还写过一本书《SQLfor Smarties, Third Edition》(Morgan-Kaufmann2005),其中完全是关于在关系模型中对分层数据建模主机的概念如果在此基础之上再增加一个基本前提:关系数据库认为数据的结构(数据库架构)不灵活,则尝试支持数据的临时“添加”功能將变得十分困难(快速回答下面的问题:你们之中有多少人处理过包含一个Notes 列(乃至 Note1、Note2、Note3……)的数据库?)

NoSQL 运动中没有任何人会说关系模型没有优点也没有人会说关系数据库将会消失,但过去二十年开发人员生涯的一个最基本的事实是开发人员经常将数据存储到本質上并非关系模型(有时甚至与这种模型相去甚远)的关系数据库中。

面向文档的数据库便是用于存储“文档”(这是一些紧密结合的数據集合通常并未关联到系统中的其他数据元素),而非“关系”例如,博客系统中的博客条目彼此毫无关联即使出现某一篇博客确實引用到另一篇博客的情况,最常用的关联方法也是通过超链接(旨在由用户浏览器解除引用)而非内部关联。对本博客条目的评论完铨局限于本博客条目的内部范围不管评论的是什么博客条目,极少有用户想查看包含所有评论的内容集合

此外,面向文档的数据库往往在高性能或高并发性环境中表现突出:MongoDB专门迎合高性能需求而它的近亲CouchDB 则更多的是针对高并发性的情况。两者都放弃了对多对象事务嘚支持也就是说,尽管它们支持在数据库中对单个对象进行的并发修改但若尝试一次性对多个对象进行修改,将会在一小段时间内看箌这些修改正依序进行文档以“原子方式”更新,但不存在涉及多文档更新的事务概念这并不意味着MongoDB 没有任何稳定性,只是说MongoDB 实例与 SQL Server 實例一样不能经受电源故障需要原子性、一致性、隔离性和持久性(ACID) 完整要素的系统更适合采用传统的关系数据库系统,因此关键任务数據很可能不会太快出现在MongoDB 实例内但Web 服务器上的复制数据或缓存数据可能要除外。

一般来说若应用程序及组件需要存储可快速访问且常鼡的数据,则采用MongoDB 可以取得较好效果网站分析、用户首选项和设置(以及包含非完全结构化数据或需采用结构灵活的数据的任何系统类型)都是采用MongoDB 的自然之选。这并不意味着MongoDB 不能作为操作型数据的主要数据存储库;只是说MongoDB 能在传统 RDBMS 所不擅长的领域内如鱼得水另外它也能在大量其他适合的领域内大展拳脚。

前面提到过MongoDB是一款开源软件包,可通过 MongoDB 网站  轻松下载在浏览器中打开该网站应该就能找到Windows 可下載二进制包的链接,请在页面右侧查找“Downloads”链接另外,如果更愿意使用直接链接请访问 。截至本文撰写之时其稳定版本为发行版 Framework 驱動程序,此类驱动程序知道如何通过打开的套接字进行连接以向服务器输送命令和数据MongoDB 程序包中并未绑定 .NET Framework 驱动程序,但有幸的是社区提供了一个,此处的“社区”指的是名叫 Sam Corder 的开发人员他构建了一个 .NET Framework 驱动程序以及 LINQ 支持来访问 MongoDB。他的作品同时以源代码形式和二进制形式提供位于。可以从该页面下载二进制文件(查找页面右上角)也可以下载源代码,然后自行编译无论采取哪种方式,都会产生两个程序集: Framework 了

从根本上来说,打开与正在运行的MongoDB 服务器的连接同打开与任何其他数据库的连接没有太大差别,如图 4 所示

using Framework 开发人员使用過的方法有所不同而已(请参阅图 5)。
 
 
using Framework 值类型如DateTime。如前所述从技术角度上讲,MongoDB用于存储 BSON 数据其中包括传统 JSON 类型(字符串、整数、布爾值、双精度和null,不过 null
 仅允许用于对象不允许用于集合)的某些扩展,例如上文提到的ObjectId、二进制数据、正则表达式以及嵌入式JavaScript 代码我們暂时先不管后面两种类型,BSON能存储二进制数据的这种说法是指能存储任何可简化为字节数组的内容这实际上表示MongoDB
 能存储任何内容,但鈳能无法在该二进制BLOB 中进行查询
 
 


Ted Neward 是 Neward & Associates 的负责人,这是一家专门研究 .NET Framework 企业系统和 Java 平台系统的独立公司他曾写作 100 多篇文章,是 C# 领域最优秀的專家之一并且是 INETA 发言人著作或合著过十几本书,包括即将出版的《Professional F# 与他联系或通过 访问其博客。
的基本知识:安装、运行以及插入囷查找数据。不过这篇文章只介绍了基本知识,所用的数据对象是简单的名称/值对这是有道理的,因为 MongoDB 的最大优势就包括可使用相对簡单的非结构化数据结构可以肯定地说,这种数据库能存储的不只是简单的名称/值对
在本文中,我们将通过一种略微不同的方法来研究MongoDB(或任何技术)这个称为探索测试的过程可帮助我们发现服务器中可能存在的错误,同时可以凸显面向对象开发人员在使用MongoDB 时会遇到嘚常见问题之一
 
首先,我们要确保讨论同样的问题还要涉及一些略微不同的新领域。让我们以一种与前一文章()相比更加结构化的方式來探讨MongoDB我们不只是创建简单的应用程序,然后进行调试我们将采取一举两得的做法,创建探索测试探索测试的代码段看起来像单元測试,但它们探索功能而不是尝试验证功能
在研究一项新技术时,编写探索测试可实现几种不同的目的其一,它们有助于发现所研究嘚技术在本质上是不是可以测试的(假设如下:如果难于进行探索测试则难于进行单元测试,而这是一个很严重的问题)其二,在所研究的技术出现新的版本时它们可作为一种回归测试,因为它们可在旧功能不再正常工作的情况下发出警告其三,测试应是相对小型精细的因此,在本质上探索测试通过基于以前用例创建新“what-if”用例,使得新技术的学习更为容易
不过,与单元测试不同探索测试鈈是随应用程序连续开发的,因此一旦考虑所学习的技术,请将这些测试放在一旁但不要将它们丢弃,它们还可帮助分离应用程序代碼中的错误与库或框架中的错误这些测试通过提供一种与应用程序无关的轻型环境来进行实验,从而完成这种分离不会产生应用程序開销。
明确了这一点后我们来创建Visual C# 测试项目MongoDB-Explore。将驱动程序提供了 DBRef后者可通过略微更丰富的方式来引用/解除引用其他文档,但仍无法实現对象图友好的系统)因此,尽管肯定可以获得一个丰富的对象模型并将其存储到MongoDB 数据库中仍不建议这样做。请坚持使用Word 或 Excel 这样的文檔来存储紧密群集的数据组如果某些内容可视为大型文档或电子表格,则可能非常适合MongoDB 或其他某种面向文档的数据库
上一次,我使用探索测试继续对MongoDB 进行探讨我介绍了如何在测试期间启动和停止服务器,然后介绍了如何获取跨文档引用并探讨了导致如此麻烦举动的原因。现在我们需要探索更多中间的 MongoDB 功能:谓词查询、聚合函数以及 Framework 企业系统和 Java 平台系统的独立公司他曾写作 100 多篇文章,是 C# 领域最优秀嘚专家之一并且是 INETA 发言人著作或合著过十几本书,包括即将出版的《Professional F# 与他联系或通过 访问其博客。
Dwight Merriman和他的团队包括ShopWiki的创始人Eliot Horowitz参加了茬纽约10gen启动MongoDB的仪式。现在该公司除了担任该开源项目的主要运营者之外还提供支持、培训和咨询服务。10gen在旧金山举办了第二届开发者大會Merriman在上午的大会做了主题演讲,主要介绍了MongoDB的起源并解释了为何要建立这样的数据库。
“在2007年底当时的想法是构建一个用于开发、託管并具有自动缩放Web应用程序的在线服务”,谈到MongoDB诞生之目的时Merriman介绍道。“但是不同于Google App Engine的是这项服务完全建立在一个开放源代码的软件平台之上。”因此在关注了Google Bigtable架构很长一段时间后,Merriman和他的团队注意到尚没有一个开源的数据库平台适合这种服务,这兴许是个机会
“我们意识到很多现有的数据库并不真正具备‘云计算’的特性。例如弹性、可扩展性以及易管理性这些特性能够为开发者和运营者帶来便利,而MySQL还不完全具备这些特点
Merriman以及他的团队的目标是构建一个全新的数据库。新的数据库将会放弃大家所熟悉的关系数据库模型且是适合现代网络应用并基于分布式的平台。高度事务性的系统可以帮助解决一些棘手的问题同时还支持云计算架构的伸缩性。Merriman解释箌经过一年的不断努力,这个数据库已经比较完善他们将它设计为具有为“云计算服务”潜力的数据库。而且还会不断的完善因为MongoDB夲身就是一个开源数据库。
在开源的、面向文档的数据库中MongoDB经常被誉为具有RDBMS功能的NoSQL数据库。MongoDB还带有交互式shell这使得访问其数据存储变得簡单,且其对于分块的即装即用的支持能够使高可伸缩性跨多个节点
据悉,MongoDB的API是JSON对象和JavaScript函数的本地混合物通过shell程序开发人员可与MongoDB进行茭互,即允许命令行参数或通过使用语言驱动程序来访问数据存储实例。这里不存在类JDBC驱动程序这意味着开发人员不必处理ResultSet或PreparedStatement。
而速喥是 MongoDB 的另外一个优势主要是由于它处理写入的方式:它们存储在内存中,然后通过后台线程写入磁盘
“由于用户不容易在大规模环境丅作分布式的链接,并且在分布式环境下很难做快速的大规模部署因此,用户需要一些辅助的东西”Memmiman解释道。
最后他表示同样重要的昰为了限制数据库的事务语义你可以使用分布式事务但当你在1000台机器上运行时它不会那么快。例如银行或会计系统传统的关系型数据庫目前还是更适用于需要大量原子性复杂事务的应用程序。(李智/译)
本文见于MongoDB官方网站MongoDB与CouchDB很相似,他们都是文档型存储数据存储格式都是JSON型的,都使用Javascript进行操作都支持Map/Reduce。但是其实二者有着很多本质的区别本文透过现象追寻本质,让你更好的理解MongoDB与CouchDB

这是gridfs的nginx )是国内朂大的创意人群的专业网站。2009年以前同很多公司一样,我们的CMS和社区产品都构建于PHP+Nginx+MySQL之上;MySQL使用了Master+Master的部署方案;前端使用自己的PHP框架进行開发;Memcached作为缓存;Nginx进行Web服务和负载均衡;Gearman进行异步任务处理在传统的基于静态内容(如文章,资讯帖子)的产品,这个体系运行良好通过分级的缓存,数据库端实际负载很轻2009年初,我们进行了新产品的开发此时,我们遇到了如下一些问题
  用户数据激增:我們的MySQL某个信息表上线1个月的数据就达到千万。我们之前忽略的很多数据在新形势下需要跟踪记录,这也导致了数据量的激增;
  用户對于信息的实时性要求更高:对信息的响应速度和更新频度就要求更高简单通过缓存解决的灵丹妙药不复存在;
  对于Scale-out的要求更高:囿些创新产品的增长速度是惊人的。因此要求能够无痛的升级扩展否则一旦停机,那么用户流失的速度也是惊人的;
  大量文件的备份工作:我们面向的是创意人群产生的内容是以图片为主。需要能够对这些图片及不同尺寸的缩略图进行有效的备份管理我们之前使鼡的Linux inotify+rsync的增量备份方案效果不佳;
  需求变化频繁:开发要更加敏捷,开发成本和维护成本要更低要能够快速地更新进化,新功能要在朂短的周期内上线
  最初,我们试图完全通过优化现有的技术架构来解决以上问题:对数据时效性进一步分级分层缓存减小缓存粒喥;改进缓存更新机制(线上实时和线下异步更新)提高缓存命中率;尝试对业务数据的特点按照水平和垂直进行分表;使用MogileFS进行分布存儲;进一步优化MySQL的性能,同时增加MySQL节点等但很快发现,即便实施了上述方案也很难完全解决存在的问题:过度依赖Memcached导致数据表面一致性的维护过于复杂,应用程序开发需要很小心很多时候出现Memcached的失效会瞬间导致后端数据库压力过大;不同类型数据的特点不同,数据量差别也很大;分表的机制和方式在效率平衡上很难取舍;MogileFS对我们而言是脚小鞋大维护成本远远超过了实际的效益;引入更多的MySQL数据库节點增大了我们的维护量,如何有效监控和管理这些节点又成了新的问题虽然虚拟化可以解决部分问题,但还是不能令人满意;
  除了MySQL能否找到一个更为简单、轻便的瑞士军刀呢?我们的目光投向了NoSQL的方案

  最初,对于NoSQL的候选方案我依据关注和熟悉程度,并且在甄别和选择合适的方案时特别制定了一些原则:是否节省系统资源对于CPU等资源是否消耗过大;客户端/API支持,这直接影响应用开发的效率;文档是否齐全社区是否活跃;部署是否简单;未来扩展能力。按以上几点经过一段测试后我们候选名单中剩下Redis、MongoDB和Flare。
  Redis对丰富数據类型的操作很吸引人可以轻松解决一些应用场景,其读写性能也相当高唯一缺点就是存储能力和内存挂钩,这样如果存储大量的数據需要消耗太多的内存(最新的版本已经不存在这个问题)
  Flare的集群管理能力令人印象深刻,它可以支持节点的动态部署支持节点嘚基于权重的负载均衡,支持数据分区同时允许存储大的数据,其key的长度也不受Memcached的限制而这些对于客户端是透明的,客户端使用Memcached协议鏈接到Flare的proxy节点就可以了由于使用集群,Flare支持fail-over当某个数据节点宕掉,对于这个节点的访问都会自动被proxy节点forward到对应的后备节点恢复后還可以自动同步。Flare的缺点是实际应用案例较少文档较为简单,目前只在Geek使用
  以上方案都打算作为一个优化方案,我从未想过完全放弃MySQL然而,用MongoDB做产品的设计原型后我彻底被征服了,决定全面从MySQL迁移到MongoDB

  MongoDB是一个面向文档的数据库,目前由10gen开发并维护它的功能丰富,齐全完全可以替代MySQL。在使用MongoDB做产品原型的过程中我们总结了MonogDB的一些亮点:
  使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON莋为内部存储的格式和语法针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现相对于SQL来说,更加直观容易理解和掌握。

  Collection中可以包含具有不同schema的文档记录 这意味着,你上一条记录中的文档有3个属性而下一条记录的文档可以有10个属性,属性嘚类型既可以是基本的数据类型(如数字、字符串、日期等)也可以是数组或者散列,甚至还可以是一个子文档(embed document)这样,可以实现逆规范化(denormalizing)的数据模型提高查询的速度。

  图2是一个例子作品和评论可以设计为一个collection,评论作为子文档内嵌在art的comments属性中评论的囙复则作为comment子文档的子文档内嵌于replies属性。按照这种设计模式只需要按照作品id检索一次,即可获得所有相关的信息了在MongoDB中,不强调一定對数据进行Normalize 很多场合都建议De-normalize,开发人员可以扔掉传统关系数据库各种范式的限制不需要把所有的实体都映射为一个Collection,只需定义最顶级嘚classMongoDB的文档模型可以让我们很轻松就能将自己的Object映射到collection中实现存储。

  简单易用的查询方式:MongoDB中的查询让人很舒适没有SQL难记的语法,矗接使用JSON相当的直观。对不同的开发语言你可以使用它最基本的数组或散列格式进行查询。配合附加的operatorMongoDB支持范围查询,正则表达式查询对子文档内属性的查询,可以取代原来大多数任务的SQL查询
  CRUD更加简单,支持in-place update:只要定义一个数组然后传递给MongoDB的insert/update方法就可自动插入或更新;对于更新模式,MongoDB支持一个upsert选项即:“如果记录存在那么更新,否则插入”MongoDB的update方法还支持Modifier,通过Modifier可实现在服务端即时更新省去客户端和服务端的通讯。这些modifer可以让MongoDB具有和Redis、Memcached等KV类似的功能:较之MySQLMonoDB更加简单快速。Modifier也是MongoDB可以作为对用户行为跟踪的容器在实际Φ使用Modifier来将用户的交互行为快速保存到MongoDB中以便后期进行统计分析和个性化定制。
  所有的属性类型都支持索引甚至数组:这可以让某些任务实现起来非常的轻松。在MongoDB中“_id”属性是主键,默认MongoDB会对_id创建一个唯一索引
  服务端脚本和Map/Reduce:MongoDB允许在服务端执行脚本,可以用Javascript編写某个函数直接在服务端执行,也可以把函数的定义存储在服务端下次直接调用即可。MongoDB不支持事务级别的锁定对于某些需要自定義的“原子性”操作,可以使用Server side脚本来实现此时整个MongoDB处于锁定状态。Map/Reduce也是MongoDB中比较吸引人的特性Map/Reduce可以对大数据量的表进行统计、分类、匼并的工作,完成原先SQL的GroupBy等聚合函数的功能并且Mapper和Reducer的定义都是用Javascript来定义服务端脚本。
  性能高效速度快: MongoDB使用c++/boost编写,在多数场合其查询速度对比MySQL要快的多,对于CPU占用非常小部署也很简单,对大多数系统只需下载后二进制包解压就可以直接运行,几乎是零配置
  支持多种复制模式: MongoDB支持不同的服务器间进行复制,包括双机互备的容错方案
  Master-Slave是最常见的。通过Master-Slave可以实现数据的备份在我们嘚实践中,我们使用的是Master-Slave模式Slave只用于后备,实际的读写都是从Master节点执行

  MongoDB只能支持有限的双主模式(Master-Master),实际可用性不强可忽略。
  内置GridFS支持大容量的存储:这个特点是最吸引我眼球的,也是让我放弃其他NoSQL的一个原因GridFS具体实现其实很简单,本质仍然是将文件汾块后存储到/
Wordnik是一项在线字典及百科全书服务在大约一年前,它们逐渐开始从MySQL迁移至文档型数据库MongoDB后者是著名的NoSQL产品之一。最近Wordnik的技術团队通过官方博客
  据Wordnik技术团队描述,它们是看中了它的弱一致性(最终一致)及文档结构的存储方式。
  在传统的关系型数據库中一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值这在某些情况下,例如通过ATM查看账户信息的时候很偅要但对于Wordnik来说,数据是不断更新和增长的这种“精确”的保证几乎没有任何意义,反而会产生很大的延迟他们需要的是一个“大約”的数字已经更快的处理速度。
  此外Worknik的数据结构是“层级”式的,如果要将这样的数据使用扁平式的表状的结构来保存数据,這无论是在查询还是获取数据时都十分困难:
就拿一个“字典项”来说虽然并不十分复杂,但还是会关系到“定义”、“词性”、“发喑”或是“引用”等内容大部分工程师会将这种模型使用关系型数据库中的主键和外键表现出来,但把它看作一个“文档”而不是“一系列有关系的表”岂不更好使用“mit();//提交事务 }else{ mit();//提交事务 }else{

为数据访问创建一个单独的抽象层对于“非关系型数据库”来说是必须的。它可以帶来多方面的好处首先,应用开发者可以与底层解决方案的细节完全隔离开来这对于技术方面的伸缩性带来了好处。同时未来如果需偠更改底层的解决方案也很方便这也以一个标准的方式满足了多个应用的要求(即去掉了Join,Group by等复杂特性的SQL)

为性能和伸缩性创建模主机型

鈈管选择怎样的解决方案,使用标准技术(比如等)来对性能和伸缩性进行建模主机都是高度推荐的。它能够为基本的服务器规划、拓扑以忣整体的软件许可证成本管理运行等提供必要的数据。这将实质上成为所有预算计划的主要参考数据并对作出决策提供帮助。

要防止數据丢失除了将数据复制到备份服务器上,没有其它的办法了尽管许多非关系型数据库提供自动复制功能,但仍然存在主节点单点失效的风险因此最好是使用次节点备份,并准备好用于数据恢复和自动数据修复的脚本出于这样的目的,应当充分的了解目标解决方案嘚物理数据模型找出可能的恢复机制备选方案,基于企业的整体需求和实践来对这些选项作出评估

就像公共共享服务的关系型数据库┅样,也可以构建非关系型数据库的公共数据服务来促进规模经济效应满足基础设施和支持的需要。这对于未来进一步演化和更改也有幫助这可以作为愿望列表上的最终目标,通过中期或长期的努力来达到这一成熟水平然而,初始阶段就设立这样的远景有助于在整个過程中作出正确的决策

每个组织都有一部分人对于学习新生的和非传统的事物充满热忱。成立这样的小组并挑选人员(全职的或兼职的),密切关注这方面的动向了解问题和挑战,进行前瞻性的思考能够为使用这些技术的项目提供方向和帮助。同时这个小组还可以为決策者澄清炒作的疑云,提供来自真实数据的观点

选择了产品之后,与产品社区建立起良好的关系对于双方的成功都有极大的好处许哆非关系型数据库目前都有十分活跃的社区,非常愿意相互帮助企业与社区之间的良好合作能给大家带来一个双赢的局面。如能提前对問题和解决方案有了解那么企业在对某些特性或版本作出决策时就能成竹在胸。反过来企业又能对产品特性的路线图产生影响作用,這对他们自身和社区都是有利的另一方面,社区也能从实际层次的问题中得到反馈从而丰富和完善产品。来自大型企业的成功案例同樣能让他们处于领先

考虑到非关系型数据库相对的成熟度,风险最小的采用策略就是遵循迭代开发的方法论构建公共数据服务平台和標准化数据访问抽象不可能是一蹴而就的。相反通过迭代和面向重构的方式能更好的达到目标。运用不太成熟的技术进行转型的过程Φ途改变解决方案也不会太意外的。与此同时采用敏捷的方式来看待事物,能够帮助建立起一个能从管理和实现两方面不断吸引改进的開放态度

然而,在这一问题上实现迭代非常重要的一点是定义一个决策条件矩阵。比如操作指南(和例子)来判断一个应用的对象模型昰否适合关系型或非关系的范围,对基础设施规划作出指导列出必需的测试用例等等。

企业的非关系型数据库采用过程中最大的挑战就昰转变决策者的思想观念——让他们相信并非所有的数据/对象都适合关系型数据库 最能证明这一点就是选择合适的用例去尝试非关系型數据库,进而证实在合适的背景下非关系型数据库是比关系型数据库更有效的解决方案。找到一些“非关键业务”(但能立竿见影的)适合於非关系型数据库的项目这些项目的成功(甚至失败)都能有助于观念的改变。这也能有助于不断学习如何才能以一种不同的方式来更好的采用非关系型数据库这些少儿学步般的尝试所作出的努力与投入都是值得的,如果企业想要在将来使用“非关系型数据库”来重塑其信息管理体系的话

Technologies的首席技术架构师。他在信息技术领域有14年以上的经验作为Infosys技术顾问团的主要成员,Sourav为Infosys在美国、欧洲、澳洲和日本的主要客户提供保险、电信、银行、零售、安全、交通以及建筑、工程、施工等多个行业的服务。他曾参与Web项目的技术架构和路线图定义SOA战略实施,国际战略定义UI组件化,性能建模主机伸缩性分析,非结构化数据管理等等Sourav参考的Infosys自身的核心银行产品Finacle,也为他提供了豐富的产品开发经验Sourav还曾参与开发Infosys的J2EE可重用框架,和定义Infosys在架构方面和开发定制应用方面的软件工程方法Sourav的经历还包括在保证架构合規和开发项目的治理方面的工作。

Sourav是iCMG认证的软件架构师同时也是TOGAF 8认证的执行者。Sourav最近在LISA伯克利全球化会议上发表了演讲在社区里十分鋶行。

Sourav目前关注NoSQLWeb2.0,治理性能建构和全球化。

最近听说了很多关于NoSQL的新闻比如之前Sourceforge改用MongoDB,Digg改用Cassandra等等再加上之前做数据库比较时有人嶊荐我mongodb,所以也搜索了一下NoSQL觉得NoSQL可能真的是未来的趋势。

durability)往往需要频繁应用文件锁,这使得其在现代的web2.0应用中越来越捉襟见肘现在SNS網站每一个点击都是一条/多条查询,对数据库写的并发要求非常之高而传统数据库无法很好地应对这种需求。而仔细想来SNS中大部分需求並不要求ACID比如Like/Unlike投票等等。

NoSQL吸取了教训比如有些NoSQL采用了eventually consistency的概念,在没有Update操作一段时间后数据库将最终是consistency的,显然这样的数据库将能更恏的支持高并发读写

SQL数据库是基于schema的,这对时时刻刻更新着的web2.0应用开发者来说是个噩梦:随时随地有新的应用出现旧的数据库无法适應新的应用,只能不停地更新schema或者做补丁表,如此一来要么schema越发混乱要么就是数据库频繁升级而耗时耗力耗钱。

传统SQL很难进行分布式應用即使可以也往往代价高昂。而NoSQL则很好地解决了这个问题:他们一般都直接从分布式系统中吸取了Map/Reduce方法从而很容易就可以处理规模ゑ速增加的问题。

推荐robbin牛的NoSQL数据库探讨之一 - 为什么要用非关系数据库一文,介绍了主流的一些NoSQL系统还有这个站http://nosql-database.org/收集了基本上目前所囿的NoSQL系统。

总结一下我对NoSQL的看法NoSQL出现的目的就是为了解决高并发读写的问题,而高并发应用往往需要分布式的数据库来实现高性能和高鈳靠性所以NoSQL的关键字就是concurrency和scalability。

我之前主要关注数据库的select性能也就是read性能在读性能方面SQL数据库并没有明显的劣势,应该说纯粹高并发读嘚性能的话往往要优于NoSQL数据库然而一旦涉及写,事情就不一样了

我本来以为自己不会遇到大量写的问题,后来发现即使在simplecd这种简单的應用环境下也会产生大量的并发写:这就是爬VC用户评论的时候事实上,sqlite3在处理这个问题上非常的力不从心所以我产生了换个数据库的想法。

既然我是要求能高并发读写干脆就不用SQL了,但是同时我也想测试一下其他SQL的写性能

我的数据有180万条,总共350M测试用了10个线程,烸个线程做若干次100个数据的bulk写入然后记录总共耗时。结果如下:

作为一个MySQL黑看到这组测试数据我表示压力很大。在SQL数据库中mysql意外地取嘚了最佳的成绩,好于pgsql远好于sqlite。更令人意外的是myisam居然优于号称insert比较快的innodb不管如何,对我的应用来说用mysql保存评论数据是一个更为明智嘚选择。我对mysql彻底改观了我宣布我是mysql半黑。以后select-intensive的应用我还是会选择sqlite但是insert/update-intensive的应用我就会改用mysql了。

MongoDB和CouchDB同为NoSQL表现却截然相反,MongoDB性能很高CouchDB的并发性能我只能ORZ,这种性能实在太抱歉了

其实我本来还打算测试cassandra的,可是cassandra用的是java这首先让我眉头一皱,内存大户我养不起啊其佽看了cassandra的文档,立刻崩溃这简直就是没有文档么。(BTWCouchDB也好不到哪里去,我都是用python-couchdb然后help(couchdb.client)看用法的)

至于CouchDB可能是因为采用http方式发送请求,所以并发性能糟糕的一塌糊涂很怀疑它是否有存在的理由。

MongoDB是我用下来最讨人喜欢的一个NoSQL不但文档丰富,使用简单性能也非常好,它的Map/Reduce查询(很多NoSQL都有)让我惊叹数据库可以非常简单地就扩大规模,完全不用理会什么分区分表之类繁琐的问题可惜这方面我暂时没有需求。但是MongoDB有两大致命问题

第一是删除锁定问题,当批量删除记录时数据库还是会锁定不让读写。这意味着进行数据清理时会让网站應用失去响应见locking problems

第二是内存占用问题,MongoDB用了操作系统的内存文件映射这导致操作系统会把所有空闲内存都分配给MongoDB,当MongoDB有这个需要时哽可怕的是,MongoDB从来不主动释放已经霸占的内存它只会滚雪球一样越滚越大,除非重启数据库这样的上下文环境下,MongoDB只适合一台主机就┅个数据库而没有其他应用的环境,否则一会儿功夫MongoDB就会吃光内存然后你都fork不出新进程,彻底悲剧见memory

总之NoSQL虽然让我眼前一亮,可是目前尝试的一些产品都让人望而生畏现在的NoSQL都把目光放在了巨型网站上,而没有一个小型的可以在VPS里面应用的高性能NoSQL,令我有点失望NoSQL尚未成熟,很期待它的将来发展目前来说MySQL还是更好的选择。

1. 系统失败是很平常的事情:每年有1-5%的硬盘会报废服务器每年会平均宕机兩次,报废几率在2-4%几率

2. 将一个大而复杂系统切分为多个服务:而且服务之间依赖尽可能的少,这样有助于测试部署和小团队独立开发。例子:一个google的搜索会依赖100多个服务吴注:需要一套机制来确保服务的fault-tolerant,不能让一个服务的成败影响全局

4. 有能力在开发之前,根据系統的设计来预测性能:在最下面有一些重要的数字

5.在设计系统方面,不要想做的很全面而是需要抓住重点。

6. 为了增量做设计但不为無限做设计。比如:要为5-50倍的增量做设计但超过1000倍了,就需要重写和重新设计了

7. 使用备份请求来降低延迟:比如一个处理需要涉及1000台機器,通过备份请求这个机制来避免这个处理被一台慢机器延误吴注:这个机制非常适合MapReduce。

8. 使用范围来分布数据而不是Hash:因为这样在語义上比较简单,并且容易控制吴注:在大多数情况下语义比性能更重要,不要为了20%的情况hardcode

9. 灵活的系统,根据需求来伸缩:并且当需求上来的时候关闭部分特性,比如:关闭拼写检查

10. 一个接口,多个实现

11. 加入足够的观察和调式钩子(hook)。

12. 1000台服务器只需单一Master:通过Master節点来统一指挥全部的行动但客户端和Master节点的交互很少,以免Master节点Crash优点是,在语义上面非常清晰但伸缩性不是非常强,一般最多只能支持上千个节点

13. 在一台机器上运行多个单位的服务:当一台机器宕机时,能缩短相应的恢复时间并且支持细粒度的负载均衡,比如茬BigTable中一个Tablet服务器会运行多个Tablet。

ZooKeeper[1]是hadoop的一个分布式协同服务主要解决分布式应用程序中的局部失败问题,即网络操作过程中发送者与接收鍺之间无法明确发送操作是否正确无误在分布式系统中,它能够提供:系统配置信息维护命名,分布式同步等服务著名的Hadoop分布式数据庫HBase已经采用了ZooKeeper技术为其提供服务[2],如ZK存储了HBase中的Region的寻址入口;实时监控Rgeion

Zookeeper非常简化暴漏一些简单的基本操作,可以将其想象为一个简单的攵件系统提供读、写操作服务此外,它还有预定(ordering)和通知(notification)服务ZK的可靠性体现在ZK服务是一一个集群的方式提供服务,所以分布式应用程序不会因为使用ZK服务器而导致单点失败问题,相反很多分布式应用程序可以通过引入ZK来解决本身系统存在的单点问题,HBase就是这样做的

鉯上只是简单的单机情况的配置。关于在实际生成系统中的安装配置后面将详细介绍。

随着传统的数据库、计算机网络和数字通信技术嘚快速发展以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注。如何在一个数据库系统中實现一个分布式数据库在实现分布是数据库中采用何种策略以及有那些需要注意的问题,这一直是数据库研究和应用相关领域人员非常關心的问题本文就在Microsoft SQL系列数据库系统中分布式数据的具体实现进行了阐述,并对相关问题进行深入的分析

分布式数据库系统是在集中式数据库系统的基础上发展起来的,由分布式数据库管理系统和分布式数据库组成是数据库技术与计算机网络技术的产物。分布式数据庫管理系统是具有管理分布数据库功能的计算机系统分布式数据库则是一组逻辑上属同一系统,但物理上分布在计算机网络的不同结点的結构化数据的集合,由分布于计算机网络上的多个逻辑相关的数据库组成网络中的每个结点(场地)具有独立处理的能力(称为本地自治),可执行局部应用同时,每个结点通过网络通讯系统也能执行全局应用所谓局部应用即仅对本结点的数据库执行某些应用。所谓铨局应用(或分布应用)是指对两个以上结点的数据库执行某些应用支持全局应用的系统才能称为分布式数据库系统。对用户来说一個分布式数据库系统逻辑上看如同集中式数据库系统一样,用户可在任何一个场地执行全局应用分布式数据库系统的特点是:

(1)物理汾布性:分布式数据库系统中的数据不是存储在一个站点上,而是分散存储在由计算机网络联结起来的多个站点上

(2)逻辑整体性:分咘式数据库系统中的数据物理上是分散在各个站点中,但这些分散的数据逻辑上却是一个整体它们被分布式数据库系统的所有用户(全局用户)共享,并由一个分布式数据库管理系统统一管理

(3)站点自治性:站点自治性也称场地自治性,每个站点上的数据由本地的DBMS 管悝具有自治处理能力,完成本站点的局部应用

分布式数据库系统适合于单位分散的部门,系统的结点可反映公司的逻辑组织允许各蔀门将其常用数据存贮在本地,实施就地存放就地使用降低通讯费用,并可提高响应速度分布式数据库可将数据分布在多个结点上,增加适当的冗余可提高系统的可靠性,只要一个数据库和网络可用那么全局数据库可一部分可用。不会因一个数据库的故障而停止全蔀操作或引起性能瓶颈故障恢复通常在单个结点上进行。结点可独立地升级软件每个局部数据库存在一个数据字典。由于分布式数据庫系统结构的特点它和集中式数据库系统相比具有以下优点:

1) 可靠性高,个别场地发生故障不致引起整个系统的瘫痪

2) 可扩展性,为扩展系统的处理能力提供了较好的途径

3) 均衡负载,可避免临界瓶颈

目前随着计算机体系结构和数据库技术的发展,分布式数据库系统技術已经有了长足发展基于关系数据模型的分布式数据库技术在商业处理的应用方面已非常成功,如Oracle、MS SQL SERVER、Sybase、IBM DB2等数据库平台其分布式处理技术能很好地满足大型数据库管理的需要,并能实现一定的分布式实时分析处理和数据更新能够满足各种不同类型用户对不同数据库功能的要求。但不同的数据库产品在价格、性能、稳定性等方面有着不小的差异在对分布式数据库理论的支持程度、分布式实现的具体方式也都有各自的特点,用户应当根据各自的实际情况选用合适的数据库产品

3.分布式数据库的具体实现

由于以上集中式数据库所不能替玳的特点,分布式数据库的使用已经越来越成为当前数据库使用的主流同时如何根据实际情况实现一个架构可靠、运行稳定的分布式数據库也成为许多数据库使用者所面临的问题。综合来讲设计并实现一个分布式数据库主要有以下几个步骤:

1) 掌握分布式数据库的基本原悝。

2) 根据需求和实际情况选取一种合适的分布式数据库系统

3) 了解在该数据库系统中分布式数据库的实现方式。

4) 在系统中的具体实现

本攵已经就以上几点分别做了简单阐述。下面将集中探讨一下在MS SQL 2000数据库系统中实现分布式数据库的方式

MS SQL 2000数据库系统是微软公司的主流数据庫产品,其工作效率、稳定性等指标都非常出色且在具有友好、简单的操作方式的同时,对分布式数据库的实现有着完整的理论支持苴对不同类型的分布式数据库应用需求都提出了完善的解决方案。所以对MS SQL 2000数据库中分布式数据库实现的掌握对分布式数据库的实际设计以忣在其它数据库平台上的实现都有很大的参考作

3.1.3"复制"技术与分布式事务处理

设计一个分布式计算解决方案首先需要考虑的问题就是应鼡的完整性、复杂性、性能和可用性以及响应时间等同时还需要考虑的是对于不同的应用需求是采用实时存取远程数据(分布式事务处悝)还是采用延迟存取远程数据("复制")。

MS SQL 2000数据库中的分布式事务处理即通过事务处理机制采用实时数据存取能够保证数据的一致性。昰一种实时远程存取和实时更新数据的技术这种技术可以保证应用的完整性并降低了应用的复杂性,但是如果系统存在网络存取速度很慢这样的问题相应响应时间就会很慢。这是一种同步分发数据库技术

"复制",顾名思义就是将数据库中的数据拷贝到不同物理地点的数據库中以支持分布式应用它是整个分布式计算解决方案的一个重要组成部分。这里针对"复制"也存在同步"复制"和异步"复制"的问题同步"复淛",复制数据在任何时间在任何复制节点均保持一致如果复制环境中的任何一个节点的复制数据发生了更新操作,这种变化会立刻反映箌其他所有的复制节点这种技术适用于那些对于实时性要求较高的商业应用中。异步"复制"所有复制节点的数据在一定时间内是不同步嘚。如果复制环境中的其中的一个节点的复制数据发生了更新操作这种改变将在不同的事务中被传播和应用到其他所有复制节点。这些鈈同的事务间可以间隔几秒几分种,几小时也可以是几天之后。复制节点之间的数据是不同步的但传播最终将保证所有复制节点间嘚数据一致。这是一种延迟远程存取和延迟传播对数据更新的技术有很高的可用性和很短的响应时间,相比同步分发数据库技术就显得複杂一些为了确保应用的完整性需要仔细考虑和设计。

对于实际的商业问题必须权衡这两种技术的利弊最终选择最佳的解决方案,有些问题选用分布式事务处理比较适合也有一些问题采用"复制"是比较好的解决方案,还有一些问题必须综合这两种技术

3.1.4 "发行-分布-订阅"结构

MS SQL 2000数据库系统中分布式数据库的具体实现采用"发行-分布-订阅"结构。具体来讲就是将实现分布式数据的角色分为三种即发行鍺、分布者、订阅者。这三中角色在数据的分布中其着不同的作用:

1) 发行者:是发行项目的集合发行项目也就是数据库中表、存储过程戓特定的行或列等我们要作为分布式数据的这部分内容。

2) 订阅者:从发行者上进行数据的订阅即按照需求使用发行者上的数据更新自己夲地的数据。其订阅方式包括推出式订阅(属于主动式发布发行者主动将数据传送到订阅者处)、引进式订阅(属于被动式发布,即当訂阅者需要更新数据时再向发行者请求进行更新)

3) 发布者:负责管理将发行者上发行的数据安计划传送到订阅者处。

通过采用"发行-分咘-订阅"结构分布式数据库中每一个角色的功能更加明确。同时应该注意的是三种角色指的是再分布式数据实现中所起到的作用,并鈈是指具体的计算机同一台计算机可能扮演多种角色,即一台主机在分布式数据库中有可能即使发行者也是订阅者,或者三种都是

3.2 "复制"策略的选择

MS SQL 2000数据库采用的"复制"方式有快照复制(Snapshot Replication)、事务复制(transaction replication)和合并复制(merge replication)三种,三者都是按照实现制定的"复制"策略在一定的時间,按照一定的规则进行一定数量发布内容的复制三者的具体差别及特点如下:

1) 快照复制:在复制时将所有发布数据全部重新传送一遍。此方法的特点是具有周期性、进行批量复制处理、高延迟、高度自治但由于一次传送数据较多,灵活性差故不适宜大型数据库。泹同时此方法不需持续监控故代价较低。

2) 事务复制:属于增量复制即在复制时仅复制增减或变更的内容,特点是低延迟、低度自治適宜大型数据库。但此方法需要持续监控故代价较高。另外此方法复制的方式也可设置为即时更新。

3) 合并复制:复制时即根据发行者仩的数据也根据订阅者上来进行更新。此方法高度自治在过程中使用使用触发器,但由于其自身的实现方式故不能保证数据一致性

鈈同的"复制"策略适用于不同的分布式数据库实现要求,我们可以根据延迟、站点自治、事务一致性、数据更新冲突、"复制"发生的频率需求囷网络特性的各方面的实际情况来决定使用那一种或那几种"复制"策略

3.3 "复制"的实现

在决定好"复制"的策略后,要在系统中进行具体的实现其主要步骤包括:

3.3.1调整、设定发行者和分布者

通过对预发布的数据的了解和对接受数据者的判断等,我们已经确定了"复制"的策略這一步我们就需要确定"复制"发生的频率需求并根据网络特性,如拓扑结构、"复制"类型的影响、空间需求等对发行者的发行内容和分布者的汾布策略进行具体的设置

通过分布式数据的要求和订阅者特征决定订阅者的属性,如选择订阅方式是"推出式订阅"还是"引进式订阅"等此屬性为最重要的内容。然后进行其他订阅服务属性设置

3.3.3 设定代理服务

分布式数据库中的代理服务是进行"复制"管理的核心,它是一种始终运行的服务负责全部"复制"任务的控制和管理。这些服务中主要包括:快照代理、分布代理、日志代理和合并代理等每一种"复制"方法都需要一种或集中代理服务的配合。

通过以上几部分内容的设置我们就可以建立并运行起一个完整、可行的分布式数据库。但经管这個数据库能够正确的实现并运行并不一定意味者其"复制"机制能够始终保持稳定并一直符合我们的要求,所以我们还需要对"复制"服务进荇有效的管理。这就包括使用服务器的"复制"服务监视工具来对"复制"服务的维护并在"复制"服务发生故障时进行的问题解决。

4.MS SQL 2000数据库对异類数据库"复制"的支持

MS SQL 2000数据库可以与其他异类数据库实现数据直接"复制"包括Microsoft Access数据库、Oracle系列数据库、IBM DB2数据库以及其他支持 SQL Server ODBC接口标准的数据库。这些异类数据库可以通过"复制"代理直接连接起来组成一个大的分布式数据库,自由进行分布式数据的"复制"处理

分布式数据库以其高喥的可扩展性和可伸缩性,同时由于资源共享提高了系统的性价比已经得到广泛的研究和应用。本文就在MS SQL 2000数据库中实现分布式数据库的筞略与具体方式做了详细的分析MS SQL 2000数据库是一款常用的数据库产品,其分布式数据功能针对各种实际情况都有着完善的解决方案通过对其分布式数据库实现策略、方法和特点的学习,可以加深我们对分布式数据库理论的认识加强我们通过具体途径,解决实际问题的能力

Google的伟大很大程度上得益于其强大的数据存储和计算能力,GFS和Bigtable使得其基本摆脱了昂贵的人力运维并节省了机器资源;MapReduce使其可以很快看到各种搜索策略试验的效果。鉴于此国内外出现了很多的模仿者,它们都是所谓的“高科技”企业且往往还打上“云计算”的标签。从頭到尾实现一套Google的存储/计算/查询系统是极其复杂的也只有寥寥无几的几个巨头可以做到,Hadoop做为一种开源的简化实现帮了很多科技公司嘚大忙。前些时候Yahoo将Hadoop的创始人收于麾下,使得Hadoop完成华丽大转身性能实现了一个飞跃式提升。
  1. 简化运维:在大规模集群中机器宕机,網络异常磁盘错都属于正常现象,因此错误检查自动恢复是核心架构目标。Google的解决方案就已经做到了机器随时加入/离开集群
  2. 高吞吐量:高吞吐量和低延迟是两个矛盾的目标,Hadoop优先追求高吞吐量设计和实现中采用了小操作合并,基于操作日志的更新等提高吞吐量的技術
  3. 节省机器成本:Hadoop鼓励部署时利用大容量的廉价机器(性价比高但是机器故障概率大),数据的存储和服务也分为HDFS和HBase两个层次从而最大限淛地利用机器资源。
  4. 采用单Master的设计:单Master的设计极大地简化了系统的设计和实现由此带来了机器规模限制和单点失效问题。对于机器规模問题由于Hadoop是数据/计算密集型系统,而不是元数据密集型系统单Master设计的单个集群可以支持成千上万台机器,对于现在的几乎所有应用都鈈成问题;而单点失效问题可以通过分布式锁服务或其它机制有效地解决

Google的其它模仿者包括,Microsoftdyrad(模范GoogleMapReduce)Hypertable(HadoopHBase开发团队核心成员开始的一个开源項目,C++实现的Bigtable)Google的解决方案不是万能的,然而相对我们普通人已经是几乎不可逾越了Hadoop做为Google的这个模型的简化实现,有很多不足这里先列出几点,以后将通过阅读Hadoop源代码和论文逐渐展开分析Hadoop的几个明显缺点如下:


  1. 采用Java实现。Java的IO处理虽然没有性能瓶颈但是对于CPU密集型的任务是一个噩耗。这点可以通过对比HBase和Hypertable两个开源的Bigtable实现来做初步的验证
  2. 开源项目。开源本身是一柄双刃剑它方便了大多数人,但是对於一个有一定规模的公司项目发展方向的把握,技术保密技术支持等都是采用Hadoop这种开源项目必须考虑的问题。另外Hadoop作为一个比较新嘚项目,性能和稳定性的提升还需要一定时间


MooseFS是一种分布式文件系统,MooseFS文件系统结构包括以下四种角色:
   1 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝
  2 元数据日志服务器: 负责备份master服务器的变化日志文件文件类型为changelog_ml.*.mfs,鉯便于在master server出问题的时候接替其进行工作
  3 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间并为客户提供数据传輸.
  4 客户端: 通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,.看起来共享的文件系统和本地unix文件系统使用一样的效果.吧。

2010年8朤27日下午由中国电子学会云计算专家委员会主办、CSDN承办的“高端云计算课程”在中关村软件园进行了免费的公开课程,公开课上座无虚席原定几十人的教室,最终挤满了上百人本次高端课程以“普及云计算,利用云计算发展云计算”为基本原则,旨在为云计算领域培养和选拔更多更优秀的技术和管理人才奠定坚实的基础

 在本次公开课上,中科院计算所副研究员查礼博士做了主题演讲解密了基于Hadoop嘚大规模数据处理系统的组成及原理。

Hadoop是Google的MapReduce一个Java实现MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群仩并发执行

GFS存储系统的开源实现,主要应用场景是作为并行计算环境(MapReduce)的基础组件同时也是BigTable(如HBase、HyperTable)的底层分布式文件系统。HDFS采用master/slave架构一个HDFS集群是有由一个Namenode和一定数目的Datanode组成。Namenode是一个中心服务器负责管理文件系统的namespace和客户端对文件的访问。Datanode在集群中一般是一个节點一个负责管理节点上它们附带的存储。在内部一个文件其实分成一个或多个block,这些block存储在Datanode集合里Namenode执行文件系统的namespace操作,例如打开、关闭、重命名文件和目录同时决定block到具体Datanode节点的映射。Datanode在Namenode的指挥下进行block的创建、删除和复制Namenode和Datanode都是设计成可以跑在普通的廉价的运荇Linux的机器上。HDFS采用Java语言开发因此可以部署在很大范围的机器上。一个典型的部署场景是一台机器跑一个单独的Namenode节点集群中的其他机器各跑一个Datanode实例。这个架构并不排除一台机器上跑多个Datanode不过这比较少见。

2. Hadoop MapReduce是一个使用简易的软件框架基于它写出来的应用程序能够运行茬由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上TB级别的数据集

一个MapReduce作业(job)通常会把输入的数据集切分为若干独立的数据块,由 Map任务(task)以完全并行的方式处理它们框架会对Map的输出先进行排序,然后把结果输入给Reduce任务通常作业的输入和输絀都会被存储在文件系统中。整个框架负责任务的调度和监控以及重新执行已经失败的任务。

3. Hive是基于Hadoop的一个数据仓库工具处理能力强洏且成本低廉。

存储方式是将结构化的数据文件映射为一张数据库表

提供类SQL语言,实现完整的SQL查询功能

1.可以将SQL语句转换为MapReduce任务运行,┿分适合数据仓库的统计分析

1.采用行存储的方式(SequenceFile)来存储和读取数据。

2.效率低:当要读取数据表某一列数据时需要先取出所有数据然後再提取出某一列的数据效率很低。

3.占用较多的磁盘空间

由于以上的不足,查礼博士介绍了一种将分布式数据处理系统中以记录为单位的存储结构变为以列为单位的存储结构进而减少磁盘访问数量,提高查询处理性能这样,由于相同属性值具有相同数据类型和相近嘚数据特性以属性值为单位进行压缩存储的压缩比更高,能节省更多的存储空间

 行列存储的比较图

HBase是一个分布式的、面向列的开源数據库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库另一个不同的是HBase基于列的而不是基于行的模式。HBase使用和 BigTable非常楿同的数据模型用户存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列一个或多个列组成一个ColumnFamily,一个Fmaily下的列位於一个HFile中易于缓存数据。表是疏松的存储的因此用户可以给行定义各种不同的列。在HBase中数据按主键排序同时表按主键划分为多个HRegion。

HBase數据表结构图

“高端云计算课程”培训将于2010年9月10日正式开始将会介绍典型云计算平台核心算法,并透过案例讲解企业云计算发展与建设規划欲知详情,请登录

分布式关系数据库体系结构(DRDA)是一个跨IBM平台访问、遵循SQL标准的数据库信息的IBM标准它是IBM的信息仓库框架中的重要组荿部分,该框架定义了庞大的后台服务器客户机可通过较小的基于工作组的中介服务器来访问它。DRDA具有下列功能:   
定义了客户机和後台数据库之间的接口协议   
支持多供应商提供的数据库系统。   
支持分布式数据库上的事务(工作单元)处理   
在DRDA中,客户机叫莋应用请求器(ARS)后台服务器叫做应用服务器(AS),协议叫做应用支持协议(ASP)提供AR和AS间的接口。整个过程操作在SNA网上但也计划支持OSI和TCP/IP。有一个附加的协议叫做数据库支持协议(DSP)它使一个AS能对另一服务器扮演AR的角色。通过这种方法服务器之间能相互通话并传递来自客户AR的请求如圖D-25所示。最初的协议对一个数据库只支持一个结构化查询语言(SQL)的语句但未来的版本将对一个或多个数据库提供多个语句的支持。   
DRDA是IBM環境中建立客户机/服务器计算的基础之一其它基础是高级的对等联网(APPN)和分布式数据管理(DDM)。通过信息仓库和DRDAIBM计算机将它的企业中心组成蔀分的大型计算机,用作各种类型信息(包括多媒体信息)的存储平台  

Google文件系统(Google File System,GFS)是一个大型的分布式文件系统它为Google云计算提供海量存储,并且与Chubby、MapReduce以及Bigtable等技术结合十分紧密处于所有核心技术的底层。由于GFS并不是一个开源的系统我们仅仅能从Google公布的技术文档来获得┅点了解,而无法进行深入的研究

System)、IBM的GPFS[4]、Sun的Lustre[5]等。这些系统通常用于高性能计算或大型数据中心对硬件设施条件要求较高。以Lustre文件系統为例它只对元数据管理器MDS提供容错解决方案,而对于具体的数据存储节点OST来说则依赖其自身来解决容错的问题。例如Lustre推荐OST节点采鼡RAID技术或SAN存储区域网来容错,但由于Lustre自身不能提供数据存储的容错一旦OST发生故障就无法恢复,因此对OST的稳定性就提出了相当高的要求從而大大增加了存储的成本,而且成本会随着规模的扩大线性增长

正如李开复所说的那样,创新固然重要但有用的创新更重要。创新嘚价值取决于一项创新在新颖、有用和可行性这三个方面的综合表现。Google GFS的新颖之处并不在于它采用了多么令人惊讶的技术而在于它采鼡廉价的商用机器构建分布式文件系统,同时将GFS的设计与Google应用的特点紧密结合并简化其实现,使之可行最终达到创意新颖、有用、可荇的完美组合。GFS使用廉价的商用机器构建分布式文件系统将容错的任务交由文件系统来完成,利用软件的方法解决系统可靠性问题这樣可以使得存储的成本成倍下降。由于GFS中服务器数目众多在GFS中服务器死机是经常发生的事情,甚至都不应当将其视为异常现象那么如哬在频繁的故障中确保数据存储的安全、保证提供不间断的数据存储服务是GFS最核心的问题。GFS的精彩在于它采用了多种方法从多个角度,使用不同的容错措施来确保整个系统的可靠性

GFS的系统架构如图2-1[1]所示。GFS将整个系统的节点分为三类角色:Client(客户端)、Master(主服务器)和Chunk Server(數据块服务器)Client是GFS提供给应用程序的访问接口,它是一组专用接口不遵守POSIX规范,以库文件的形式提供应用程序直接调用这些库函数,并与该库链接在一起Master是GFS的管理节点,在逻辑上只有一个它保存系统的元数据,负责整个文件系统的管理是GFS文件系统中的“大脑”。Chunk Server负责具体的存储工作数据以文件的形式存储在Chunk Server上,Chunk Server的个数可以有多个它的数目直接决定了GFS的规模。GFS将文件按照固定大小进行分块默认是64MB,每一块称为一个Chunk(数据块)每个Chunk都有一个对应的索引号(Index)。

客户端在访问GFS时首先访问Master节点,获取将要与之进行交互的Chunk Server信息然后直接访问这些Chunk Server完成数据存取。GFS的这种设计方法实现了控制流和数据流的分离Client与Master之间只有控制流,而无数据流这样就极大地降低叻Master的负载,使之不成为系统性能的一个瓶颈Client与Chunk Server之间直接传输数据流,同时由于文件被分成多个Chunk进行分布式存储Client可以同时访问多个Chunk Server,从洏使得整个系统的I/O高度并行系统整体性能得到提高。

相对于传统的分布式文件系统GFS针对Google应用的特点从多个方面进行了简化,从而在一萣规模下达到成本、可靠性和性能的最佳平衡具体来说,它具有以下几个特点

1.采用中心服务器模式

GFS采用中心服务器模式来管理整个攵件系统,可以大大简化设计从而降低实现难度。Master管理了分布式文件系统中的所有元数据文件划分为Chunk进行存储,对于Master来说每个Chunk Server只是┅个存储空间。Client发起的所有操作都需要先通过Master才能执行这样做有许多好处,增加新的Chunk Server是一件十分容易的事情Chunk Server只需要注册到Master上即可,Chunk Server之間无任何关系如果采用完全对等的、无中心的模式,那么如何将Chunk Server的更新信息通知到每一个Chunk Server会是设计的一个难点,而这也将在一定程度仩影响系统的扩展性Master维护了一个统一的命名空间,同时掌握整个系统内Chunk Server的情况据此可以实现整个系统范围内数据存储的负载均衡。由於只有一个中心服务器元数据的一致性问题自然解决。当然中心服务器模式也带来一些固有的缺点,比如极易成为整个系统的瓶颈等GFS采用多种机制来避免Master成为系统性能和可靠性上的瓶颈,如尽量控制元数据的规模、对Master进行远程备份、控制信息和数据分流等

缓存(Cache)機制是提升文件系统性能的一个重要手段,通用文件系统为了提高性能一般需要实现复杂的缓存机制。GFS文件系统根据应用的特点没有實现缓存,这是从必要性和可行性两方面考虑的从必要性上讲,客户端大部分是流式顺序读写并不存在大量的重复读写,缓存这部分數据对系统整体性能的提高作用不大;而对于Chunk Server由于GFS的数据在Chunk Server上以文件的形式存储,如果对某块数据读取频繁本地的文件系统自然会将其缓存。从可行性上讲如何维护缓存与实际数据之间的一致性是一个极其复杂的问题,在GFS中各个Chunk Server的稳定性都无法确保加之网络等多种鈈确定因素,一致性问题尤为复杂此外由于读取的数据量巨大,以当前的内存容量无法完全缓存对于存储在Master中的元数据,GFS采取了缓存筞略GFS中Client发起的所有操作都需要先经过Master。Master需要对其元数据进行频繁操作为了提高操作的效率,Master的元数据都是直接保存在内存中进行操作同时采用相应的压缩机制降低元数据占用空间的大小,提高内存的利用率

文件系统作为操作系统的重要组成部分,其实现通常位于操莋系统底层以Linux为例,无论是本地文件系统如Ext3文件系统还是分布式文件系统如Lustre等,都是在内核态实现的在内核态实现文件系统,可以哽好地和操作系统本身结合向上提供兼容的POSIX接口。然而GFS却选择在用户态下实现,主要基于以下考虑

在用户态下实现,直接利用操作系统提供的POSIX编程接口就可以存取数据无需了解操作系统的内部实现机制和接口,从而降低了实现的难度并提高了通用性。

POSIX接口提供的功能更为丰富在实现过程中可以利用更多的特性,而不像内核编程那样受限

用户态下有多种调试工具,而在内核态中调试相对比较困難

用户态下,Master和Chunk Server都以进程的方式运}

MongoDB的官方文档基本是how to do的介绍而关於how it worked却少之又少,本人也刚买了《MongoDB TheDefinitive Guide》的影印版还没来得及看,本文原作者将其书中一些关于MongoDB内部现实方面的一些知识介绍如下值得一看。

今天下载了《MongoDB The Definitive Guide》电子版浏览了里面的内容,还是挺丰富的是官网文档实际应用方面的一个补充。和官方文档类似介绍MongoDB的内部原理昰少之又少,只有在附录的一个章节中介绍了相关内容

对于大多数的MongoDB的用户来说,MongoDB就像是一个大黑盒但是如果你能够了解到MongoDB内部一些構造的话,将有利于你更好地理解和使用MongoDB

在MongoDB中,文档是对数据的抽象它被使用在Client端和Server端的交互中。所有的Client端(各种语言的Driver)都会使用這种抽象它的表现形式就是我们常说的BSON(Binary JSON )。

BSON是一个轻量级的二进制数据格式MongoDB能够使用BSON,并将BSON作为数据的存储存放在磁盘中

当Client端要將写入文档,使用查询等等操作时需要将文档编码为BSON格式,然后再发送给Server端同样,Server端的返回结果也是编码为BSON格式再放回给Client端的

使用BSON格式出于以下3种目的:

BSON是为效率而设计的,它只需要使用很少的空间即使在最坏的情况下,BSON格式也比JSON格式再最好的情况下存储效率高

茬某些情况下,BSON会牺牲额外的空间让数据的传输更加方便比如,字符串的传输的前缀会标识字符串的长度而不是在字符串的末尾打上結束的标记。这样的传输形式有利于MongoDB修改传输的数据

最后,BSON格式的编码和解码都是非常快速的它使用了C风格的数据表现形式,这样在各种语言中都可以高效地使用

更多关于BSON的介绍,可以参考:

Client端访问Server端使用了轻量级的TCP/IP写入协议。这种协议在中有详细介绍它其实是茬BSON数据上面做了一层简单的包装。比如说写入数据的命令中包含了1个20字节的消息头(由消息的长度和写入命令标识组成),需要写入的Collection洺称和需要写入的数据

在MongoDB的数据文件夹中(默认路径是/data/db)由构成的所有文件。每一个数据库都包含一个.ns文件和一些数据文件其中数据攵件会随着数据量的增加而变多。所以如果有一个数据库名字叫做foo那么构成foo这个数据库的文件就会由等平台的驱动程序。(

SQL or NoSQLThat’s a question!SQL 与 NoSQL 的争论從来没有停息过,但其实任何一种技术都不会是适合一切应用场景的重要的是你要充分了解自己的需求,再充分了解你要选择的技术的優劣

下面是一个关于 MongoDB 优缺点的列表,希望对打算使用 MongoDB 的同学能有一些作用:

快速!(当然,这和具体的应用方式有关通常来说,它仳一般的关系型数据库快5位左右)

很高的可扩展性 – 轻轻松松就可实现PB级的存储(但是可能我们并不需要PB级的存储,10TB可能就够了)

他的存储格式是Json的这对Java来说非常好处理,对javascirpt亦然

运维起来非常方便,你不用专门为它安排一个管理员

它有一个非常活跃的社区(我提出嘚一个bug在20分钟内就能得到修复。多谢Elliot)

MongoDB 背后的公司(10gen)已经准备好了明天在 MongoDB 上面的投入的资金了

应用经验缺乏,我们都没有相关NoSQL 产品的使用经验

项目相对来说还比较新。

和以往的存储相比数据的关系性操作不再存在。

本文详细讲下Memcached和Mongodb一些看法以及结合应用有什么好處,希望看到大家的意见和补充

  Memcached的优势我觉得总结下来主要体现在:

  1) 分布式。可以由10台拥有4G内存的机器构成一个40G的内存池,如果觉得还不够大可以增加机器这样一个大的内存池,完全可以把大部分热点业务数据保存进去由内存来阻挡大部分对数据库读的請求,对数据库释放可观的压力

  2) 单点。如果Web服务器或App服务器做负载均衡的话在各自内存中保存的缓存可能各不相同,如果数据需要同步的话比较麻烦(各自自己过期,还是分发数据同步),即使数据并不需要同步用户也可能因为数据的不一致而产生用户体驗上的不友好。

  3) 性能强不用怀疑和数据库相比确实是,根源上还是内存的读写和磁盘读写效率上几个数量级的差距有的时候我們在抱怨数据库读写太差的情况下可以看看磁盘的IO,如果确实是瓶颈的话装啥强劲的数据库估计也档不了强不强无非是这个数据库多少充分的利用了内存。

  但是也不太建议在任何情况下使用Memcached替代任何缓存:

  1) 如果Value特别大不太适合。因为在默认编译下Memcached只支持1M的Value(Key嘚限制到不是最大的问题)其实从实践的角度来说也 不建议把非常大的数据保存在Memcached中,因为有序列化反序列化的过程别小看它消耗的CPU。说到这个就要提一下我一直觉得 Memcached适合面向输出的内容缓存,而不是面向处理的数据缓存也就是不太适合把大块数据放进去拿出来处悝之后再放进去,而是适合拿出来就直接给输出了或是拿出来不需要处理直接用。

  2) 如果不允许过期不太适合。Memcached在默认情况下最夶30天过期而且在内存达到使用限制后它也会回收最少使用的数据。因此如果我们要把它当 作static变量的话就要考虑到这个问题,必须有重噺初始化数据的过程其实应该这么想,既然是缓存就是拿到了存起来如果没有必定有一个重新获取重新缓存的过程,而不是想着它永遠存在

  在使用Memcached的过程中当然也会有一些问题或者说最佳实践:

  1) 清除部分数据的问题。Memcached只是一个Key/Value的池一个公共汽车谁都可以仩。我觉得对于类似的公共资源如果用的人都按照自己的规 则来的话很容易出现问题。因此最好在Key值的规范上上使用类似命名空间的概念, 每一个用户都能很明确的知道某一块功能的Key的范围或者说前缀。带来的好处是我们如果需要清空的话可以根据这个规范找到我们洎己的一批Key然后再去 清空而不是清空所有的。当然有人是采用版本升级的概念老的Key就让它过去吧,到时候自然会清空这也是一种办法。不过Key有规范总是有好处的在 统计上也方便一点。

  2) Value的组织问题也就是说我们存的数据的粒度,比如要保存一个列表是一个保存在一个键值还是统一保存为一个键值,这取决于业务如果粒度很小的话最好是在获取的时候能批量获取,在保存的时候也能批量保存对于跨网络的调用次数越少越好,可以想一下如果一个页面需要输出100行数据,每一个数据都需要获取一次一个页面进行上百次连接这个性能会不会成问题。

  那么Memcached主要用在哪些功能上呢

  其实我觉得平时能想到在内存中做缓存的地方我们都可以考虑下是不是鈳以去适用分布式缓存,但是主要的用途还是用来在前端或中部挡一下读的需求来释放Web服务器App服务器以及DB的压力

  Mongodb是一款比较优良的非关系型数据库的文档型的数据库。它的优势主要体现在:

  1) 开源意味着即使我们不去改也可以充分挖掘它,MS SQL除了看那些文档谁叒知道它内部如何实现。

  2) 免费意味着我们可以在大量垃圾服务器上装大量的实例,即使它性能不怎么高也架不住非常多的点啊。

  3) 性能高其它没比较过,和MS SQL相比同样的应用(主要是写操作)一个撑500用户就挂了,一个可以撑到2000在数据量上到百万之后,即使没索引MS SQL的插入性能下降的也一塌糊涂。其实任何事物都有相对性的在变得复杂变得完善了之后会牺牲一部分的性能,MS SQL体现的是非常強的安全性数据完整性这点是Mongodb办不到的。

  4) 配置简单并且灵活在生产环境中对数据库配置故障转移群集和读写分离的数据库复制昰很常见的需求,MS SQL的配置繁琐的步骤还是很恐怖的而Mongodb可以在五分钟之内配置自己所需要的故障转移组,读写分离更是只需要一分钟灵活性体现在,我们可以配置一个M一个S两个M一个S(两个M写入的数据会合并到S上供读取),一个M两个S(一个M写入的数据在两个S上有镜像)甚至是多个M多个S(理论上可以创建10个M,10个S我们只需要通过轮询方式随便往哪个M上写,需要读的时候也可以轮训任意一个S当然我们要知噵不可能保证在同一时间所有的 S都有一致的数据)。那么也可以配置两个M的对作为一套故障转移群集然后这样的群集配置两套,再对应兩个S也就是4个M对应2个S,保证M点具有故障 转移

  5) 使用灵活。在之前的文章中我提到甚至可以通过SQL到JS表达式的转换让Mongodb支持SQL语句的查询不管怎么说Mongodb在查询上还是很方便的。

  之前也说过了并不是所有数据库应用都使用采用Mongodb来替代的,它的主要缺点是:

  1) 开源软件的特点:更新快应用工具不完善。由于更新快我们的客户端需要随着它的更新来升级才能享受到一些新功能,更新快也意味着很可能在某一阶段会缺乏某个重要功能另外我们知道MS SQL在DEV/DBA/ADM多个维度都提供了非常好的GUI工具对数据库进行维护。而Mongodb虽然提供了一些程序但是并鈈是非常友好。我们的 DBA可能会很郁闷去优化Mongodb的查询。

  2) 操作事务Mongodb不支持内建的事务(没有内建事务不意味着完全不能有事务的功能),对于某些应用也就不适合不过对于大部分的互联网应用来说并不存在这个问题。

  在使用Mongodb的过程中主要遇到下面的问题:

  1) 真正的横向扩展在使用Memcached的过程中我们已经体会到这种爽了,基本可以无限的增加机器来横向扩展因为什么,因为我们是通过客户端來决定键值保存在那个实例上在获取的时候也很明确它在哪个实例上,即使是一次性获取多个键值也是同样。而对于数据库来说我們通过各种各样的方式进行了 Sharding,不说其它的在查询的时候我们根据一定的条件获取批量的数据,怎么样去处理比如我们按照用户ID去分爿,而查询根本不在乎用户ID 在乎的是用户的年龄和教育程度,最后按照姓名排序到哪里去取这些数据?不管是基于客户端还是基于服務端的Sharding都是非常难做的并且即使有了 自动化的Sharding性能不一定能有保障。最简单的是尽量按照功能来分再下去就是历史数据的概念,真正偠做到实时数据分散在各个节点还是很困难。

  2) 多线程多进程。在写入速度达不到预期的情况下我们多开几个线程同时写或者哆开几个Mongodb进程(同一机器),也就是多个数据库实例然后向不同 的实例去写。这样是否能提高性能很遗憾,非常有限甚至可以说根夲不能提高。为什么使用Memcached的时候多开线程可以提高写入速度那是因为内 存数据交换的瓶颈我们没达到,而对于磁盘来说IO的瓶颈每秒那麼几十兆的是很容易达到的,一旦达到这个瓶颈了无论是开多少个进程都无法提高性能了。还 好Mongodb使用内存映射看到内存使用的多了,其实我对它的信心又多了一点(内存占用多了我觉得CPU更容易让它不闲着)怕就怕某个DB不使用什 么内存,看着IO瓶颈到了内存和CPU还是吃不飽。

  其实有了Memcached和Mongodb我们甚至可以让80%以上的应用摆脱传统关系型数据库我能想到它们其实可以互相配合弥补对方的不足:

  Memcached适合根据Key保存Value,那么有的时候我们并不知道需要读取哪些Key怎么办呢我在想是不是可以把Mongodb或 说数据库当作一个原始数据,这份原始数据中分为需要查询的字段(索引字段)和普通的数据字段两部分把大量的非查询字段保存在Memcached中,小粒 度保存在查询的时候我们查询数据库知道要获取哪些数据,一般查询页面也就显示20-100条吧然后一次性从Memcached中获取这些数据。也就是 说Mongodb的读的压力主要是索引字段,而数据字段只是在缓存失效的时候才有用使用Memcached挡住大部分实质数据的查询。反过来说如果我们要清空Memcached中的数据也知道要清空哪些Key。

NoSQL 数据库在上年炒得很热于是我也萌生了使用 NoSQL 数据库写一个应用的想法。首先来认识一下 NoSQLNoSQL 是一个缩写,含义从最初的 No-SQL 到现在已经成为了 Not-Only-SQL确实后面一种解释比較符合 NoSQL 的使用场景。

现在网络上被人所知的 NoSQL 数据库可以在这个网页()看到这个列表林林总总一大堆,要选择哪个数据库入手呢

在我關注的 Web 领域,特别是 Ruby on Rails 社区比较多提到的是这几个数据库:

,另一个apache基金会下的非关系数据库

,特点是运行在内存中速度很快。相比於用来持久化数据也许更接近于 memcached 这样的缓存系统,或者用来实现任务队列(比如)

在这些候选名单中我选择了MongoDB。因为它最近在 RoR 社区中嘚露脸率比较高网页文档完善,并且项目主页的设计也不错

在陈述 MongoDB 的特性之前还是给第一次接触 NoSQL 的人提个醒:不要意图用 NoSQL 全盘取代 SQL 数據库。非关系数据库的出现不是为了取代关系数据库具体的说,MongoDB 并不支持复杂的事务只支持少量的原子操作,所以不适用于“转帐”等对事务和一致性要求很高的场合而 MongoDB 适合什么场合,请继续阅读

关系数据库比如 MySQL,通常将不同的数据划分为一个个“表”表的数据昰按照“行”来储存的。而关系数据库的“关系”是指通过“外键”将表间或者表内的数据关联起来比如文章-评论 的一对多关系可以用這样的表来实现:

实现关联的关键就是 comments 表的最后一个 post_id 字段,将 comment 数据的 post_id 字段设为评论目标文章的 id 值就可以用 SQL 语句进行相关查询(假设要查嘚文章 id 是 1):
相对于关系数据库的行式储存和查询,MongoDB 作为一个文档型数据库可以支持更具层次感的数据。上面举的 文章-评论 结构在 MongoDB 里媔可以这样设计。

可以看到文档性数据库从储存的数据项上就跟 SQL 数据库不同。在 MongoDB 中文档是以  格式(类似 JSON)储存的,可以支持丰富的层佽的结构由于数据结构的表达能力更强,用 MongoDB 储存文档型数据可以比 SQL 数据库更直观和高效

在 SQL 数据库中,为表达数据的从属关系通常要將表间关系分为 one-to-one,one-to-manymany-to-many 等模式进行设计,这通常会需要很多链接表的辅助在MongoDB 中,如果关联文档体积较小固定不变,并且与另一文档是主從关系那么通常可以嵌入(Embed)主文档。

常见情景:评论、投票点击数据、Tag

这类场景的有时单个数据项体积很小,但是数量巨大与之楿应的是查询成本也会上升。如果将这些小数据嵌入所属文档在查询主文档时一并提取,查询效率要比 SQL 高后者通常需要开支较大的 JOIN 查詢。并且根据文档介绍每个文档包括 Embed 部分在物理硬盘上都是储存在同一区域的,IO 部分也会比 SQL 数据库快(注,MongoDB 有单文档大小限制)

MongoDB 中的攵档其实是没有模式的不像 SQL 数据库那样在使用前强制定义一个表的每个字段。这样可以避免对空字段的无谓开销

例如两个用户的联系信息,A 用户带有email 不带 urlB 用户带有 url 不带 email。在 SQL 数据库中需要为两个数据项都提供 email 段和 url 段而在MongoDB 中可以这样保存:

在关系数据库中,如果这些不確定的字段很多而且数量很大为了优化考虑可能又要划分成两个表了,比如users 和 profiles 两个表在 MongoDB 中,如果这一类不确定信息确实是属于同一文檔的那么可以轻松的放在一起,因为并不需要预先定义模式也不会有空字段的开销。

不过因为要支持这样的动态性并且为了性能考慮进行预先分配硬盘空间,数据外的开销也会带来磁盘占用我还未实测实际中开销有多大,也许未来不久我会写一个应用测试

开发人員一直努力适应 Microsoft 推出的各种新事物。但这似乎还不够“社区”(包含所有开发人员,无论他们是否每天都使用.NET)也开始行动创造出更哆的新事物来填补Microsoft 未覆盖到的空白,对您而言这可能是制造混乱和干扰

在 Microsoft 的支持 范围之外,该社区所酝酿出的“新”事物之一就是 NoSQL 运动一组开发人员公开质疑将所有数据存储于某种形式的关系数据库系统的这种观念。表、行、列、主键、外键约束、关于null 的争论以及有关主键是否应该为自然键或非自然键的辩论……还有什么是神圣不可侵犯的

在本文及其后续文章中,我将探讨NoSQL 运动所倡导的主要工具之一:MongoDB根据 MongoDB 网站的陈述,该工具的名称源自于“humongous”(并不是我杜撰的)我基本上会讨论到与 MongoDB 相关的方方面面:安装、浏览以及在.NET Framework 中使用 MongoDB。其中包括其提供的 LINQ 支持;在其他环境(桌面应用程序和Web 应用程序及服务)中使用MongoDB;以及如何设置MongoDB以免 Windows 生产管理员向您提出严重抗议。

问題(或者为何我要再次关注?)

在深入了解MongoDB 之前读者自然要问为什么.NET Framework 开发人员应该牺牲接下来宝贵的大约半小时时间继续待在电脑前閱读本文。毕竟SQLServer 有免费、可再发行的Express Edition,提供比企业或数据中心绑定的传统关系数据库更精简的数据存储方案而且毫无疑问,还可以使鼡大量工具和库来轻松访问SQL Server 数据库其中包括Microsoft 自己的 LINQ 和实体框架。

但问题在于关系模型(指关系模型本身)的优点也是其最大的缺点。夶多数开发人员(无论是.NET、Java 还是其他开发人员都在此列)在经历短短几年的开发工作之后就会一一痛诉这种表/行/列的“方正”模型如何鈈能令其满意。尝试对分层数据进行建模主机的举动甚至能让最有经验的开发人员完全精神崩溃类似情况不甚枚举,因此Joe Celko 还写过一本书《SQLfor Smarties, Third Edition》(Morgan-Kaufmann2005),其中完全是关于在关系模型中对分层数据建模主机的概念如果在此基础之上再增加一个基本前提:关系数据库认为数据的結构(数据库架构)不灵活,则尝试支持数据的临时“添加”功能将变得十分困难(快速回答下面的问题:你们之中有多少人处理过包含一个Notes 列(乃至 Note1、Note2、Note3……)的数据库?)

NoSQL 运动中没有任何人会说关系模型没有优点也没有人会说关系数据库将会消失,但过去二十年开發人员生涯的一个最基本的事实是开发人员经常将数据存储到本质上并非关系模型(有时甚至与这种模型相去甚远)的关系数据库中。

媔向文档的数据库便是用于存储“文档”(这是一些紧密结合的数据集合通常并未关联到系统中的其他数据元素),而非“关系”例洳,博客系统中的博客条目彼此毫无关联即使出现某一篇博客确实引用到另一篇博客的情况,最常用的关联方法也是通过超链接(旨在甴用户浏览器解除引用)而非内部关联。对本博客条目的评论完全局限于本博客条目的内部范围不管评论的是什么博客条目,极少有鼡户想查看包含所有评论的内容集合

此外,面向文档的数据库往往在高性能或高并发性环境中表现突出:MongoDB专门迎合高性能需求而它的菦亲CouchDB 则更多的是针对高并发性的情况。两者都放弃了对多对象事务的支持也就是说,尽管它们支持在数据库中对单个对象进行的并发修妀但若尝试一次性对多个对象进行修改,将会在一小段时间内看到这些修改正依序进行文档以“原子方式”更新,但不存在涉及多文檔更新的事务概念这并不意味着MongoDB 没有任何稳定性,只是说MongoDB 实例与 SQL Server 实例一样不能经受电源故障需要原子性、一致性、隔离性和持久性(ACID) 完整要素的系统更适合采用传统的关系数据库系统,因此关键任务数据很可能不会太快出现在MongoDB 实例内但Web 服务器上的复制数据或缓存数据可能要除外。

一般来说若应用程序及组件需要存储可快速访问且常用的数据,则采用MongoDB 可以取得较好效果网站分析、用户首选项和设置(鉯及包含非完全结构化数据或需采用结构灵活的数据的任何系统类型)都是采用MongoDB 的自然之选。这并不意味着MongoDB 不能作为操作型数据的主要数據存储库;只是说MongoDB 能在传统 RDBMS 所不擅长的领域内如鱼得水另外它也能在大量其他适合的领域内大展拳脚。

前面提到过MongoDB是一款开源软件包,可通过 MongoDB 网站  轻松下载在浏览器中打开该网站应该就能找到Windows 可下载二进制包的链接,请在页面右侧查找“Downloads”链接另外,如果更愿意使鼡直接链接请访问 。截至本文撰写之时其稳定版本为发行版 Framework 驱动程序,此类驱动程序知道如何通过打开的套接字进行连接以向服务器輸送命令和数据MongoDB 程序包中并未绑定 .NET Framework 驱动程序,但有幸的是社区提供了一个,此处的“社区”指的是名叫 Sam Corder 的开发人员他构建了一个 .NET Framework 驱動程序以及 LINQ 支持来访问 MongoDB。他的作品同时以源代码形式和二进制形式提供位于。可以从该页面下载二进制文件(查找页面右上角)也可鉯下载源代码,然后自行编译无论采取哪种方式,都会产生两个程序集: Framework 了

从根本上来说,打开与正在运行的MongoDB 服务器的连接同打开與任何其他数据库的连接没有太大差别,如图 4 所示

using Framework 开发人员使用过的方法有所不同而已(请参阅图 5)。
 
 
using Framework 值类型如DateTime。如前所述从技术角度上讲,MongoDB用于存储 BSON 数据其中包括传统 JSON 类型(字符串、整数、布尔值、双精度和null,不过 null
 仅允许用于对象不允许用于集合)的某些扩展,例如上文提到的ObjectId、二进制数据、正则表达式以及JavaScript
 代码我们暂时先不管后面两种类型,BSON能存储二进制数据的这种说法是指能存储任何可簡化为字节数组的内容这实际上表示MongoDB 能存储任何内容,但可能无法在该二进制BLOB 中进行查询
 
 


DBRef,后者可通过略微更丰富的方式来引用/解除引用其他文档但仍无法实现对象图友好的系统。)因此尽管肯定可以获得一个丰富的对象模型并将其存储到MongoDB 数据库中,仍不建议这样莋请坚持使用Word 或 Excel 这样的文档来存储紧密群集的数据组。如果某些内容可视为大型文档或电子表格则可能非常适合MongoDB 或其他某种面向文档嘚数据库。
上一次我使用探索测试继续对MongoDB 进行探讨。我介绍了如何在测试期间启动和停止服务器然后介绍了如何获取跨文档引用,并探讨了导致如此麻烦举动的原因现在我们需要探索更多中间的 MongoDB 功能:谓词查询、聚合函数以及 Framework 企业系统和 Java 平台系统的独立公司。他曾写莋 100 多篇文章是 C# 领域最优秀的专家之一并且是 INETA 发言人,著作或合著过十几本书包括即将出版的《Professional F# 与他联系,或通过 访问其博客
Dwight Merriman和他的團队,包括ShopWiki的创始人Eliot Horowitz参加了在纽约10gen启动MongoDB的仪式现在该公司除了担任该开源项目的主要运营者之外,还提供支持、培训和咨询服务10gen在旧金山举办了第二届开发者大会,Merriman在上午的大会做了主题演讲主要介绍了MongoDB的起源,并解释了为何要建立这样的数据库
“在2007年底,当时的想法是构建一个用于开发、托管并具有自动缩放Web应用程序的在线服务”谈到MongoDB诞生之目的时,Merriman介绍道“但是不同于Google App Engine的是,这项服务完全建立在一个开放源代码的软件平台之上”因此,在关注了Google Bigtable架构很长一段时间后Merriman和他的团队注意到,尚没有一个开源的数据库平台适合這种服务这兴许是个机会。
“我们意识到很多现有的数据库并不真正具备‘’的特性例如弹性、可扩展性以及易管理性。这些特性能夠为开发者和运营者带来便利而MySQL还不完全具备这些特点。
Merriman以及他的团队的目标是构建一个全新的数据库新的数据库将会放弃大家所熟悉的关系数据库模型,且是适合现代网络应用并基于分布式的平台高度事务性的系统可以帮助解决一些棘手的问题,同时还支持云计算架构的伸缩性Merriman解释到。经过一年的不断努力这个数据库已经比较完善。他们将它设计为具有为“云计算服务”潜力的数据库而且还會不断的完善,因为MongoDB本身就是一个开源数据库
在开源的、面向文档的数据库中,MongoDB经常被誉为具有RDBMS功能的NoSQL数据库MongoDB还带有交互式shell,这使得訪问其数据存储变得简单且其对于分块的即装即用的支持能够使高可伸缩性跨多个节点。
据悉MongoDB的API是JSON对象和JavaScript函数的本地混合物。通过shell程序开发人员可与MongoDB进行交互即允许命令行参数,或通过使用语言驱动程序来访问数据存储实例这里不存在类JDBC驱动程序,这意味着开发人員不必处理ResultSet或PreparedStatement
而速度是 MongoDB 的另外一个优势,主要是由于它处理写入的方式:它们存储在内存中然后通过后台线程写入磁盘。
“由于用户鈈容易在大规模环境下作分布式的链接并且在分布式环境下很难做快速的大规模部署,因此用户需要一些辅助的东西”,Memmiman解释道
最後他表示同样重要的是为了限制数据库的事务语义你可以使用分布式事务。但当你在1000台机器上运行时它不会那么快例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序(李智/译)
本文见于MongoDB官方网站,MongoDB与CouchDB很相似他们都是文档型存储,数据存储格式都是JSON型的都使用Javascript进行操作,都支持Map/Reduce但是其实二者有着很多本质的区别,本文透过现象追寻本质让你更好的理解MongoDB与CouchDB。

这是gridfs的nginx )是国内最大的创意人群的专业网站2009年以前,同很多公司一样我们的CMS和社区产品都构建于PHP+Nginx+MySQL之上;MySQL使用了Master+Master的部署方案;前端使用自己的PHP框架进行开发;Memcached作为缓存;Nginx进行Web服务和负载均衡;Gearman进行异步任务处理。在传统的基于静态内容(如文章资讯,帖子)的产品这个体系运行良好。通过分级的缓存数据库端实际负载很轻。2009年初我们进行了新产品的开发。此时我们遇到了如下一些问题。
  用户数据激增:我们的MySQL某个信息表上线1个月的数据就达到千万我们之前忽略的很多数据,在新形势下需要跟踪记录这也导致了数据量的激增;
  用户对于信息的实时性要求更高:对信息的响应速度和更新频度就要求更高。简单通过缓存解决的灵丹妙药不复存在;
  对于Scale-out的要求更高:有些创新产品的增长速度是惊人的因此要求能够无痛的升级扩展,否则一旦停机那么用户流失的速度也是惊人的;
  大量文件的备份工作:我们面向的是创意人群,产生的内容是以图片为主需要能够对这些图片及不同尺寸的缩略图进行有效的备份管理。我们之前使用的Linux inotify+rsync的增量备份方案效果不佳;
  需求变化频繁:开发要更加开发成本和维护成本要更低,要能够快速地更新进囮新功能要在最短的周期内上线。
  最初我们试图完全通过优化现有的技术架构来解决以上问题:对数据时效性进一步分级分层缓存,减小缓存粒度;改进缓存更新机制(线上实时和线下异步更新)提高缓存命中率;尝试对业务数据的特点按照水平和垂直进行分表;使用MogileFS进行分布存储;进一步优化MySQL的性能同时增加MySQL节点等。但很快发现即便实施了上述方案,也很难完全解决存在的问题:过度依赖Memcached导致数据表面一致性的维护过于复杂应用程序开发需要很小心,很多时候出现Memcached的失效会瞬间导致后端数据库压力过大;不同类型数据的特點不同数据量差别也很大;分表的机制和方式在效率平衡上很难取舍;MogileFS对我们而言是脚小鞋大,维护成本远远超过了实际的效益;引入哽多的MySQL数据库节点增大了我们的维护量如何有效监控和管理这些节点又成了新的问题。虽然虚拟化可以解决部分问题但还是不能令人滿意;
  除了MySQL,能否找到一个更为简单、轻便的瑞士军刀呢我们的目光投向了NoSQL的方案。

  最初对于NoSQL的候选方案,我依据关注和熟悉程度并且在甄别和选择合适的方案时特别制定了一些原则:是否节省系统资源,对于CPU等资源是否消耗过大;客户端/API支持这直接影响應用开发的效率;文档是否齐全,社区是否活跃;部署是否简单;未来扩展能力按以上几点经过一段测试后,我们候选名单中剩下、MongoDB和Flare
  Redis对丰富数据类型的操作很吸引人,可以轻松解决一些应用场景其读写性能也相当高,唯一缺点就是存储能力和内存挂钩这样如果存储大量的数据需要消耗太多的内存(最新的版本已经不存在这个问题)。
  Flare的集群管理能力令人印象深刻它可以支持节点的动态蔀署,支持节点的基于权重的负载均衡支持数据分区。同时允许存储大的数据其key的长度也不受Memcached的限制。而这些对于客户端是透明的愙户端使用Memcached协议链接到Flare的proxy节点就可以了。由于使用集群Flare支持fail-over,当某个数据节点宕掉对于这个节点的访问都会自动被proxy节点forward到对应的后備节点,恢复后还可以自动同步Flare的缺点是实际应用案例较少,文档较为简单目前只在Geek使用。
  以上方案都打算作为一个优化方案峩从未想过完全放弃MySQL。然而用MongoDB做产品的设计原型后,我彻底被征服了决定全面从MySQL迁移到MongoDB。

  MongoDB是一个面向文档的数据库目前由10gen开发並维护,它的功能丰富齐全,完全可以替代MySQL在使用MongoDB做产品原型的过程中,我们总结了MonogDB的一些亮点:
  使用JSON风格语法易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB的操作都使用JSON风格语法客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说更加直观,容易理解和掌握

  Collection中可以包含具有不同schema的文档记录。 这意味着你上一条记录中的文档有3个属性,而下一条记录的文档可以囿10个属性属性的类型既可以是基本的数据类型(如数字、字符串、日期等),也可以是数组或者散列甚至还可以是一个子文档(embed document)。這样可以实现逆规范化(denormalizing)的数据模型,提高查询的速度

  图2是一个例子,作品和评论可以设计为一个collection评论作为子文档内嵌在art的comments屬性中,评论的回复则作为comment子文档的子文档内嵌于replies属性按照这种设计模式,只需要按照作品id检索一次即可获得所有相关的信息了。在MongoDBΦ不强调一定对数据进行Normalize ,很多场合都建议De-normalize开发人员可以扔掉传统关系数据库各种范式的限制,不需要把所有的实体都映射为一个Collection呮需定义最顶级的class。MongoDB的文档模型可以让我们很轻松就能将自己的Object映射到collection中实现存储

  简单易用的查询方式:MongoDB中的查询让人很舒适,没囿SQL难记的语法直接使用JSON,相当的直观对不同的开发语言,你可以使用它最基本的数组或散列格式进行查询配合附加的operator,MongoDB支持范围查詢正则表达式查询,对子文档内属性的查询可以取代原来大多数任务的SQL查询。
  CRUD更加简单支持in-place update:只要定义一个数组,然后传递给MongoDB嘚insert/update方法就可自动插入或更新;对于更新模式MongoDB支持一个upsert选项,即:“如果记录存在那么更新否则插入”。MongoDB的update方法还支持Modifier通过Modifier可实现在垺务端即时更新,省去客户端和服务端的通讯这些modifer可以让MongoDB具有和Redis、Memcached等KV类似的功能:较之MySQL,MonoDB更加简单快速Modifier也是MongoDB可以作为对用户行为跟踪嘚容器。在实际中使用Modifier来将用户的交互行为快速保存到MongoDB中以便后期进行统计分析和个性化定制
  所有的属性类型都支持索引,甚至数組:这可以让某些任务实现起来非常的轻松在MongoDB中,“_id”属性是主键默认MongoDB会对_id创建一个唯一索引。
  服务端脚本和Map/Reduce:MongoDB允许在服务端执荇脚本可以用Javascript编写某个函数,直接在服务端执行也可以把函数的定义存储在服务端,下次直接调用即可MongoDB不支持事务级别的锁定,对於某些需要自定义的“原子性”操作可以使用Server side脚本来实现,此时整个MongoDB处于锁定状态Map/Reduce也是MongoDB中比较吸引人的特性。Map/Reduce可以对大数据量的表进荇统计、分类、合并的工作完成原先SQL的GroupBy等聚合函数的功能。并且Mapper和Reducer的定义都是用Javascript来定义服务端脚本
  性能高效,速度快: MongoDB使用c++/boost编写在多数场合,其查询速度对比MySQL要快的多对于CPU占用非常小。部署也很简单对大多数系统,只需下载后二进制包解压就可以直接运行幾乎是零配置。
  支持多种复制模式: MongoDB支持不同的服务器间进行复制包括双机互备的容错方案。
  Master-Slave是最常见的通过Master-Slave可以实现数据嘚备份。在我们的实践中我们使用的是Master-Slave模式,Slave只用于后备实际的读写都是从Master节点执行。

  MongoDB只能支持有限的双主模式(Master-Master)实际可用性不强,可忽略
  内置GridFS,支持大容量的存储:这个特点是最吸引我眼球的也是让我放弃其他NoSQL的一个原因。GridFS具体实现其实很简单本質仍然是将文件分块后存储到/
Wordnik是一项在线字典及百科全书服务,在大约一年前它们逐渐开始从MySQL迁移至文档型数据库MongoDB,后者是著名的NoSQL产品の一最近Wordnik的技术团队通过官方博客。
  据Wordnik技术团队描述它们,是看中了它的弱一致性(最终一致)及文档结构的存储方式
  在傳统的关系型数据库中,一个COUNT类型的操作会锁定数据集这样可以保证得到“当前”情况下的精确值。这在某些情况下例如通过ATM查看账戶信息的时候很重要,但对于Wordnik来说数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义反而会产生很大的延迟。他们需偠的是一个“大约”的数字已经更快的处理速度
  此外,Worknik的数据结构是“层级”式的如果要将这样的数据使用扁平式的,表状的结構来保存数据这无论是在查询还是获取数据时都十分困难:
就拿一个“字典项”来说,虽然并不十分复杂但还是会关系到“定义”、“词性”、“发音”或是“引用”等内容。大部分工程师会将这种模型使用关系型数据库中的主键和外键表现出来但把它看作一个“文檔”而不是“一系列有关系的表”岂不更好?使用“mit();//提交事务 }else{ mit();//提交事务 }else{

为数据访问创建一个单独的抽象层对于“非关系型数据库”来说是必须的它可以带来多方面的好处。首先应用开发者可以与底层解决方案的细节完全隔离开来。这对于技术方面的伸缩性带来了好处哃时未来如果需要更改底层的解决方案也很方便。这也以一个标准的方式满足了多个应用的要求(即去掉了JoinGroup by等复杂特性的SQL)。

为性能和伸缩性创建模主机型

不管选择怎样的解决方案使用标准技术(比如,等)来对性能和伸缩性进行建模主机都是高度推荐的它能够为基本的服务器规划、拓扑以及整体的软件许可证成本,管理运行等提供必要的数据这将实质上成为所有预算计划的主要参考数据,并对作出决策提供帮助

要防止数据丢失,除了将数据复制到备份服务器上没有其它的办法了。尽管许多非关系型数据库提供自动复制功能但仍然存茬主节点单点失效的风险。因此最好是使用次节点备份并准备好用于数据恢复和自动数据修复的脚本。出于这样的目的应当充分的了解目标解决方案的物理数据模型,找出可能的恢复机制备选方案基于企业的整体需求和实践来对这些选项作出评估。

就像公共共享服务嘚关系型数据库一样也可以构建非关系型数据库的公共数据服务来促进规模经济效应,满足基础设施和支持的需要这对于未来进一步演化和更改也有帮助。这可以作为愿望列表上的最终目标通过中期或长期的努力来达到这一成熟水平。然而初始阶段就设立这样的远景有助于在整个过程中作出正确的决策。

每个组织都有一部分人对于学习新生的和非传统的事物充满热忱成立这样的小组,并挑选人员(铨职的或兼职的)密切关注这方面的动向,了解问题和挑战进行前瞻性的思考,能够为使用这些技术的项目提供方向和帮助同时,这個小组还可以为决策者澄清炒作的疑云提供来自真实数据的观点。

选择了产品之后与产品社区建立起良好的关系对于双方的成功都有極大的好处。许多非关系型数据库目前都有十分活跃的社区非常愿意相互帮助。企业与社区之间的良好合作能给大家带来一个双赢的局媔如能提前对问题和解决方案有了解,那么企业在对某些特性或版本作出决策时就能成竹在胸反过来,企业又能对产品特性的路线图產生影响作用这对他们自身和社区都是有利的。另一方面社区也能从实际层次的问题中得到反馈,从而丰富和完善产品来自大型企業的成功案例同样能让他们处于领先。

考虑到非关系型数据库相对的成熟度风险最小的采用策略就是遵循迭代开发的方法论。构建公共數据服务平台和标准化数据访问抽象不可能是一蹴而就的相反,通过迭代和面向重构的方式能更好的达到目标运用不太成熟的技术进荇转型的过程,中途改变解决方案也不会太意外的与此同时,采用敏捷的方式来看待事物能够帮助建立起一个能从管理和实现两方面鈈断吸引改进的开放态度。

然而在这一问题上实现迭代,非常重要的一点是定义一个决策条件矩阵比如操作指南(和例子),来判断一个應用的对象模型是否适合关系型或非关系的范围对基础设施规划作出指导,列出必需的测试用例等等

企业的非关系型数据库采用过程Φ最大的挑战就是转变决策者的思想观念——让他们相信并非所有的数据/对象都适合关系型数据库。 最能证明这一点就是选择合适的用例詓尝试非关系型数据库进而证实在合适的背景下,非关系型数据库是比关系型数据库更有效的解决方案找到一些“非关键业务”(但能竝竿见影的)适合于非关系型数据库的项目。这些项目的成功(甚至失败)都能有助于观念的改变这也能有助于不断学习如何才能以一种不同嘚方式来更好的采用非关系型数据库。这些少儿学步般的尝试所作出的努力与投入都是值得的如果企业想要在将来使用“非关系型数据庫”来重塑其信息管理体系的话。

Technologies的首席技术架构师他在信息技术领域有14年以上的经验。作为Infosys技术顾问团的主要成员Sourav为Infosys在美国、欧洲、澳洲和日本的主要客户,提供保险、电信、银行、零售、安全、交通以及建筑、工程、施工等多个行业的服务他曾参与Web项目的技术架構和路线图定义,SOA战略实施国际战略定义,UI组件化性能建模主机,伸缩性分析非结构化数据管理等等。Sourav参考的Infosys自身的核心银行产品Finacle也为他提供了丰富的产品开发经验。Sourav还曾参与开发Infosys的J2EE可重用框架和定义Infosys在架构方面和开发定制应用方面的软件工程方法。Sourav的经历还包括在保证架构合规和开发项目的治理方面的工作

Sourav是iCMG认证的软件架构师,同时也是TOGAF 8认证的执行者Sourav最近在LISA伯克利全球化会议上发表了演讲。在社区里十分流行

Sourav目前关注NoSQL,Web2.0治理,性能建构和全球化

最近听说了很多关于NoSQL的新闻,比如之前Sourceforge改用MongoDBDigg改用Cassandra等等。再加上之前做数據库比较时有人推荐我mongodb所以也搜索了一下NoSQL,觉得NoSQL可能真的是未来的趋势

durability),往往需要频繁应用文件锁这使得其在现代的web2.0应用中越来越捉襟见肘。现在SNS网站每一个点击都是一条/多条查询对数据库写的并发要求非常之高,而传统数据库无法很好地应对这种需求而仔细想來SNS中大部分需求并不要求ACID,比如Like/Unlike投票等等

NoSQL吸取了教训,比如有些NoSQL采用了eventually consistency的概念在没有Update操作一段时间后,数据库将最终是consistency的显然这样嘚数据库将能更好的支持高并发读写。

SQL数据库是基于schema的这对时时刻刻更新着的web2.0应用开发者来说是个噩梦:随时随地有新的应用出现,旧嘚数据库无法适应新的应用只能不停地更新schema,或者做补丁表如此一来要么schema越发混乱,要么就是数据库频繁升级而耗时耗力耗钱

传统SQL佷难进行分布式应用,即使可以也往往代价高昂而NoSQL则很好地解决了这个问题:他们一般都直接从分布式系统中吸取了Map/Reduce方法,从而很容易僦可以处理规模急速增加的问题

推荐robbin牛的NoSQL数据库探讨之一 - 为什么要用非关系数据库?一文介绍了主流的一些NoSQL系统,还有这个站http://nosql-database.org/收集叻基本上目前所有的NoSQL系统

总结一下我对NoSQL的看法,NoSQL出现的目的就是为了解决高并发读写的问题而高并发应用往往需要分布式的数据库来實现高性能和高可靠性,所以NoSQL的关键字就是concurrency和scalability

我之前主要关注数据库的select性能也就是read性能,在读性能方面SQL数据库并没有明显的劣势应该說纯粹高并发读的性能的话往往要优于NoSQL数据库,然而一旦涉及写事情就不一样了。

我本来以为自己不会遇到大量写的问题后来发现即使在simplecd这种简单的应用环境下也会产生大量的并发写:这就是爬VC用户评论的时候。事实上sqlite3在处理这个问题上非常的力不从心,所以我产生叻换个数据库的想法

既然我是要求能高并发读写,干脆就不用SQL了但是同时我也想测试一下其他SQL的写性能。

我的数据有180万条总共350M,测試用了10个线程每个线程做若干次100个数据的bulk写入,然后记录总共耗时结果如下:

作为一个MySQL黑,看到这组测试数据我表示压力很大在SQL数据庫中,mysql意外地取得了最佳的成绩好于pgsql,远好于sqlite更令人意外的是myisam居然优于号称insert比较快的innodb。不管如何对我的应用来说,用mysql保存评论数据昰一个更为明智的选择我对mysql彻底改观了,我宣布我是mysql半黑以后select-intensive的应用我还是会选择sqlite,但是insert/update-intensive的应用我就会改用mysql了

MongoDB和CouchDB同为NoSQL,表现却截然楿反MongoDB性能很高,CouchDB的并发性能我只能ORZ这种性能实在太抱歉了。

其实我本来还打算测试cassandra的可是cassandra用的是java,这首先让我眉头一皱内存大户峩养不起啊,其次看了cassandra的文档立刻崩溃,这简直就是没有文档么(BTW,CouchDB也好不到哪里去我都是用python-couchdb然后help(couchdb.client)看用法的)

至于CouchDB,可能是因为采鼡http方式发送请求所以并发性能糟糕的一塌糊涂,很怀疑它是否有存在的理由

MongoDB是我用下来最讨人喜欢的一个NoSQL。不但文档丰富使用简单,性能也非常好它的Map/Reduce查询(很多NoSQL都有)让我惊叹,数据库可以非常简单地就扩大规模完全不用理会什么分区分表之类繁琐的问题,可惜这方面我暂时没有需求但是MongoDB有两大致命问题。

第一是删除锁定问题当批量删除记录时,数据库还是会锁定不让读写这意味着进行数据清理时会让网站应用失去响应。见locking problems

第二是内存占用问题MongoDB用了操作系统的内存文件映射,这导致操作系统会把所有空闲内存都分配给MongoDB当MongoDB囿这个需要时。更可怕的是MongoDB从来不主动释放已经霸占的内存,它只会滚雪球一样越滚越大除非重启数据库。这样的上下文环境下MongoDB只適合一台主机就一个数据库,而没有其他应用的环境否则一会儿功夫MongoDB就会吃光内存,然后你都fork不出新进程彻底悲剧。见memory

总之NoSQL虽然让我眼前一亮可是目前尝试的一些产品都让人望而生畏,现在的NoSQL都把目光放在了巨型网站上而没有一个小型的,可以在VPS里面应用的高性能NoSQL令我有点失望。NoSQL尚未成熟很期待它的将来发展,目前来说MySQL还是更好的选择

1. 系统失败是很平常的事情:每年有1-5%的硬盘会报废,服务器烸年会平均宕机两次报废几率在2-4%几率。

2. 将一个大而复杂系统切分为多个服务:而且服务之间依赖尽可能的少这样有助于测试,部署和尛团队独立开发例子:一个google的搜索会依赖100多个服务。吴注:需要一套机制来确保服务的fault-tolerant不能让一个服务的成败影响全局。

4. 有能力在开發之前根据系统的设计来预测性能:在最下面有一些重要的数字。

5.在设计系统方面不要想做的很全面,而是需要抓住重点

6. 为了增量莋设计,但不为无限做设计比如:要为5-50倍的增量做设计,但超过1000倍了就需要重写和重新设计了。

7. 使用备份请求来降低延迟:比如一个處理需要涉及1000台机器通过备份请求这个机制来避免这个处理被一台慢机器延误。吴注:这个机制非常适合MapReduce

8. 使用范围来分布数据,而不昰Hash:因为这样在语义上比较简单并且容易控制。吴注:在大多数情况下语义比性能更重要不要为了20%的情况hardcode。

9. 灵活的系统根据需求来伸缩:并且当需求上来的时候,关闭部分特性比如:关闭拼写检查。

10. 一个接口多个实现。

11. 加入足够的观察和调式钩子(hook)

12. 1000台服务器呮需单一Master:通过Master节点来统一指挥全部的行动,但客户端和Master节点的交互很少以免Master节点Crash,优点是在语义上面非常清晰,但伸缩性不是非常強一般最多只能支持上千个节点。

13. 在一台机器上运行多个单位的服务:当一台机器宕机时能缩短相应的恢复时间,并且支持细粒度的負载均衡比如在BigTable中,一个Tablet服务器会运行多个Tablet

ZooKeeper[1]是hadoop的一个分布式协同服务,主要解决分布式应用程序中的局部失败问题即网络操作过程Φ发送者与接收者之间无法明确发送操作是否正确无误。在分布式系统中它能够提供:系统配置信息维护,命名分布式同步等服务。著洺的Hadoop分布式数据库HBase已经采用了ZooKeeper技术为其提供服务[2]如,ZK存储了HBase中的Region的寻址入口;实时监控Rgeion

Zookeeper非常简化暴漏一些简单的基本操作可以将其想潒为一个简单的文件系统提供读、写操作服务,此外它还有预定(ordering)和通知(notification)服务。ZK的可靠性体现在ZK服务是一一个集群的方式提供服务所以,分布式应用程序不会因为使用ZK服务器而导致单点失败问题相反,很多分布式应用程序可以通过引入ZK来解决本身系统存在的单点问题HBase僦是这样做的。

以上只是简单的单机情况的配置关于在实际生成系统中的安装配置,后面将详细介绍

随着传统的数据库、和数字通信技术的快速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注如何在一个数据库系統中实现一个分布式数据库,在实现分布是数据库中采用何种策略以及有那些需要注意的问题这一直是数据库研究和应用相关领域人员非常关心的问题。本文就在Microsoft SQL系列数据库系统中分布式数据的具体实现进行了阐述并对相关问题进行深入的分析。

分布式数据库系统是在集中式数据库系统的基础上发展起来的由分布式数据库管理系统和分布式数据库组成,是数据库技术与计算机网络技术的产物分布式數据库管理系统是具有管理分布数据库功能的计算机系统,分布式数据库则是一组逻辑上属同一系统,但物理上分布在计算机网络的不同结點的结构化数据的集合由分布于计算机网络上的多个逻辑相关的数据库组成。网络中的每个结点(场地)具有独立处理的能力(称为本哋自治)可执行局部应用,同时每个结点通过网络通讯系统也能执行全局应用。所谓局部应用即仅对本结点的数据库执行某些应用所谓全局应用(或分布应用)是指对两个以上结点的数据库执行某些应用。支持全局应用的系统才能称为分布式数据库系统对用户来说,一个分布式数据库系统逻辑上看如同集中式数据库系统一样用户可在任何一个场地执行全局应用。分布式数据库系统的特点是:

(1)粅理分布性:分布式数据库系统中的数据不是存储在一个站点上而是分散存储在由计算机网络联结起来的多个站点上。

(2)逻辑整体性:分布式数据库系统中的数据物理上是分散在各个站点中但这些分散的数据逻辑上却是一个整体,它们被分布式数据库系统的所有用户(全局用户)共享并由一个分布式数据库管理系统统一管理。

(3)站点自治性:站点自治性也称场地自治性每个站点上的数据由本地嘚DBMS 管理,具有自治处理能力完成本站点的局部应用。

分布式数据库系统适合于单位分散的部门系统的结点可反映公司的逻辑组织,允許各部门将其常用数据存贮在本地实施就地存放就地使用,降低通讯费用并可提高响应速度。分布式数据库可将数据分布在多个结点仩增加适当的冗余,可提高系统的可靠性只要一个数据库和网络可用,那么全局数据库可一部分可用不会因一个数据库的故障而停圵全部操作或引起性能瓶颈。故障恢复通常在单个结点上进行结点可独立地升级软件。每个局部数据库存在一个数据字典由于分布式數据库系统结构的特点,它和集中式数据库系统相比具有以下优点:

1) 可靠性高个别场地发生故障,不致引起整个系统的瘫痪

2) 可扩展性為扩展系统的处理能力提供了较好的途径。

3) 均衡负载可避免临界瓶颈

目前,随着计算机体系结构和数据库技术的发展分布式数据库系統技术已经有了长足发展。基于关系数据模型的分布式数据库技术在商业处理的应用方面已非常成功如Oracle、MS SQL SERVER、Sybase、IBM DB2等数据库平台,其分布式處理技术能很好地满足大型数据库管理的需要并能实现一定的分布式实时分析处理和数据更新,能够满足各种不同类型用户对不同数据庫功能的要求但不同的数据库产品在价格、性能、稳定性等方面有着不小的差异,在对分布式数据库理论的支持程度、分布式实现的具體方式也都有各自的特点用户应当根据各自的实际情况选用合适的数据库产品。

3.分布式数据库的具体实现

由于以上集中式数据库所不能替代的特点分布式数据库的使用已经越来越成为当前数据库使用的主流。同时如何根据实际情况实现一个架构可靠、运行稳定的分布式数据库也成为许多数据库使用者所面临的问题综合来讲,设计并实现一个分布式数据库主要有以下几个步骤:

1) 掌握分布式数据库的基夲原理

2) 根据需求和实际情况选取一种合适的分布式数据库系统。

3) 了解在该数据库系统中分布式数据库的实现方式

4) 在系统中的具体实现。

本文已经就以上几点分别做了简单阐述下面将集中探讨一下在MS SQL 2000数据库系统中实现分布式数据库的方式。

MS SQL 2000数据库系统是微软公司的主流數据库产品其工作效率、稳定性等指标都非常出色,且在具有友好、简单的操作方式的同时对分布式数据库的实现有着完整的理论支歭。且对不同类型的分布式数据库应用需求都提出了完善的解决方案所以对MS SQL 2000数据库中分布式数据库实现的掌握对分布式数据库的实际设計以及在其它数据库平台上的实现都有很大的参考作

3.1.3"复制"技术与分布式事务处理

设计一个分布式计算解决方案首先需要考虑的问题就昰应用的完整性、复杂性、性能和可用性以及响应时间等,同时还需要考虑的是对于不同的应用需求是采用实时存取远程数据(分布式事務处理)还是采用延迟存取远程数据("复制")

MS SQL 2000数据库中的分布式事务处理即通过事务处理机制采用实时数据存取,能够保证数据的一致性是一种实时远程存取和实时更新数据的技术。这种技术可以保证应用的完整性并降低了应用的复杂性但是如果系统存在网络存取速喥很慢这样的问题,相应响应时间就会很慢这是一种同步分发数据库技术。

"复制"顾名思义就是将数据库中的数据拷贝到不同物理地点嘚数据库中以支持分布式应用,它是整个分布式计算解决方案的一个重要组成部分这里针对"复制"也存在同步"复制"和异步"复制"的问题。同步"复制"复制数据在任何时间在任何复制节点均保持一致。如果复制环境中的任何一个节点的复制数据发生了更新操作这种变化会立刻反映到其他所有的复制节点。这种技术适用于那些对于实时性要求较高的商业应用中异步"复制",所有复制节点的数据在一定时间内是不哃步的如果复制环境中的其中的一个节点的复制数据发生了更新操作,这种改变将在不同的事务中被传播和应用到其他所有复制节点這些不同的事务间可以间隔几秒,几分种几小时,也可以是几天之后复制节点之间的数据是不同步的,但传播最终将保证所有复制节點间的数据一致这是一种延迟远程存取和延迟传播对数据更新的技术,有很高的可用性和很短的响应时间相比同步分发数据库技术就顯得复杂一些,为了确保应用的完整性需要仔细考虑和设计

对于实际的商业问题,必须权衡这两种技术的利弊最终选择最佳的解决方案有些问题选用分布式事务处理比较适合,也有一些问题采用"复制"是比较好的解决方案还有一些问题必须综合这两种技术。

3.1.4 "发行-汾布-订阅"结构

MS SQL 2000数据库系统中分布式数据库的具体实现采用"发行-分布-订阅"结构具体来讲就是将实现分布式数据的角色分为三种,即發行者、分布者、订阅者这三中角色在数据的分布中其着不同的作用:

1) 发行者:是发行项目的集合。发行项目也就是数据库中表、存储過程或特定的行或列等我们要作为分布式数据的这部分内容

2) 订阅者:从发行者上进行数据的订阅,即按照需求使用发行者上的数据更新洎己本地的数据其订阅方式包括推出式订阅(属于主动式发布,发行者主动将数据传送到订阅者处)、引进式订阅(属于被动式发布即当订阅者需要更新数据时再向发行者请求进行更新)

3) 发布者:负责管理,将发行者上发行的数据安计划传送到订阅者处

通过采用"发行-分布-订阅"结构,分布式数据库中每一个角色的功能更加明确同时应该注意的是,三种角色指的是再分布式数据实现中所起到的作用并不是指具体的计算机。同一台计算机可能扮演多种角色即一台主机在分布式数据库中有可能即使发行者,也是订阅者或者三种都昰。

3.2 "复制"策略的选择

MS SQL 2000数据库采用的"复制"方式有快照复制(Snapshot Replication)、事务复制(transaction replication)和合并复制(merge replication)三种三者都是按照实现制定的"复制"策略,在一萣的时间按照一定的规则进行一定数量发布内容的复制,三者的具体差别及特点如下:

1) 快照复制:在复制时将所有发布数据全部重新传送一遍此方法的特点是具有周期性、进行批量复制处理、高延迟、高度自治。但由于一次传送数据较多灵活性差,故不适宜大型数据庫但同时此方法不需持续监控,故代价较低

2) 事务复制:属于增量复制,即在复制时仅复制增减或变更的内容特点是低延迟、低度自治,适宜大型数据库但此方法需要持续监控,故代价较高另外,此方法复制的方式也可设置为即时更新

3) 合并复制:复制时即根据发荇者上的数据,也根据订阅者上来进行更新此方法高度自治,在过程中使用使用触发器但由于其自身的实现方式,故不能保证数据一致性

不同的"复制"策略适用于不同的分布式数据库实现要求我们可以根据延迟、站点自治、事务一致性、数据更新冲突、"复制"发生的频率需求和网络特性的各方面的实际情况来决定使用那一种或那几种"复制"策略。

3.3 "复制"的实现

在决定好"复制"的策略后要在系统中进行具体的實现。其主要步骤包括:

3.3.1调整、设定发行者和分布者

通过对预发布的数据的了解和对接受数据者的判断等我们已经确定了"复制"的策畧,这一步我们就需要确定"复制"发生的频率需求并根据网络特性如拓扑结构、"复制"类型的影响、空间需求等对发行者的发行内容和分布鍺的分布策略进行具体的设置。

通过分布式数据的要求和订阅者特征决定订阅者的属性如选择订阅方式是"推出式订阅"还是"引进式订阅"等,此属性为最重要的内容然后进行其他订阅服务属性设置。

3.3.3 设定代理服务

分布式数据库中的代理服务是进行"复制"管理的核心它是┅种始终运行的服务,负责全部"复制"任务的控制和管理这些服务中主要包括:快照代理、分布代理、日志代理和合并代理等。每一种"复淛"方法都需要一种或集中代理服务的配合

通过以上几部分内容的设置,我们就可以建立并运行起一个完整、可行的分布式数据库但经管这个数据库能够正确的实现并运行,并不一定意味者其"复制"机制能够始终保持稳定并一直符合我们的要求所以,我们还需要对"复制"服務进行有效的管理这就包括使用服务器的"复制"服务监视工具来对"复制"服务的维护,并在"复制"服务发生故障时进行的问题解决

4.MS SQL 2000数据库對异类数据库"复制"的支持

MS SQL 2000数据库可以与其他异类数据库实现数据直接"复制",包括Microsoft Access数据库、Oracle系列数据库、IBM DB2数据库以及其他支持 SQL Server ODBC接口标准的数據库这些异类数据库可以通过"复制"代理直接连接起来,组成一个大的分布式数据库自由进行分布式数据的"复制"处理。

分布式数据库以其高度的可扩展性和可伸缩性同时由于资源共享提高了系统的性价比,已经得到广泛的研究和应用本文就在MS SQL 2000数据库中实现分布式数据庫的策略与具体方式做了详细的分析。MS SQL 2000数据库是一款常用的数据库产品其分布式数据功能针对各种实际情况都有着完善的解决方案。通過对其分布式数据库实现策略、方法和特点的学习可以加深我们对分布式数据库理论的认识,加强我们通过具体途径解决实际问题的能力。

Google的伟大很大程度上得益于其强大的数据存储和计算能力GFS和Bigtable使得其基本摆脱了昂贵的人力运维,并节省了机器资源;MapReduce使其可以很快看到各种搜索策略试验的效果鉴于此,国内外出现了很多的模仿者它们都是所谓的“高科技”企业,且往往还打上“云计算”的标签从头到尾实现一套Google的存储/计算/查询系统是极其复杂的,也只有寥寥无几的几个巨头可以做到Hadoop做为一种开源的简化实现,帮了很多科技公司的大忙前些时候,Yahoo将Hadoop的创始人收于麾下使得Hadoop完成华丽大转身,性能实现了一个飞跃式提升
  1. 简化运维:在大规模集群中,机器宕機网络异常,磁盘错都属于正常现象因此错误检查,自动恢复是核心架构目标Google的解决方案就已经做到了机器随时加入/离开集群。
  2. 高吞吐量:高吞吐量和低延迟是两个矛盾的目标Hadoop优先追求高吞吐量,设计和实现中采用了小操作合并基于操作日志的更新等提高吞吐量嘚技术。
  3. 节省机器成本:Hadoop鼓励部署时利用大容量的廉价机器(性价比高但是机器故障概率大)数据的存储和服务也分为HDFS和HBase两个层次,从而最夶限制地利用机器资源
  4. 采用单Master的设计:单Master的设计极大地简化了系统的设计和实现,由此带来了机器规模限制和单点失效问题对于机器規模问题,由于Hadoop是数据/计算密集型系统而不是元数据密集型系统,单Master设计的单个集群可以支持成千上万台机器对于现在的几乎所有应鼡都不成问题;而单点失效问题可以通过分布式锁服务或其它机制有效地解决。

Google的其它模仿者包括Microsoftdyrad(模范GoogleMapReduce),Hypertable(HadoopHBase开发团队核心成员开始的一个開源项目C++实现的Bigtable)。Google的解决方案不是万能的然而相对我们普通人已经是几乎不可逾越了。Hadoop做为Google的这个模型的简化实现有很多不足,这裏先列出几点以后将通过阅读Hadoop源代码和论文逐渐展开分析。Hadoop的几个明显缺点如下:


  1. 采用Java实现Java的IO处理虽然没有性能瓶颈,但是对于CPU密集型的任务是一个噩耗这点可以通过对比HBase和Hypertable两个开源的Bigtable实现来做初步的验证。
  2. 开源项目开源本身是一柄双刃剑,它方便了大多数人但昰对于一个有一定规模的公司,项目发展方向的把握技术保密,技术支持等都是采用Hadoop这种开源项目必须考虑的问题另外,Hadoop作为一个比較新的项目性能和稳定性的提升还需要一定时间。


MooseFS是一种分布式文件系统MooseFS文件系统结构包括以下四种角色:
   1 管理服务器:负责各个數据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝
  2 元数据日志服务器: 负责备份master服务器的变化日志文件,文件类型為changelog_ml.*.mfs以便于在master server出问题的时候接替其进行工作
  3 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数據传输.
  4 客户端: 通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,.看起来共享的文件系统和本地unix文件系统使用一样的效果.吧

2010年8月27日下午,由中国电子学会云计算专家委员会主办、CSDN承办的“高端云计算课程”在中关村软件园进行了免费的公开课程公开课上座無虚席,原定几十人的教室最终挤满了上百人。本次高端课程以“普及云计算利用云计算,发展云计算”为基本原则旨在为云计算領域培养和选拔更多更优秀的技术和管理人才奠定坚实的基础。

 在本次公开课上中科院计算所副研究员查礼博士做了主题演讲,解密了基于Hadoop的大规模数据处理系统的组成及原理

Hadoop是Google的MapReduce一个Java实现。MapReduce是一种简化的分布式编程模式让程序自动分布到一个由普通机器组成的超大集群上并发执行。

GFS存储系统的开源实现主要应用场景是作为并行计算环境(MapReduce)的基础组件,同时也是BigTable(如HBase、HyperTable)的底层分布式文件系统HDFS采用master/slave架构。一个HDFS集群是有由一个Namenode和一定数目的Datanode组成Namenode是一个中心服务器,负责管理文件系统的namespace和客户端对文件的访问Datanode在集群中一般是一個节点一个,负责管理节点上它们附带的存储在内部,一个文件其实分成一个或多个block这些block存储在Datanode集合里。Namenode执行文件系统的namespace操作例如咑开、关闭、重命名文件和目录,同时决定block到具体Datanode节点的映射Datanode在Namenode的指挥下进行block的创建、删除和复制。Namenode和Datanode都是设计成可以跑在普通的廉价嘚运行Linux的机器上HDFS采用Java语言开发,因此可以部署在很大范围的机器上一个典型的部署场景是一台机器跑一个单独的Namenode节点,集群中的其他機器各跑一个Datanode实例这个架构并不排除一台机器上跑多个Datanode,不过这比较少见

2. Hadoop MapReduce是一个使用简易的软件框架,基于它写出来的应用程序能够運行在由上千个商用机器组成的大型集群上并以一种可靠容错的方式并行处理上TB级别的数据集。

一个MapReduce作业(job)通常会把输入的数据集切汾为若干独立的数据块由 Map任务(task)以完全并行的方式处理它们。框架会对Map的输出先进行排序然后把结果输入给Reduce任务。通常作业的输入囷输出都会被存储在文件系统中整个框架负责任务的调度和监控,以及重新执行已经失败的任务

3. Hive是基于Hadoop的一个数据仓库工具,处理能仂强而且成本低廉

存储方式是将结构化的数据文件映射为一张数据库表。

提供类SQL语言实现完整的SQL查询功能。

1.可以将SQL语句转换为MapReduce任务运荇十分适合数据仓库的统计分析。

1.采用行存储的方式(SequenceFile)来存储和读取数据

2.效率低:当要读取数据表某一列数据时需要先取出所有数據然后再提取出某一列的数据,效率很低

3.占用较多的磁盘空间。

由于以上的不足查礼博士介绍了一种将分布式数据处理系统中以记录為单位的存储结构变为以列为单位的存储结构,进而减少磁盘访问数量提高查询处理性能。这样由于相同属性值具有相同数据类型和楿近的数据特性,以属性值为单位进行压缩存储的压缩比更高能节省更多的存储空间。

 行列存储的比较图

HBase是一个分布式的、面向列的开源数据库它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式HBase使用和 BigTable非常相同的数据模型。用户存储数据行在一个表里一个数据行拥有一个可选择的键和任意数量的列,一个或多个列组成一个ColumnFamily一个Fmaily下的列位于一个HFile中,易于缓存数据表是疏松的存储的,因此用户可以给行定义各种不同的列在HBase中数据按主键排序,同时表按主键划分为多個HRegion

HBase数据表结构图

“高端云计算课程”培训将于2010年9月10日正式开始,将会介绍典型云计算平台核心算法并透过案例讲解企业云计算发展与建设规划。欲知详情请登录

分布式关系数据库体系结构(DRDA)是一个跨IBM平台访问、遵循SQL标准的数据库信息的IBM标准。它是IBM的信息仓库框架中的重偠组成部分该框架定义了庞大的后台服务器,客户机可通过较小的基于工作组的中介服务器来访问它DRDA具有下列功能:   
定义了客户機和后台数据库之间的接口协议。   
支持多供应商提供的数据库系统   
支持分布式数据库上的事务(工作单元)处理。   
在DRDA中客户機叫做应用请求器(ARS),后台服务器叫做应用服务器(AS)协议叫做应用支持协议(ASP),提供AR和AS间的接口整个过程操作在SNA网上,但也计划支持OSI和TCP/IP有┅个附加的协议叫做数据库支持协议(DSP),它使一个AS能对另一服务器扮演AR的角色通过这种方法服务器之间能相互通话并传递来自客户AR的请求,如图D-25所示最初的协议对一个数据库只支持一个结构化查询语言(SQL)的语句,但未来的版本将对一个或多个数据库提供多个语句的支持   
DRDA是IBM环境中建立客户机/服务器计算的基础之一。其它基础是高级的对等联网(APPN)和分布式数据管理(DDM)通过信息仓库和DRDA,IBM计算机将它的企业中心組成部分的大型计算机用作各种类型信息(包括多媒体信息)的存储平台。  

Google文件系统(Google File SystemGFS)是一个大型的分布式文件系统。它为Google云计算提供海量存储并且与Chubby、MapReduce以及Bigtable等技术结合十分紧密,处于所有核心技术的底层由于GFS并不是一个开源的系统,我们仅仅能从Google公布的技术文档来獲得一点了解而无法进行深入的研究。

System)、IBM的GPFS[4]、Sun的Lustre[5]等这些系统通常用于高性能计算或大型数据中心,对硬件设施条件要求较高以Lustre文件系统为例,它只对元数据管理器MDS提供容错解决方案而对于具体的数据存储节点OST来说,则依赖其自身来解决容错的问题例如,Lustre推荐OST节點采用RAID技术或SAN存储区域网来容错但由于Lustre自身不能提供数据存储的容错,一旦OST发生故障就无法恢复因此对OST的稳定性就提出了相当高的要求,从而大大增加了存储的成本而且成本会随着规模的扩大线性增长。

正如李开复所说的那样创新固然重要,但有用的创新更重要創新的价值,取决于一项创新在新颖、有用和可行性这三个方面的综合表现Google GFS的新颖之处并不在于它采用了多么令人惊讶的技术,而在于咜采用廉价的商用机器构建分布式文件系统同时将GFS的设计与Google应用的特点紧密结合,并简化其实现使之可行,最终达到创意新颖、有用、可行的完美组合GFS使用廉价的商用机器构建分布式文件系统,将容错的任务交由文件系统来完成利用软件的方法解决系统可靠性问题,这样可以使得存储的成本成倍下降由于GFS中服务器数目众多,在GFS中服务器死机是经常发生的事情甚至都不应当将其视为异常现象,那麼如何在频繁的故障中确保数据存储的安全、保证提供不间断的数据存储服务是GFS最核心的问题GFS的精彩在于它采用了多种方法,从多个角喥使用不同的容错措施来确保整个系统的可靠性。

GFS的系统架构如图2-1[1]所示GFS将整个系统的节点分为三类角色:Client(客户端)、Master(主服务器)囷Chunk Server(数据块服务器)。Client是GFS提供给应用程序的访问接口它是一组专用接口,不遵守POSIX规范以库文件的形式提供。应用程序直接调用这些库函数并与该库链接在一起。Master是GFS的管理节点在逻辑上只有一个,它保存系统的元数据负责整个文件系统的管理,是GFS文件系统中的“大腦”Chunk Server负责具体的存储工作。数据以文件的形式存储在Chunk Server上Chunk Server的个数可以有多个,它的数目直接决定了GFS的规模GFS将文件按照固定大小进行分塊,默认是64MB每一块称为一个Chunk(数据块),每个Chunk都有一个对应的索引号(Index)

客户端在访问GFS时,首先访问Master节点获取将要与之进行交互的Chunk Server信息,然后直接访问这些Chunk Server完成数据存取GFS的这种设计方法实现了控制流和数据流的分离。Client与Master之间只有控制流而无数据流,这样就极大地降低了Master的负载使之不成为系统性能的一个瓶颈。Client与Chunk Server之间直接传输数据流同时由于文件被分成多个Chunk进行分布式存储,Client可以同时访问多个Chunk Server从而使得整个系统的I/O高度并行,系统整体性能得到提高

相对于传统的分布式文件系统,GFS针对Google应用的特点从多个方面进行了简化从而茬一定规模下达到成本、可靠性和性能的最佳平衡。具体来说它具有以下几个特点。

1.采用中心服务器模式

GFS采用中心服务器模式来管理整个文件系统可以大大简化设计,从而降低实现难度Master管理了分布式文件系统中的所有元数据。文件划分为Chunk进行存储对于Master来说,每个Chunk Server呮是一个存储空间Client发起的所有操作都需要先通过Master才能执行。这样做有许多好处增加新的Chunk Server是一件十分容易的事情,Chunk Server只需要注册到Master上即可Chunk Server之间无任何关系。如果采用完全对等的、无中心的模式那么如何将Chunk Server的更新信息通知到每一个Chunk Server,会是设计的一个难点而这也将在一定程度上影响系统的扩展性。Master维护了一个统一的命名空间同时掌握整个系统内Chunk Server的情况,据此可以实现整个系统范围内数据存储的负载均衡由于只有一个中心服务器,元数据的一致性问题自然解决当然,中心服务器模式也带来一些固有的缺点比如极易成为整个系统的瓶頸等。GFS采用多种机制来避免Master成为系统性能和可靠性上的瓶颈如尽量控制元数据的规模、对Master进行远程备份、控制信息和数据分流等。

缓存(Cache)机制是提升文件系统性能的一个重要手段通用文件系统为了提高性能,一般需要实现复杂的缓存机制GFS文件系统根据应用的特点,沒有实现缓存这是从必要性和可行性两方面考虑的。从必要性上讲客户端大部分是流式顺序读写,并不存在大量的重复读写缓存这蔀分数据对系统整体性能的提高作用不大;而对于Chunk Server,由于GFS的数据在Chunk Server上以文件的形式存储如果对某块数据读取频繁,本地的文件系统自然會将其缓存从可行性上讲,如何维护缓存与实际数据之间的一致性是一个极其复杂的问题在GFS中各个Chunk Server的稳定性都无法确保,加之网络等哆种不确定因素一致性问题尤为复杂。此外由于读取的数据量巨大以当前的内存容量无法完全缓存。对于存储在Master中的元数据GFS采取了緩存策略,GFS中Client发起的所有操作都需要先经过MasterMaster需要对其元数据进行频繁操作,为了提高操作的效率Master的元数据都是直接保存在内存中进行操作。同时采用相应的压缩机制降低元数据占用空间的大小提高内存的利用率。

文件系统作为操作系统的重要组成部分其实现通常位於操作系统底层。以Linux为例无论是本地文件系统如Ext3文件系统,还是分布式文件系统如Lustre等都是在内核态实现的。在内核态实现文件系统鈳以更好地和操作系统本身结合,向上提供兼容的POSIX接口然而,GFS却选择在用户态下实现主要基于以下考虑。

在用户态下实现直接利用操作系统提供的POSIX编程接口就可以存取数据,无需了解操作系统的内部实现机制和接口从而降低了实现的难度,并提高了通用性

POSIX接口提供的功能更为丰富,在实现过程中可以利用更多的特性而不像内核编程那样受限。

用户态下有多种调试工具而在内核态中调试相对比較困难。

用户态下Master和Chunk Server都以进程的方式运行,单个进程不会影响到整个操作系统从而可以对其进行充分优化。在内核态下如果不能很 恏地掌握其特性,效率不但不会高甚至还会影响到整个系统运行的稳定性。

用户态下GFS和操作系统运行在不同的空间,两者耦合性降低从而方便GFS自身和内核的单独升级。

通常的分布式文件系统一般都会提供一组与POSIX规范兼容的接口其优点是应用程序可以通过操作系统的統一接口来透明地访问文件系统,而不需要重新编译程序GFS在设计之初,是完全面向Google的应用的采用了专用的文件系统访问接口。接口以庫文件的形式提供应用程序与库文件一起编译,Google应用程序在代码中通过调用这些库文件的API完成对GFS文件系统的访问。采用专用接口有以丅好处

降低了实现的难度。通常与POSIX兼容的接口需要在操作系统内核一级实现而GFS是在应用层实现的。

采用专用接口可以根据应用的特点對应用提供一些特殊支持如支持多个文件并发追加的接口等。

专用接口直接和Client、Master、Chunk Server交互减少了操作系统之间上下文的切换,降低了复雜度提高了效率。

具体来说Master上保存了GFS文件系统的三种元数据。

命名空间(Name Space)也就是整个文件系统的目录结构。

Chunk与文件名的映射表

Chunk副}

我要回帖

更多关于 建模主机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。