NoSQL 对决:MongoDB 与 Couchbase

文档数据库可能是所有 NoSQL 数据库变体中最受欢迎的一种。它们具有极大的灵活性(可以非常轻松地扩展或更改模式),因此适用于各种应用程序,并且其对象特性与当前的编程实践非常契合。反过来,Couchbase Server 和 MongoDB 已成为开源文档数据库的两个最受欢迎的代表,尽管 Couchbase Server 是文档数据库行列中的新晋者。

在此上下文中,“文档”一词并不意味着文字处理文件或 PDF。相反,文档是一种定义为命名字段集合的数据结构。JSON(JavaScript 对象表示法)是目前在面向文档的数据库中定义文档的最广泛使用的表示法。JSON 作为对象表示法的优势在于,一旦您理解了它的语法(JSON 非常容易掌握),那么您就拥有了定义相当于文档数据库架构所需的一切。这是因为,在文档数据库中,每个文档都有自己的架构,这与 RDBMS 不同,在 RDBMS 中,给定表中的每一行都必须具有相同的列。

[ Andrew C. Oliver 回答了大家心中的问题:我应该使用哪个数据库?| InfoWorld 上还有:现在是 NoSQL 标准的时候了 | 获取 InfoWorld Daily 新闻通讯中每日重要新闻的摘要。]

Couchbase Server 和 MongoDB 的最新版本都刚刚发布。2012 年 12 月,Couchbase发布了 Couchbase Server 2.0,该版本使 Couchbase Server 成为一个成熟的文档数据库。在此版本之前,用户可以将 JSON 数据存储到 Couchbase 中,但数据库将 JSON 数据写入 blob。Couchbase 实际上是键/值数据库。

10gen本周刚刚发布了 MongoDB 2.4。MongoDB 从一开始就是一个文档数据库。最新版本包含许多性能和可用性增强功能。

这两个数据库都设计为在商用硬件上运行,以及通过分片进行水平扩展(在 Couchbase 中,与分片大致等同的术语称为分区)。这两个数据库都使用 JSON 作为文档定义符号,但在 MongoDB 中,符号是 BSON(二进制 JSON),这是 JSON 的二进制编码超集,它定义了 JSON 中没有的有用数据类型。虽然这两个数据库都使用 JavaScript 作为主要数据操作语言,但它们都为所有最流行的编程语言提供了 API,以允许应用程序直接访问数据库操作。

主要差异当然,两者还是有区别的。首先,MongoDB 的文档处理能力更强。这一点在 mongo shell 中表现得最为明显,它的作用是提供 MongoDB 数据库的管理和开发窗口。数据库、集合和文档是 shell 中的一等实体。集合实际上是数据库对象的属性。

这并不是说 Couchbase 受到限制。您可以通过 Couchbase Management GUI 轻松管理 Couchbase 集群(添加、删除和获取文档),而 MongoDB 没有这样的功能。事实上,如果您更喜欢通过 GUI 控制台进行管理,那么 Couchbase Server 是一个不错的选择。但是,如果您更喜欢使用命令行,那么 MongoDB 会是您的最佳选择。

基于云的 MongoDB 监控服务 (MMS) 用于收集统计数据,并非旨在成为成熟的数据库管理界面。但 MongoDB 的环境在 mongo shell 中抽象的数据对象和它们建模的数据库实体之间提供了近乎无缝的连接。当您发现 MongoDB 允许您使用单个函数调用在特定文档字段上创建索引时,这一点尤其明显,而 Couchbase 中的索引必须通过更复杂的 mapreduce 操作来创建。

此外,Couchbase 文档通过 JSON 描述,而 MongoDB 文档则以 BSON 描述;后者表示法包含更多有用的数据类型,例如 32 位和 64 位整数类型、日期类型和字节数组。两者都支持地理空间数据和查询,但 Couchbase 中的这种支持目前处于试验阶段,可能不会持续很长时间。MongoDB 2.4 版中的新功能还集成了全文搜索功能。Couchbase Server 中提供了类似的功能,但需要插件才能使用elasticsearch工具。

