MongoDB 2.2 发行说明

在本页面

Upgrading

MongoDB 2.2 是生产版本系列,是 2.0 生产版本系列的后续版本。

MongoDB 2.0 数据文件与 2.2 系列二进制文件兼容,无需任何特殊的迁移过程。但是,请始终使用以下过程对副本集和分片群集执行升级过程。

Synopsis

  • mongod,2.2 替代了 2.0 和 1.8.

  • 查看driver文档以获取有关所需兼容性升级的信息,并始终运行驱动程序的最新版本。

通常,只有运行身份验证的用户才需要升级驱动程序,然后才能 continue 升级到 2.2.

  • 对于所有使用身份验证的部署,请先升级驱动程序(即 Client 端库),然后再升级mongod个实例。

  • 对于分片群集的所有升级:

  • 在升级过程中关闭平衡器。有关更多信息,请参见禁用平衡器部分。

    • 在升级任何mongod实例之前,先升级所有mongos实例。

除上述限制外,2.2 进程可以与 2.0 和 1.8 工具和进程互操作。您可以安全地逐一升级部署的mongodmongos组件,而部署可以进行其他操作。在升级生产系统之前,请确保阅读以下详细的升级步骤。 [1]

[1]为了最大程度地减少election process造成的中断,请始终先升级集合的辅助数据库,然后再升级step down主数据库,然后再升级主数据库。

升级独立的 mongod

  • MongoDB 下载页面下载 2.2 系列最新版本的二进制文件。

  • 关闭您的mongod实例。将现有的二进制文件替换为 2.2 mongod二进制文件,然后重新启动 MongoDB。

升级副本集

您可以通过分别升级成员来执行集合的“滚动”升级,从而升级到 2.2,而其他成员则可以最大限度地减少停机时间。使用以下过程:

  • 通过关闭mongod并将 2.0 二进制文件替换为 2.2 二进制文件,一次升级一组secondary成员。升级mongod实例后,请 await 成员恢复到SECONDARY状态,然后再升级下一个实例。要检查成员的状态,请在mongo shell 中发出rs.status()

  • 使用mongo shell 方法rs.stepDown()降级primary以允许正常的failover过程。 rs.stepDown()加快了故障转移过程,比直接关闭主数据库更可取。

rs.status()的输出所示,一旦主数据库降级并且另一个成员已处于PRIMARY状态,请关闭先前的主数据库,并将mongod二进制文件替换为 2.2 二进制文件并开始新过程。

Note

副本集故障转移不是即时的,但是将使该集不可用于读取或接受写入,直到故障转移过程完成为止。通常,这需要 10 秒钟或更长时间。您可能希望在 sched 义的维护时段内计划升级。

升级分片群集

使用以下过程升级分片群集:

  • 禁用平衡器.

  • 首先以任何 Sequences 升级所有mongos个实例。

  • 使用stand alone过程升级所有mongod配置服务器实例。要使群集保持联机状态,请确保始终至少有一台配置服务器启动。

  • 使用上面详述的副本集的升级过程升级每个碎片的副本集。

  • 重新启用平衡器。

