MongoDB 2.2的发布说明
升级
MongoDB 2.2是一个生产发布系列,继承了2.0生产发布系列。
MongoDB 2.0数据文件与2.2系列二进制文件兼容,没有任何特殊的迁移过程。但是,请始终按照以下步骤对副本集和分片集群执行升级过程。
大纲
mongod
,2.2是2.0和1.8的下拉式替代品。检查你的驱动程序有关所需兼容性升级信息的文档,并始终运行驱动程序的最新版本。
通常,只有运行身份验证的用户,在继续升级到2.2之前,需要升级驱动程序。
对于所有使用身份验证的部署,在升级
mongod
实例之前,请升级驱动程序(即客户端库)。对于所有分片集群的升级:
除上述限制外,2.2个流程可以与2.0和1.8工具和流程互操作。在部署运行期间,您可以逐个安全地升级部署的mongod
和mongos
组件。在升级生产系统之前,请务必阅读以下详细的升级程序。[1]
[1] | 为了最大程度地减少选举过程造成的中断 ,请始终先升级集合的辅助数据库,然后再升级主数据库,然后再升级主数据库。step down |
---|---|
升级独立产品mongod
- 从2.2系列中下载最新版本的二进制文件MongoDB下载页面。
- 关闭您的
mongod
实例。将现有的二进制文件替换为2.2mongod
二进制文件,然后重新启动MongoDB。
升级复制集
您可以通过单独升级成员来执行集合的“滚动”升级,从而升级到2.2,而其他成员则可以最大程度地减少停机时间。使用以下过程:
通过关闭并一次将2.0二进制文件替换为2.2二进制文件,一次升级集合的第二个成员
mongod
。升级mongod
实例后,请等待成员恢复到SECONDARY
状态,然后再升级下一个实例。要检查成员的状态,请rs.status()
在mongo
shell中发出。使用
mongo
shell方法rs.stepDown()
降级主要数据库,以允许常规故障转移过程。rs.stepDown()
加快故障转移过程,并且比直接关闭主数据库更可取。一旦主节点降级并且另一个成员进入
PRIMARY
状态,如在输出中观察到的rs.status()
,请关闭先前的主节点,并用mongod
2.2二进制文件替换 二进制文件并启动新进程。注意
副本集故障转移不是即时的,但是将使该集不可用于读取或接受写入,直到故障转移过程完成为止。通常,这需要10秒钟或更长时间。您可能希望在预定义的维护时段内计划升级。
升级分片群集
使用以下过程升级分片群集:
- 禁用平衡器。
- 首先以任何顺序升级所有
mongos
实例。 mongod
使用独立过程升级所有配置服务器实例。要使群集保持联机状态,请确保始终至少有一台配置服务器启动。- 使用上面详细介绍的副本集升级过程,升级每个碎片的副本集。
- 重新启用平衡器。
注意
当前在2.0.x和2.2.0 混合部署中不支持平衡。因此,您希望在合理的时间段内(例如同一天)为所有分片取得一致的版本。有关更多信息,请参见SERVER-6902。
变更
主要功能
聚合框架
聚合框架使无需使用map-reduce即可进行聚合操作。该 aggregate
命令公开了聚合框架,并且外壳程序中的 aggregate()
帮助mongo
程序为这些操作提供了接口。考虑以下资源,以了解聚合框架及其用法:
TTL集合
TTL集合使用特殊索引和后台线程从集合中删除过期数据,该后台线程每分钟删除一次过期文档。在某些情况下,例如在数据仓库和缓存情况下,这些集合可用于替代 上限集合,包括:机器生成的事件数据,日志和会话信息,它们仅需要在有限的时间段内保留。
有关更多信息,请参见通过设置TTL从集合中过期数据教程。
并发改进
MongoDB 2.2通过以下改进增加了服务器的并发操作能力:
为了反映这些更改,MongoDB现在提供了更改和改进的并发和使用报告。见锁,recordStats,db.currentOp()
, mongotop和mongostat。
通过标签感知分片提高了数据中心的意识
MongoDB 2.2添加了对地理分布或集群中分片集合的其他自定义分区的附加支持。通过使用这种“标记感知”分片,您可以自动确保分片数据库系统中的数据始终位于特定分片上。例如,使用标记感知分片,可以确保数据与最经常使用该数据的应用程序服务器最接近。
碎片标记控制数据位置,并且与副本集标记互补,但与副本集标记分开,副本集标记控制读取首选项和写关注。例如,分片标记可以将所有“美国”数据固定到一个或多个逻辑分片,而副本集标记可以控制应用程序使用哪些mongod
实例(例如“ production
”或“ reporting
”)来服务请求。
请参阅mongo
shell中支持标记分片配置的以下帮助程序的文档:
完全支持的读取首选项语义
现在,所有MongoDB客户端和驱动程序都支持完全读取首选项,包括对各种读取首选项模式和标记集的一致支持。此支持扩展到,mongos
并且同样适用于单个副本集以及分片群集中每个分片的副本集。
现在,mongo
使用readPref()
cursor方法在shell中提供了附加的读取首选项支持。
兼容性变更
身份验证更改
MongoDB 2.2为身份验证客户端(包括驱动程序和mongos
实例)提供更可靠、更强大的支持。
如果您的集群运行时具有身份验证:
- 对于所有驱动程序,请使用最新版本的驱动程序并检查其发布说明。
- 在分片环境中,为了确保您的集群在升级过程中仍然可用,您必须使用分片集群的升级过程。
findAndModify
返回执行插入的升级的空值
在2.2版本中,对于使用设置为false``new
选项执行插入的向上搜索,findAndModify
命令现在将返回以下输出:
{ 'ok': 1.0, 'value': null }
在mongo
Shell中,findAndModify
执行插入(new
设置为false
。)的upsert 操作仅输出一个null
值。
在2.0版中,这些操作将返回一个空文档,例如。{ }
有关更多信息,请参见:SERVER-6226。
mongodump
2.2 与Pre-2.2不兼容的输出mongorestore
如果使用mongodump
2.2发行版中的工具创建数据库转储,则必须使用2.2(或更高版本)的 mongorestore
还原该转储。
有关更多信息,请参见:SERVER-6961。
ObjectId().toString()
返回字符串字面ObjectId("...")
在2.2版本中,toString()
方法返回ObjectId()对象的字符串表示形式,格式为ObjectId("...")
考虑以下在ObjectId("507c7f79bcf86cd7994f6c0e")
对象上调用toString()
方法的示例:
ObjectId("507c7f79bcf86cd7994f6c0e").toString()
该方法现在返回:
tringObjectIdObjectId("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版本中,该方法将返回:
objectObjectIdObjectId("507c7f79bcf86cd7994f6c0e")
。
如果需要2.0和2.2版本之间的兼容性,请使用ObjectId().str属性,该属性在两个版本中都包含十六进制字符串值。
行为变化
在集合名称限制
在版本2.2中,集合名称不能:
- 包含
$
。 - 是空字符串(即
""
。
此更改不影响在早期版本的MongoDB中使用现在非法名称创建的集合。
除了对集合名称的现有限制外,这些新限制是:
- 集合名称应以字母或下划线开头。
- 集合名称不能包含空字符。
- 以
system.
前缀开头。MongoDBsystem.
为系统集合(例如集合) 保留system.indexes
。 - 集合名称的最大大小为128个字符,包括数据库的名称。但是,为了获得最大的灵活性,集合的名称应少于80个字符。
集合名称可以具有任何其他有效的UTF-8字符串。
请参阅SERVER-4442和“ 命名限制”常见问题。
Windows 版数据库名称限制
在Windows上运行的数据库名称不能再包含以下字符:
/\. "*<>:|?
数据文件的名称包括数据库名称。如果您尝试使用一个或多个这些字符升级数据库实例,mongod
将拒绝启动。
在升级之前更改这些数据库的名称。看服务器-4584和服务器-6729了解更多信息。
_id
上限集合上的字段和索引
如果所有有上限的集合存在于数据库外部_id
,则默认情况下现在都有一个域local
,并且现在在该_id
域上具有索引。此更改仅影响使用2.2实例创建的上限集合,而不会影响现有的上限集合。
有关更多信息,请参见:SERVER-5516。
新的$elemMatch
投影运算符
$elemMatch
运算符允许应用程序缩小从查询返回的数据范围,以便查询操作将仅返回数组中的第一个匹配元素。请参阅$elemMatch
参考和SERVER-2238和SERVER-828获取更多信息的问题。
Windows特定更改
不支持Windows XP
截至2.2,MongoDB不支持Windows XP。请升级到最新版本的Windows,以使用最新版本的MongoDB。看SERVER-5648了解更多信息。
服务支持mongos.exe
您现在可以将exe
实例作为Windows服务运行。
日志旋转命令支持
Windows版MongoDB现在通过logRotate
数据库命令支持日志旋转。看SERVER-2612了解更多信息。
使用SlimReadWrite Locks for Windows并发的新版本
在下载页面上标记为“ 2008+”的此版本针对Windows Server 2008 R2的64位版本以及Windows 7或更高版本提供了比MongoDB的标准64位Windows版本更高的性能。有关更多信息,请参见SERVER-3844。
工具改进
由mongodump
和mongorestore
当您指定--collection
选项时mongodump
,mongodump
现在将备份源数据库上存在的所有索引的定义。当您尝试恢复此备份时mongorestore
,目标mongod
将重建所有指数。看SERVER-808了解更多信息。
mongorestore
现在包括--noIndexRestore
提供上述行为的选项。使用--noIndexRestore
以防止mongorestore
从建筑以前索引。
mongooplog
用于重播Oplog
mongooplog
工具可以从mongod
实例中提取oplog条目并将其应用于另一个mongod
实例。您可以使用mongooplog
实现MongoDB数据集的时间点备份。请参阅SERVER-3873案例和mongooplog
参考。
mongotop
和mongostat
mongotop
和mongostat
现在包含对用户名/密码身份验证的支持。看SERVER-3875和SERVER-3871了解有关此更改的更多信息。还要考虑记录以下选项以获取更多信息:
mongotop --username
mongotop --password
mongostat --username
mongostat --password
撰写对mongoimport
和mongorestore
mongoimport
现在,如果操作遇到错误,例如网络中断、重复密钥异常或写入错误,则提供停止导入的选项。--stopOnError
选项将产生错误,而不是默默地继续导入数据。看SERVER-3937了解更多信息。
mongorestore
,--w
选项为可配置的写入问题提供支持。
mongodump
支持从中学阅读
现在mongodump
,连接到副本集的 辅助成员后即可运行。有关更多信息,请参见 SERVER-3854。
mongoimport
支持完整的16MB文档
以前,mongoimport
只会导入大小小于4兆字节的文件。此问题现已得到纠正,您可以使用mongoimport
导入大小至少为16兆字节的文档。看SERVER-4593了解更多信息。
Timestamp()
扩展的JSON格式
MongoDB扩展的JSON现在包括一个新的Timestamp()
类型,以表示MongoDB在oplog中用于时间戳的Timetamp类型。
这允许像mongooplog
和mongodump
查询特定时间戳。考虑以下几点mongodump
操作:
mongodump --db local --collection oplog.rs --query '{"ts":{"$gt":{"$timestamp" : {"t": 1344969612000, "i": 1 }}}}' --out oplog-dump
有关更多信息,请参见SERVER-3483。
shell 改进
改进的shell用户界面
2.2包含许多更改,这些更改提高了mongo
shell 程序用户界面的整体质量和一致性:
- 全面的Unicode支持。
- 重击般的行编辑功能。有关更多信息,请参见SERVER-4312。
- Shell历史记录中的多行命令支持。有关更多信息,请参见SERVER-3470。
- Windows对
edit
命令的支持。有关更多信息,请参见SERVER-3998。
加载服务器端函数的帮助程序
将db.loadServerScripts()
当前数据库system.js
集合的内容加载到当前mongo
Shell会话中。
有关更多信息,请参见SERVER-1651。
支持批量插入
如果您将文档数组传递给insert()
方法,mongo
现在将执行批量插入操作。
看SERVER-3819和SERVER-2395了解更多信息。
注意
对于分片集群上的批量插入,仅使用
getLastError
不足以验证成功。应用程序必须验证applicationlogic中批量插入是否成功。
运营
支持登录Syslog
请参阅SERVER-2957和syslogFacility运行时选项或mongod --syslog
和mongos --syslog
命令行选项的案例和文档。
touch
指挥权
添加了touch
命令,将集合中的数据和/或索引读取到内存中。参见:SERVER-2023并touch
以获取更多信息。
indexCounters
不再报告采样数据
indexCounters
现在报告反映索引使用和状态的实际计数器。在之前的版本中,对这些数据进行了采样。看SERVER-5784和indexCounters
以获取更多信息。
compact
命令上可指定填充物
请参阅compact
和SERVER-4018获取更多信息的问题。
添加了构建标志以使用系统库
Boost库,1.49版本,现在嵌入在MongoDB代码库中。
如果您想使用system Boost库构建MongoDB二进制文件,您可以使用--use-system-boost
标志传递scons
,如下所示:
scons --use-system-boost
在构建MongoDB时,您还可以仅使用系统库而不是包含的库版本传递一个标志来编译MongoDB。例如:
scons --use-system-all
请参阅SERVER-3829和SERVER-5172获取更多信息的问题。
内存分配器更改为TCMalloc
为了提高性能,MongoDB 2.2使用Google Perftools的TCMalloc内存定位器。有关此更改的更多信息,请参阅服务器-188和服务器-4683。有关TCMalloc的更多信息,请参阅TCMalloc本身。
复制
改进了副本集滞后的日志记录
当副本集的次要成员在复制中落后时,mongod
现在可以在日志中提供更好的报告。这使得可以跟踪一般复制,并确定哪些过程可能会产生错误或停止复制。看SERVER-3575了解更多信息。
副本集成员可以从特定成员同步
新的replSetSyncFrom
命令和新 rs.syncFrom()
帮手的mongo
shell 有可能使您手动配置从哪个成员集合的副本将轮询OPLOG条目。如果需要,可以使用这些命令覆盖默认选择逻辑。replSetSyncFrom
覆盖默认行为时请务必谨慎。
复制集成员不会与没有索引的成员同步,除非buildIndexes: false
为了防止副本集成员之间的不一致,如果副本集的成员将buildIndexes
设置为true
,则副本集的其他成员将不会与此成员同步,除非他们也将buildIndexes
设置为true
。看服务器-4160了解更多信息。
在复制期间配置索引预取的新选项
默认情况下,在复制选项时,次要将预取与查询关联的索引,以提高大多数情况下的复制吞吐量。replication.secondaryIndexPrefetch
设置和`--replIndexPrefetch
选项允许管理员禁用此功能或允许mongod
仅预取_id
字段上的索引。看服务器-6718了解更多信息。
地图减少改进
在2.2 Map Reduce中,Reduce获得了以下改进:
分层改进
碎片键上的索引现在可以成为复合索引
如果您的分片密钥使用现有索引的前缀,那么除了现有索引外,您无需为碎片密钥维护单独的索引。然而,这个指数不能是多键索引。请参阅碎片密钥索引文档和SERVER-1506了解更多信息
修改了迁移阈值
迁移阈值在2.2中发生了变化,以便在数据量较小的集合中更均匀地分布块。有关更多信息,请参阅迁移阈值文档。
许可变更
添加了Google Perftools(TCMalloc实用程序)的许可证通知。请参阅许可证通知和SERVER-4683了解更多信息。
资源
- MongoDB下载。
- 所有JIRA问题都在2.2中得到解决+ORDER+BY+component+ASC%2C+key+DESC)。
- 所有向后不兼容的更改 AND "Backwards Compatibility" in ("Major Change"%2C "Minor Change") ORDER BY votes DESC%2C issuetype DESC%2C key DESC)。
- 所有第三方许可通知。
- MongoDB 2.2在线会议的新功能。
译者:韩鹏帅
参见