Couchbase Server 和 MongoDB 都通过复制提供数据安全,既可以在集群内(通过不可见地创建副本文档来保护实时文档免于丢失)也可以在集群外(通过跨数据中心复制)提供。此外,两者都通过分片提供访问并行性。但是,Couchbase 和 MongoDB 都支持哈希分片,而 MongoDB 支持范围分片和“标签”分片。这是一把双刃剑。一方面,它为数据库管理员提供了极大的灵活性。另一方面,误用它可能会导致集群不平衡。

Mapreduce 是 Couchbase 和 MongoDB 中使用的一个关键工具,但用途不同。在 MongoDB 中,mapreduce 用作一般数据处理、信息聚合和分析的手段。在 Couchbase 中,它是创建索引以查询数据库中的数据的手段。(我们怀疑,这与文档处理能力较差一样,是 Couchbase 最近才转变为文档数据库的结果。)因此,在 MongoDB 中创建索引和执行即席查询更加容易。

Couchbase 完全整合了 Memcached,而 MongoDB 中没有类似产品,Memcached 是高吞吐量、数据密集型互联网和内联网应用程序的强大辅助工具,可作为通用对象缓存系统。如果您的应用程序需要 Memcache 服务器和数据库,那么 Couchbase 就是您的最佳选择。

总体而言,这两个系统在提供的功能方面不相上下,尽管这些功能的实现方式可能有所不同。此外,随着开发的进行,一个系统相对于另一个系统的优势肯定会时有时无。两者都以所有流行的编程语言提供数据库驱动程序和客户端框架,两者都是开源的,两者都易于安装,并且都拥有大量在线文档和积极的社区支持。对于这种势均力敌的系统来说,最好的选择建议就是安装它们并试用它们。

Couchbase 将 Couchbase Server 宣传为实时访问解决方案,而非数据仓库。Couchbase Server 也不适合面向批处理的分析处理 — 它旨在成为一种操作数据存储。

尽管 Couchbase Server 基于 Apache CouchDB,但它比 CouchDB 更进一步,并进行了增量修改。首先,Couchbase 是 CouchDB 和 Memcached(分布式内存键/值存储系统)的混合体。事实上,Couchbase 可以直接替代 Memcached。该系统提供了一个单独的端口,未经修改的旧版 Memcached 客户端可以使用,以及“智能 SDK”和代理工具,可提高其作为 Memcached 服务器的性能。

例如,您可以使用“胖客户端”部署模型,该模型将不断更新的 Memcached 节点拓扑知识放在客户端层。这可以加快响应速度,因为对特定 Memcached 对象的任何请求都将从客户端直接发送到该对象的缓存节点。这种胖客户端方法还在 Couchbase 系统对节点崩溃的恢复能力方面发挥着重要作用(稍后介绍)。

Couchbase 包含自己的基于 Memcached 的对象级缓存系统,但进行了增强。例如,Couchbase 使用 NRU(最近未使用)算法跟踪其对象缓存中的工作集(给定节点上最常访问的文档)。所有 I/O 操作都作用于此内存缓存。缓存中文档的更新最终将保存到磁盘。此外,对于更新,锁定是在文档级别使用的 — 而不是在节点、数据库或分区级别(这会因大量 I/O 等待而影响吞吐量),也不是在字段级别(这会使系统因跟踪锁定所需的内存和 CPU 周期而陷入混乱)。

Couchbase 通过使用“仅追加”持久性来加速访问。这不仅用于数据,还用于索引。更新的信息永远不会被覆盖;相反,它会被附加到正在修改的任何数据结构的末尾。此外,已删除的空间通过压缩来回收,压缩操作可以安排在活动较少的时候进行。仅追加存储可加快更新速度,并允许在写入时进行读取操作。