Note

  • mixed * 2.0.x 和 2.2.0 部署当前不支持平衡。因此,您将需要在合理的时间段内(例如,同一天.有关更多信息,请参见SERVER-6902

Changes

Major Features

Aggregation Framework

聚合框架使无需使用map-reduce即可进行聚合操作。 aggregate命令公开了聚合框架,而mongo shell 中的aggregate() helper 提供了这些操作的接口。考虑以下资源,以了解聚合框架及其用法:

TTL Collections

TTL 集合使用特殊索引和后台线程从集合中删除过期数据,该后台线程每分钟都会删除过期文档。在某些情况下,例如在数据仓库和缓存情况下,这些集合可用作capped collections的替代,包括:机器生成的事件数据,日志和会话信息,它们仅需要在有限的时间段内保存。

有关更多信息,请参见通过设置 TTL 使集合中的数据过期教程。

Concurrency Improvements

MongoDB 2.2 通过以下改进增加了服务器的并发操作能力:

为了反映这些更改,MongoDB 现在提供了更改和改进的并发和使用报告。参见locksrecordStatsdb.currentOp()mongotopmongostat

通过标记感知分片提高了数据中心感知

MongoDB 2.2 为clusters中的分片集合增加了对地理分布或其他自定义分区的支持。通过使用这种“标记感知”分片,您可以自动确保分片数据库系统中的数据始终位于特定分片上。例如,使用标记感知分片,可以确保数据与最经常使用该数据的应用程序服务器最接近。

分片标记控制数据位置,并且与副本集标记(控制read preferencewrite concern)互补,但与副本集标记分开。例如,分片标记可以将所有“美国”数据固定到一个或多个逻辑分片,而副本集标记可以控制应用程序使用哪些mongod实例(例如“ production”或“ reporting”)来服务请求。

请参阅支持标记分片配置的mongo shell 中的以下帮助程序的文档:

完全支持的阅读首选项语义

现在,所有 MongoDBClient 端和驱动程序都支持完整的read preferences,包括对完整范围读取偏好模式tag sets的一致支持。这种支持扩展到mongos,并且同样适用于单个副本集和sharded cluster中每个分片的副本集。

现在,使用readPref()游标方法在mongo shell 中提供了其他读取首选项支持。

Compatibility Changes

Authentication Changes

MongoDB 2.2 为身份验证 Client 端(包括驱动程序和mongos实例)提供了更可靠,更强大的支持。

如果您的集群通过身份验证运行:

  • 对于所有驱动程序,请使用驱动程序的最新版本并查看其发行说明。

  • 在分片环境中,为确保群集在升级过程中保持可用,您必须**使用分片群集的升级过程

findAndModify 返回执行插入的 Upsert 的 Null 值

在 2.2 版中,对于执行new选项设置为falseupsertfindAndModify命令现在将返回以下输出:

{ 'ok': 1.0, 'value': null }

mongo shell 中,执行插入操作(将new设置为false)的 upsert findAndModify操作仅输出null值。

在 2.0 版中,这些操作将返回一个空文档,例如{ }

有关更多信息,请参见:SERVER-6226

mongodump 2.2 输出与 2.2 之前的 mongorestore 不兼容

如果使用 2.2 发行版中的mongodump工具创建数据库的转储,则必须使用 2.2(或更高版本)的mongorestore来还原该转储。

有关更多信息,请参见:SERVER-6961

ObjectId()。toString()返回字符串 LiteralsObjectId(“ ...”)

在版本 2.2 中,toString()方法返回ObjectId()对象的字符串表示形式,格式为ObjectId("...")

考虑以下示例,该示例在ObjectId("507c7f79bcf86cd7994f6c0e")对象上调用toString()方法:

ObjectId("507c7f79bcf86cd7994f6c0e").toString()

现在,该方法返回* string * ObjectId("507c7f79bcf86cd7994f6c0e")

以前,在 2.0 版中,该方法将返回十六进制字符串 507c7f79bcf86cd7994f6c0e

如果需要 2.0 和 2.2 版本之间的兼容性,请使用ObjectId().str,它在两个版本中都包含十六进制字符串值。

ObjectId()。valueOf()返回十六进制字符串

在版本 2.2 中,valueOf()方法以小写十六进制字符串形式返回ObjectId()对象的值。

考虑以下示例,该示例在ObjectId("507c7f79bcf86cd7994f6c0e")对象上调用valueOf()方法:

ObjectId("507c7f79bcf86cd7994f6c0e").valueOf()

现在,该方法返回十六进制字符串 507c7f79bcf86cd7994f6c0e

以前,在 2.0 版中,该方法将返回* object * ObjectId("507c7f79bcf86cd7994f6c0e")

如果需要版本 2.0 和 2.2 之间的兼容性,请使用ObjectId().str属性,该属性在两个版本中都包含十六进制字符串值。

Behavioral Changes

集合名称的限制

在版本 2.2 中,集合名称不能:

  • 包含$

  • 为空字符串(即"")。

此更改不会影响在 MongoDB 的早期版本中使用非法名称创建的集合。

这些新限制是对集合名称的现有限制的补充:

  • 集合名称应以字母或下划线开头。

  • 集合名称不能包含空字符。

  • system.前缀开头。 MongoDB 为系统集合(例如system.indexes集合)保留system.

  • 集合名称的最大大小为 128 个字符,包括数据库的名称。但是,为了获得最大的灵 Active,集合的名称应少于 80 个字符。

集合名称可以具有任何其他有效的 UTF-8 字符串。

请参阅SERVER-4442Naming Restrictions常见问题解答。

Windows 的数据库名称限制

Windows 上运行的数据库名称不能再包含以下字符:

/\. "*<>:|?

数据文件的名称包括数据库名称。如果您尝试使用一个或多个这些字符升级数据库实例,则mongod将拒绝启动。

升级之前,请更改这些数据库的名称。有关更多信息,请参见SERVER-4584SERVER-6729

_id 上限集合的字段和索引

现在,默认情况下,所有capped collections都有一个_id字段,如果它们存在于local数据库之外,并且现在在_id字段上具有索引。此更改仅影响使用 2.2 实例创建的上限集合,而不会影响现有的上限集合。

有关更多信息,请参见:SERVER-5516

新的$ elemMatch 投影运算符

$elemMatch运算符允许应用程序缩小查询返回的数据范围,以便查询操作将仅返回数组中的第一个匹配元素。有关更多信息,请参见$elemMatch参考以及SERVER-2238SERVER-828问题。

Windows 特定更改

不支持 Windows XP

从 2.2 开始,MongoDB 不支持 Windows XP。请升级到 Windows 的最新版本,以使用最新版本的 MongoDB。有关更多信息,请参见SERVER-5648

mongos.exe 的服务支持

您现在可以将mongos.exe个实例作为 Windows 服务运行。有关更多信息,请参见mongos.exe参考以及将 MongoDB Community Edition 作为 Windows 服务运行SERVER-1589

日志旋转命令支持

Windows 的 MongoDB 现在通过logRotate数据库命令支持日志轮换。有关更多信息,请参见SERVER-2612

使用 SlimReadWrite 锁进行 Windows 并发的新版本

Downloads Page上标记为“ 2008”的 Windows Server 2008 R2 64 位版本和 Windows 7 或更高版本的此版本比 MongoDB 的标准 64 位 Windows 版本具有更高的性能。有关更多信息,请参见SERVER-3844

Tool Improvements

由 mongodump 和 mongorestore 处理的索引定义

当您为mongodump指定--collection选项时,mongodump现在将备份源数据库上存在的所有索引的定义。当您尝试使用mongorestore还原此备份时,目标mongod将重建所有索引。有关更多信息,请参见SERVER-808

mongorestore现在包括--noIndexRestore选项以提供上述行为。使用--noIndexRestore防止mongorestore构建先前的索引。

mongooplog 用于重播 Oplog

mongooplog工具可以从mongod实例中提取oplog条目并将其应用于另一个mongod实例。您可以使用mongooplog来实现 MongoDB 数据集的时间点备份。请参见SERVER-3873案例和mongooplog参考。

对 mongotop 和 mongostat 的身份验证支持

mongotopmongostat现在包含对用户名/密码身份验证的支持。有关此更改的更多信息,请参见SERVER-3875SERVER-3871。另请考虑以下选项的文档以获取更多信息:

为 mongoimport 和 mongorestore 编写关注支持

mongoimport现在提供了一个选项,可以在操作遇到错误(例如网络中断,重复的密钥异常或写入错误)时暂停导入。 --stopOnError选项将产生错误,而不是静默 continue 导入数据。有关更多信息,请参见SERVER-3937

mongorestore中,--w选项提供对可配置写关注的支持。

mongodump 支持从中学阅读

连接到replica setsecondary成员后,您现在可以运行mongodump。有关更多信息,请参见SERVER-3854

mongoimport 支持完整的 16MB 文档

以前,mongoimport仅会导入小于 4 兆字节的文档。现在,此问题已得到纠正,您可以使用mongoimport导入 ins 大小至少为 16 MB 的文档。有关更多信息,请参见SERVER-4593

Timestamp()扩展 JSON 格式

MongoDB 扩展的 JSON 现在包括一个新的Timestamp()类型,以表示 MongoDB 在oplog以及其他上下文中用于时间戳的时间戳类型。

这允许mongooplogmongodump之类的工具查询特定的时间戳。考虑以下mongodump操作:

mongodump --db local --collection oplog.rs --query '{"ts":{"$gt":{"$timestamp" : {"t": 1344969612000, "i": 1 }}}}'  --out oplog-dump

有关更多信息,请参见SERVER-3483

Shell Improvements

改进的 Shell 用户界面

2 .2 包含许多更改,这些更改可提高mongo shell 的整体质量和用户界面的一致性:

  • 全面的 Unicode 支持。

  • 重击般的行编辑功能。有关更多信息,请参见SERVER-4312

  • Shell 历史 Logging 的多行命令支持。有关更多信息,请参见SERVER-3470

  • Windows 对edit命令的支持。有关更多信息,请参见SERVER-3998

帮助程序加载服务器端功能

db.loadServerScripts()将当前数据库的system.js集合的内容加载到当前的mongo Shell 会话中。有关更多信息,请参见SERVER-1651

支持批量插入

如果您将documents数组传递给insert()方法,则mongo shell 现在将执行批量插入操作。有关更多信息,请参见SERVER-3819SERVER-2395

Note

对于分片群集上的批量插入,仅getLastError命令不足以验证成功。应用程序必须在应用程序逻辑中验证批量插入是否成功。

Operations

支持登录到 Syslog

请参阅SERVER-2957案例和syslogFacility运行时选项或mongod --syslogmongos --syslog命令行选项的文档。

touch Command

添加了touch命令以将集合中的数据和/或索引读取到内存中。有关更多信息,请参见:SERVER-2023touch

indexCounters 不再报告采样数据

indexCounters现在报告反映计数器使用和状态的实际计数器。在以前的版本中,这些数据是采样的。有关更多信息,请参见SERVER-5784indexCounters

可用紧凑命令指定填充

有关更多信息,请参见compactSERVER-4018问题的文档。

添加了构建标记以使用系统库

现在,Boost 库 1.49 版已嵌入 MongoDB 代码库中。

如果要使用系统 Boost 库构建 MongoDB 二进制文件,可以使用--use-system-boost标志传递scons,如下所示:

scons --use-system-boost

在构建 MongoDB 时,您还可以传递scons标志,以仅使用系统库而不使用包含的库版本来编译 MongoDB。例如:

scons --use-system-all

有关更多信息,请参见SERVER-3829SERVER-5172问题。

内存分配器已更改为 TCMalloc

为了提高性能,MongoDB 2.2 使用了 Google Perftools 的 TCMalloc 内存分配器。有关此更改的更多信息,请参见SERVER-188SERVER-4683。有关 TCMalloc 的更多信息,请参见TCMalloc本身的文档。

Replication

改进了副本集延迟的日志记录

当副本集的secondary个成员在复制中落后时,mongod现在可以在日志中提供更好的报告。这样就可以总体上跟踪复制并确定哪个过程可能产生错误或停止复制。有关更多信息,请参见SERVER-3575

副本集成员可以从特定成员同步

mongo shell 中的新replSetSyncFrom命令和新rs.syncFrom()帮助器使您可以手动配置副本集的哪个成员将轮询oplog条目。如果需要,使用这些命令覆盖默认选择逻辑。覆盖默认行为时,请始终对replSetSyncFrom保持谨慎。

副本集成员将不会与没有索引的成员同步,除非 buildIndexes:false

为防止副本集成员之间的不一致,如果副本集的成员将buildIndexes设置为true,则副本集的其他成员将与该成员同步,除非他们也将buildIndexes设置为true。有关更多信息,请参见SERVER-4160

用于在复制期间配置索引预取的新选项

默认情况下,在复制选项时,secondaries将预取与查询关联的Indexes,以在大多数情况下提高复制吞吐量。 replication.secondaryIndexPrefetch设置和--replIndexPrefetch选项允许 Management 员禁用此功能或允许mongod仅预提取_id字段上的索引。有关更多信息,请参见SERVER-6718

Map 减少改进

在 2.2 中,Map Reduce 获得了以下改进:

Sharding Improvements

分片键上的索引现在可以是复合索引

如果分片键使用现有索引的前缀,那么除了现有索引之外,您无需为分片键维护单独的索引。但是,该索引不能是多键索引。有关更多信息,请参见分片索引文档和SERVER-1506

迁移阈值已修改

migration thresholds在 2.2 中进行了更改,以允许chunks在数据量较小的集合中更均匀地分布。有关更多信息,请参见Migration Thresholds文档。

Licensing Changes

添加了有关 Google Perftools(TCMallocUtil)的许可通知。有关更多信息,请参见License NoticeSERVER-4683

Resources