Couchbase 扩展和复制为了便于水平扩展,Couchbase 使用哈希分片,以确保数据均匀分布在所有节点上。系统定义了 1,024 个分区(固定数量),一旦文档的密钥被哈希到特定分区,文档就驻留在该分区。在 Couchbase Server 中,用于分片的密钥是文档 ID,即自动生成并附加到每个文档的唯一标识符。每个分区都分配给集群中的特定节点。如果添加或删除节点,系统会通过将分区从一个节点迁移到另一个节点来重新平衡自身。

Couchbase 系统中不存在单点故障。Couchbase 集群中的所有分区服务器都是平等的,每个服务器只负责分配给它的那部分数据。集群中的每个服务器都运行两个主要进程:数据管理器和集群管理器。数据管理器处理分区中的实际数据,而集群管理器主要处理节点内操作。

文档复制增强了系统的弹性。集群管理器进程协调复制数据与远程节点的通信,数据管理器进程负责管理集群分配给本地节点的任何副本数据。当然,副本分区分布在整个集群中,因此分区的副本永远不会与活动分区位于同一台物理服务器上。

和文档本身一样,副本以存储桶为基础存在 — 存储桶是 Couchbase 中的主要包含单位。文档被放入存储桶中,从索引和查询操作的角度来看,一个存储桶中的文档与其他存储桶中的文档是隔离的。当您创建新存储桶时,系统会要求您指定要为该存储桶创建的副本数量(最多三个)。如果服务器崩溃,系统将检测到崩溃,找到崩溃系统上存在的文档的副本,并将这些副本提升为活动状态。系统维护一个集群映射,该映射定义了集群的拓扑结构,并在崩溃时进行更新。

请注意,此方案依赖于胖客户端(体现在应用程序用于与 Couchbase 通信的 API 库中),这些胖客户端会与服务器节点保持持续通信。这些胖客户端将获取更新的集群图,然后根据更改的拓扑重新路由请求。此外,胖客户端还参与对数据库的负载平衡请求。提供负载平衡的工作实际上是在智能客户端之间分配的。

拓扑结构的变化由协调器协调,协调器是被选为集群配置变化唯一仲裁者的服务器节点。所有拓扑结构变化都会发送到集群中的所有节点;即使协调器节点发生故障,也可以选出一个新节点来担任该位置,系统运行可以不间断地继续。

Couchbase 支持跨数据中心复制 (XDCR),可将一个 Couchbase 集群的数据库内容实时复制到地理位置较远的集群。请注意,XDCR 与集群内复制(将实时文档复制到其他集群成员上的非活动副本)同时运行,并且 XDCR 安排中的所有系统都以不可见的方式相互同步。但是,Couchbase 不为 XDCR 安排提供自动故障转移,而是依靠诸如使用负载平衡机制在网络层重新路由流量之类的技术,在这种情况下,XDCR 组将设置为主-主配置。

Couchbase 索引和查询Couchbase Server 上的查询是通过“视图”执行的,这是 Couchbase 术语,指的是索引。换句话说,当您创建索引时,会为您提供一个视图,作为查询 Couchbase 数据的机制。视图是 Couchbase 2.0 的新功能,支持实际创建视图的增量 mapreduce 引擎也是如此。请注意,在 Couchbase Server 2.0 之前,查询实际上并不存在。在此最新版本之前,数据库是一个键/值存储系统,根本不理解多字段文档的概念。

要定义视图,您需要构建一种称为设计文档的特定类型的文档。设计文档包含实现创建视图索引的 mapreduce 操作的 JavaScript 代码。设计文档绑定到特定的存储桶,这意味着查询不能跨多个存储桶执行。Couchbase 的“最终一致性”也在视图中发挥作用。如果您将新文档添加到存储桶或更新现有文档,则更改可能不会立即可见。

设计文档的 mapreduce 规范中的 map 函数会过滤并提取其执行的文档中的信息。结果是一组构成查询加速索引的键/值对。reduce 函数是可选的。它通常用于聚合或汇总由 map 操作处理的数据。reduce 函数中的代码可用于实现大致对应于 SQL 的 ORDER BY、SORT 和聚合功能的操作。

Couchbase Server 提供内置的 Reduce 函数:_count、_stats 和 _sum。这些内置函数经过了优化,如果从头编写,则无法实现。例如,_count 函数(用于计算 map 函数返回的行数)在调用时不必重新计算所有文档。如果将某个项目添加到相关索引或从中移除,则计数会相应增加或减少,因此 _count 函数只需检索维护的值即可。

查询参数可进一步过滤索引。例如,您可以使用查询参数定义查询,该查询返回索引中的单个条目或指定范围的条目。此外,在 Couchbase 2.0 中,文档元数据可用。在构建 mapreduce 函数时,这一点非常有用,因为 map 函数可以使用元数据根据到期日期和修订号等参数过滤文档。

Couchbase 索引是增量更新的。也就是说,当索引更新时,它不会被完全重建。更新仅涉及自上次更新索引以来已更改、添加或删除的文档。您可以将索引配置为在特定情况发生时更新。例如,您可以将索引配置为在针对它发出查询时更新。但是,这可能在计算上很昂贵,因此另一种方法是将索引配置为仅在视图中修改了指定数量的文档后才更新。还有另一种选择是基于时间间隔更新视图。

无论您选择哪种配置,重要的是要意识到设计文档可以包含多个视图,并且配置适用于文档中的所有视图。如果您更新一个索引,文档中的所有索引都将更新。

最后,Couchbase 区分了开发视图和生产视图,并将两者保存在单独的命名空间中。开发视图可以修改;生产视图则不能。之所以要区分,是因为如果您修改了视图,则该设计文档中的所有视图都将失效,并且设计文档中由 mapreduce 函数定义的所有索引都将重建。因此,开发视图使您能够在将视图代码部署到生产视图之前,在某种沙箱中对其进行测试。

您可以通过基于 Web 的管理控制台管理 Couchbase Server。如上所示,活动服务器视图仅对集群中的单个成员开放。内存缓存和磁盘存储使用情况信息一目了然。

管理 Couchbase要收集统计数据和管理 Couchbase Server 集群,Couchbase Web 控制台(可通过集群成员的端口 8091 上的任何现代浏览器访问)是最佳选择。它提供了集群机制的多选项卡视图。这些选项卡包括:

  • 集群概览,包含一般 RAM 和磁盘使用情况信息(针对整个集群汇总)。此外,还包含每秒操作数存储桶使用情况。这些信息以平滑滚动的线图形式呈现。
  • 服务器节点,提供与上述类似的信息,但针对集群的各个成员。您还可以查看 CPU 使用率和交换空间使用率。在此选项卡上,您可以向集群添加新节点:单击添加服务器按钮,系统会提示您输入 IP 地址和凭据。
  • 数据桶,显示集群上的所有桶。您可以查看哪些节点参与了给定桶的存储、每个桶中有多少个项目、桶的 RAM 和磁盘使用情况等等。

Couchbase Web 控制台提供的信息比本文介绍的要多得多。有关其功能的深入介绍,请参阅Couchbase Server 的在线文档

对于更愿意在机器上执行管理职责的管理员,Couchbase 提供了一套完善的命令行工具。couchbase-cli 工具提供了常规管理功能,它列出了集群中的所有服务器、检索单个节点的信息、启动重新平衡、管理存储桶等。cbstats 命令行工具显示集群统计信息,并且可以使它获取单个节点的统计信息(检索到的统计信息种类繁多,无法在此列出)。cbepctl 命令允许您修改集群的 RAM 和磁盘管理特性。例如,您可以控制“检查点”设置,该设置控制复制发生的频率。

其他命令行工具包括数据备份和恢复、从已(无论出于何种原因)停止运行的节点检索数据的工具,甚至还有在集群成员上生成 I/O 工作负载以测试其性能的工具。

Couchbase Server 有企业版和社区版。企业版比社区版经过了更彻底的测试,并且获得了最新的错误修复。此外,还提供热修复以及 24/7 支持(需购买年度订阅)。不过,企业版可免费用于在任意数量的节点上进行测试和开发,或最多在两个节点上进行生产使用。正如您可能猜到的那样,社区版可免费用于任意数量的生产节点。

  • 提供传统的 Memcached 功能
  • 支持空间数据和视图
  • 现在是一个真正的文档数据库
  • 索引机制尚未完善
  • JSON 支持相对不成熟
  • 不支持范围分片

MongoDB 大约有三年的历史,于 2009 年底首次发布。MongoDB 的目标是创建一个高性能的 NoSQL 数据库,同时不放弃使用 RDBMS 的优点。例如,MongoDB 中查询的设计和优化方式与 RDBMS 中的查询设计和优化方式类似。MongoDB 的设计者还希望让应用程序开发人员更容易使用该数据库 — 例如,允许开发人员快速更改数据模型。MongoDB 的名称是“humongous”的缩写,它将文档存储在 BSON(二进制 JSON)中,BSON 是 JSON 的扩展,允许使用整数、日期和字节数组等数据类型。

MongoDB 系统中有两个主要进程在运行:mongod 和 mongos。mongod 进程才是真正的主力。在分片 MongoDB 集群中,mongod 可以扮演两个角色之一:配置服务器或分片服务器。配置服务器跟踪集群的元数据。(在分片 MongoDB 集群中,为了实现冗余,必须至少有三个配置服务器。)每个配置服务器都知道集群中的哪个服务器负责给定的文档,或者更准确地说,知道给定的连续分片键范围(称为块)在集群中属于哪个位置。

集群中的其他 mongod 进程作为分片服务器运行,它们负责处理数据的实际读取和写入。为了实现故障转移,给定集群成员上的两个 mongod 进程实例作为分片服务器运行。一个进程为主进程,另一个为辅进程。所有写入请求都发送到主进程,而读取请求可以发送到主进程或辅进程。

次要服务器与主服务器异步更新,以便在主服务器崩溃时接管。然而,这意味着某些读取请求(发送到次要服务器)可能与写入请求(发送到主服务器)不一致。这是 MongoDB“最终一致性”的一个实例。随着时间的推移,所有次要服务器都将与主服务器上的写入操作保持一致。请注意,您可以通过配置 MongoDB 系统来保证一致的读/写行为,以便所有 I/O — 读取写入 — 转到主实例。在这种安排下,辅助服务器充当备用服务器,仅在主服务器发生故障时才上线。

mongos 进程在概念上比 mongod 进程运行在更高的层次上,最好将其视为一种路由服务。来自客户端的数据库请求首先到达 mongos 进程,该进程确定分片集群中的哪些分片可以为每个请求提供服务。mongos 进程将 I/O 请求分派到适当的 mongod 进程,收集结果并将其返回给客户端。请注意,在非分片集群中,客户端直接与 mongod 进程通信。

MongoDB 扩展和复制MongoDB 没有显式的内存缓存层。相反,所有 MongoDB 操作都是通过内存映射文件执行的。因此,MongoDB 将处理内存缓存与持久化到磁盘的繁琐工作交给了操作系统。但是,您可以调整各种刷新到磁盘设置以获得最佳性能。例如,MongoDB 维护一个数据库操作日志(用于恢复目的),该日志每 100 毫秒刷新到磁盘一次。不仅可以配置此间隔,还可以配置系统,以便写入操作仅在日志写入磁盘后返回。

文档被放置在名为集合的命名容器中,这些容器大致相当于 Couchbase 的存储桶。集合用于将相关文档划分为不同的组。MondoDB 数据库中许多多文档操作的影响仅限于执行这些操作的集合。MongoDB 支持集合级别的分片,这意味着 — — 如果需要 — — 您可以构建一个包含未分片和分片集合的数据库。当然,只有分片集合才能防止单点故障。

文档在特定分片中的成员身份由分片键决定,分片键来自每个文档中的一个或多个字段。确切的字段可以由数据库管理员指定。此外,MongoDB 提供自动分片功能,这意味着,一旦您配置了分片,MongoDB 将自动管理文档在适当物理位置的存储。这包括随着文档数量的增加或 mongod 实例数量的变化而重新平衡分片。

从 2.4 版开始,MongoDB 支持基于哈希的分片和基于范围的分片。正如您可能猜到的那样,基于哈希的分片会散列分片键,从而在整个集群中创建相对均匀的文档分布。使用基于范围的分片(2.4 版之前的唯一分片类型),MongoDB 分片集群的给定成员将存储分片键整体域的给定子范围内的所有文档。更准确地说,MongoDB 定义了一个逻辑容器,称为块,它是分片键在特定范围内的文档子集。然后,mongos 进程决定哪个 mongod 进程将管理给定的块。

通常,您允许负载均衡器确定哪个集群成员管理给定的分片范围。但是,使用版本 2.4,您可以将标签与分片范围关联(标签只不过是一个标识字符串)。完成后,您可以指定集群的哪个成员将管理与标签关联的任何分片范围。从某种意义上说,这可以让您覆盖一些负载均衡器的决策,并将可识别的数据库子集引导到特定服务器。例如,您可以将最常从加利福尼亚访问的数据放在加利福尼亚的集群成员上,将最常从德克萨斯州访问的数据放在德克萨斯州的集群成员上,依此类推。

MongoDB 的锁定是在数据库级别,而在 2.2 版之前它是全局的。系统实现共享读取、独占写入锁定(许多并发读取器,但只有一个写入器),优先考虑等待写入器而不是等待读取器。MongoDB 通过锁内的让出操作避免争用。2.2 版添加了预测编码;如果某个进程请求不在内存中的文档,它会让出其锁定,以便其他进程(其文档在内存中)可以得到服务。长时间运行的操作也会定期让出锁定。

MongoDB 中没有明确的事务概念。当然,您无法在 MongoDB 安装上执行纯 ACID 事务。如果启用日志记录,则可以使数据库更改持久化,在这种情况下,写入操作将被阻止,直到日志条目持久化到磁盘(如前所述)。MongoDB 定义了 $atomic 隔离运算符,它对所涉及的文档施加了相当于独占写入锁定的内容。但是,$atomic 仅适用于文档级别。您无法保护跨文档或集合的多个更新。

MongoDB 索引和查询MongoDB 可以轻松为所有文档字段创建二级索引。主索引始终存在于文档 ID 上。与 Couchbase Server 一样,每个文档都会自动生成主索引。但是,使用 MongoDB,您可以指定一个单独的字段作为文档的唯一标识符。例如,银行账户数据库可能会使用银行生成的账号作为文档 ID 字段。索引存在于集合级别,它们可以是复合的 — 即在多个字段上创建。MongoDB 还可以处理多键索引。如果您索引包含数组的字段,MongoDB 将索引该数组中的每个值。最后,MongoDB 支持地理空间索引。

MongoDB 的查询功能非常完善。如果您从 RDBMS 领域转到 MongoDB,在线文档会向您展示如何将 SQL 查询映射到 MongoDB 操作。例如,在大多数情况下,find() 函数可以执行与 SQL 的 SELECT 等效的操作。find() 函数有两个参数:查询文档和投影文档。查询文档指定对所获取的特定文档字段的过滤操作。您可以使用它来请求仅返回数量字段内容大于 100 的文档。因此,查询文档对应于 SQL 语句中的 WHERE 子句。投影文档标识结果中要返回哪些字段,这允许您请求仅从查询中返回匹配文档的名称和地址字段。sort() 函数可以在 find() 的结果上执行,对应于 SQL 的 ORDER BY 语句。

您可以使用命令 db 来定位文档。 .find(),可能是您可以执行的最简单的查询。 find() 命令将返回结果的前 20 个成员,但它还提供了一个游标,允许您遍历集合中的所有文档。如果您想更直接地浏览结果,您可以引用游标的元素,就像它是一个数组一样。

由于 MongoDB 的前缀运算符集,可以实现更复杂的查询,这些运算符可以描述比较以及布尔连接。MongoDB 还提供了 $regex 运算符,以防您想要将正则表达式应用于结果集中的文档字段。这些前缀运算符可用于 update() 命令,以构造 SQL 的 UPDATE ... WHERE 语句的 MongoDB 等效项。

在 2.2 版本中,MongoDB 添加了聚合框架,该框架允许计算聚合值,而无需求助于 mapreduce(如果您只想计算字段的总数或平均值,则可能有点过头了)。聚合框架提供的功能类似于 SQL 的 SUM 和 AVG 函数。它还可以计算计算字段并模仿 GROUP BY 运算符。请注意,聚合框架是声明性的 — 它不使用 JavaScript。您可以定义一系列操作,就像执行 Unix/Linux shell 编程一样,这些操作以流方式在目标文档上执行。

MongoDB 2.4 版本中最重要的新功能之一是文本搜索的出现。过去,开发人员通过将 Apache Lucene 与 MongoDB 集成来实现这一点,这增加了相当大的复杂性。在具有复制和容错功能的集群系统中添加 Lucene 并非易事。MongoDB 用户现在可以免费获得文本搜索。新的文本搜索功能并非旨在与 Lucene 相匹配,而是提供基本功能,例如更高效的布尔查询(“狗和猫但不是鸟”)、词干提取(搜索“阅读”也会得到“阅读”)以及从索引中自动剔除停用词(例如“and”、“the”、“of”)。

您可以在多个字符串字段上定义文本索引,但每个集合只能有一个文本索引,并且索引不存储单词接近度信息(即单词之间的接近程度,这会影响匹配的权重)。此外,文本索引是完全一致的:当您更新数据时,索引也会更新。

2.4 版还增加了一些易于使用的功能。例如,您现在可以将“上限数组”定义为数据元素,其工作原理类似于有序循环缓冲区。例如,如果您要跟踪博客中的前 10 个条目,则使用上限数组将允许您添加新条目,并且(根据指定的顺序)以前的条目将被删除,以将数组上限设置为 10 或您指定的任何数字。

MongoDB 2.4 还改进了地理空间功能。例如,您现在可以执行多边形操作,这将允许您确定两个区域是否重叠。2.4 中使用的球面模型也得到了改进;它现在考虑到地球不是完美的球形,因此距离计算更加准确。

MongoDB mapreduce在 Couchbase Server 中,mapreduce 操作的主要任务是提供对数据库中文档的结构化查询和信息聚合功能。在 MongoDB 中,mapreduce 不仅可用于查询和聚合结果,还可用作通用数据处理工具。就像 mapreduce 操作在 Couchbase Server 中的给定存储桶内执行一样,mapreduce 在 MongoDB 数据库中的给定集合内执行。与 Couchbase Server 一样,MongoDB 中的 mapreduce 函数也是用 JavaScript 编写的。

您可以通过比较运算符过滤传入 map 函数的文档,也可以将文档数量限制为特定数量。这样您就可以创建增量 mapreduce 操作。最初,您对整个集合运行 mapreduce。对于后续执行,您可以添加仅包含新添加文档的查询函数。然后,将 mapreduce 的输出设置为单独的集合,并配置代码,以便将新结果合并到现有结果中。

通过选择将中间结果(map 函数的输出,发送到 Reduce 函数)转换为 BSON 对象还是保留 JavaScript 对象,可以进一步权衡速度/大小。如果选择 BSON,BSON 对象将放置在临时的磁盘存储中,因此您可以处理的项目数量仅受可用磁盘空间的限制。但是,如果选择 JavaScript 对象,则系统只能处理 map 函数发出的大约 500,000 个不同键。但由于没有写入磁盘,因此处理速度更快。

您必须小心处理长时间运行的 mapreduce 操作,因为它们的执行涉及长时间的锁定。如前所述,系统具有内置功能来缓解这种情况。例如,每 100 个文档产生一次输入集合上的读取锁定。MongoDB 文档描述了必须考虑的各种锁定 - 以及缓解可能出现的问题的机制。

管理 MongoDBMongoDB 数据库的管理访问通过交互式 mongo shell 进行。它非常像一个命令行界面,允许您输入任意 JavaScript,但仍然出奇地简单。MongoDB 相关命令并不复杂,但如果您不小心,则会带来危险。例如,要选择数据库,请输入 use 。但是该命令不会检查特定数据库是否存在;如果您输入错误并继续将文档输入该数据库,您可能不知道发生了什么,直到您将大量文档放入错误的位置。数据库中的集合也是如此。

其他有用的命令行实用程序是 mongostat,它返回有关特定时间段内操作数量(插入、更新、删除等)的信息。mongotop 实用程序同样返回 MongoDB 实例的统计信息,这次重点关注特定集合。例如,您可以查看在集合中读取或写入所花费的时间。

此外,10gen 还提供免费的基于云的MongoDB监控服务(MMS)为 MongoDB 安装提供监控仪表板。MMS 基于 SaaS 模型构建,要求您在 MongoDB 集群上运行一个与管理系统通信的小型代理。

10gen 的 MongoDB 监控服务显示统计数据(在本例中为副本集),但数据库的管理是通过命令行完成的。

除了上面讨论的新文本搜索和地理空间功能外,MongoDB 2.4 还具有性能和安全性改进。性能增强包括工作集分析器。这个想法是,您希望配置系统,以便工作集(最常访问的数据库子集)完全适合内存。但要弄清楚您的工作集或您需要多少内存并不容易。工作集分析器的工作方式类似于辅助函数,可提供诊断输出,以帮助您发现工作集的特征并相应地调整系统。此外,JavaScript 引擎已被 Google 的开源 V8 引擎取代。过去,JavaScript 引擎是单线程的。V8 允许并发 mapreduce 作业,以及一般的速度改进。

最后,企业版欢迎基于 Kerberos 的身份验证。在所有版本中,MongoDB 现在都支持基于角色的权限,这让您可以更细粒度地控制用户对数据库和集合的访问和操作。

10gen 发布的 MongoDB 2.4 附带了新的订阅级别:社区版、基础版、标准版和企业版。社区版订阅级别是免费的,但也不提供任何支持。其他订阅级别提供不同的支持响应时间和可用时间。此外,企业版订阅级别附带 MongoDB 的企业版,该版本具有更多安全功能和 SNMP 支持。它也经过了更严格的测试。

  • 新版本整合了文本搜索功能
  • 新版本添加了改进的 JavaScript 引擎
  • 10gen 提供免费 MongoDB 培训课件
  • 文本索引不存储邻近信息
  • 没有基于 GUI 的管理控制台
  • Kerberos 身份验证仅在企业版中可用

Mongo 还是 Couch?照例,哪种产品是最佳选择在很大程度上取决于目标应用程序。两者都是备受推崇的 NoSQL 数据库,具有出色的血统。一方面,MongoDB 在其生命周期中的大部分时间都是作为文档数据库,并且它对文档级查询和索引的支持比 Couchbase 更丰富。另一方面,Couchbase 可以同样出色地用作文档数据库、Memcached 替代品或两者兼而有之。

令人高兴的是,探索 Couchbase 或 MongoDB 非常简单。可以轻松安装任一数据库服务器的单节点系统。如果您想尝试使用分片系统(并且有足够的内存和处理器能力),您可以在单个系统上轻松设置一组虚拟机,并通过虚拟网络交换机将它们捆绑在一起。这两个系统的文档都很丰富且维护良好。10Gen 甚至提供为开发人员提供免费的在线 MongoDB 课程,包括视频讲座、测验和家庭作业。

本文, ”NoSQL 对决:MongoDB 与 Couchbase”,最初发表于信息世界网. 关注最新动态应用程序开发,数据管理,云计算以及 InfoWorld.com 上的开源新闻。如需了解最新商业技术新闻,请关注InfoWorld.com 在 Twitter 上

阅读有关数据管理的更多信息在 InfoWorld 的数据管理频道中。