Ohhnews

分类导航

$ cd ..
foojay原文

MongoDB 8.0 升级迁移指南:关键事项与策略

#mongodb#数据库升级#性能优化#数据迁移#系统兼容性

目录

你是否想过为什么更新和升级对任何系统都如此重要?其实这并不奇怪:它们确保系统保持相关性和高效性。对于 MongoDB 来说也是如此。每当我们考虑更新时,我们都在寻求效率、安全性、性能以及更新系统带来的其他好处。然而,每次更新都会引入需要仔细管理的变更。在本文中,我们将介绍 MongoDB 8.0 版本的一些新功能,并重点强调在迁移到这个新版本之前需要考虑的关键因素。

8.0 版本有哪些新功能?

这个最受欢迎的文档数据库现在比以往任何时候都快。对于追求性能、前沿技术和直观体验的用户来说,MongoDB 8.0 是一个绝佳的选择。与早期版本相比,它在吞吐量和延迟方面提供了显著的改进。针对 7.0 版本的内部测试表明,读取速度提高了 32%,更新速度提高了 59%,时序查询速度提高了 200% 以上。这一最新版本的发布重点关注几个关键支柱:

性能提升:MongoDB 8.0 提供了显著的性能改进,例如更快的读取、写入和批量操作。你知道 insertManybulkInsert 吗?嗯,它们已经过优化!因此,如果您的应用程序经历高负载,升级到 8.0 可以大幅减少响应时间并提高吞吐量,确保您的系统即使在重度使用下也能保持可扩展性。

安全性:在 MongoDB 8.0 中,可查询加密引入了使用 $lt$lte$gt$gte 操作符对加密字段执行范围查询的能力。

弹性、可扩展性和高可用性:使用 MongoDB 8.0,水平扩展现在变得更快且更经济。这种方法允许应用程序通过将数据分布在多个服务器(称为分片)上,从而突破传统数据库的限制,而无需提前准备大量资源。MongoDB 8.0 中的新分片功能使数据分发速度提高了 50 倍,同时成本降低了高达 50%。

通用变更

可查询加密

在新版本中,可查询加密使您能够进行范围搜索,使用 $lt$lte$gt$gte 等操作符,例如按特定间隔(如日期或数值)过滤数据,同时保持数据加密。

[LOADING...]

MongoDB 加密数据视图

如果您想了解更多,文章 Java 遇见可查询加密:开发安全的银行账户应用程序 提供了有关如何实现 Java 应用程序以探索该版本中这一新功能的详细说明。

Express 查询阶段

Express 被引入为一个新的执行阶段,用于针对简单用例优化查询路径。例如,如果您正在运行一个使用单个 _id 索引的简单查询...

db.customer.find({_id: ObjectId('670ec6b005b98857588f5b6a')}).explain()

...您将看到这个新的 EXPRESS_IXSCAN 阶段已被包含在内。

[LOADING...]

MongoDB Compass 执行计划视图

EXPRESS 阶段可以是以下之一:

  • EXPRESS_CLUSTERED_IXSCAN
  • EXPRESS_DELETE
  • EXPRESS_IXSCAN
  • EXPRESS_UPDATE

您的查询现在将利用这个新阶段,而不是执行经典的计划阶段。这跳过了常规的查询规划和执行,从而带来高达 17% 的性能提升。

查询形状和查询设置

MongoDB 中的查询形状代表一组将相似查询分组的属性,包括过滤器、排序、投影、聚合阶段和命名空间。这使 MongoDB 能够通过为结构相似的查询重用查询计划来提高性能,从而实现更高效的执行。从 MongoDB 8.0 开始,查询形状支持查询设置,允许您为匹配的查询定义特定行为。

其中一种行为是 reject: true 设置。当应用此设置时,MongoDB 将自动拒绝任何与此形状匹配的查询,无论其具体值如何。

用例:想象一下,您正在管理一个接收来自第三方应用程序查询的数据库。一个应用程序开始发送执行集合扫描 (COLLSCAN) 的繁重查询,显著降低了系统速度——例如,这样的查询:

db.pizzaOrders.find({price: 10})

// 执行计划
"winningPlan": {
     "stage": "COLLSCAN",
     "filter": {
       "price": {
         "$eq": 20
       }
     },
   },

我们可以设置一个 querySettings 来拒绝与此结构匹配的查询(独立于值):

db.adminCommand( {  
  setQuerySettings: {
     find: "pizzaOrders",
     filter: {
        price: 20
     },
     $db: "my_database"
  },
  settings: {           
     comment: "将被拒绝",
     reject: true
  }
} )

此命令设置了一个查询形状,其中任何在 pizzaOrders 集合中查找价格的查询都将被拒绝,无论查询中提供的实际价格值是多少。(重点完全在于查询的结构。)因此,如果我们执行一个与此结构匹配的查询...

db.pizzaOrders.find({price: 10})

...该查询将被 MongoDB 自动拒绝:

[LOADING...]

被管理员查询设置拒绝的查询

要查看所有查询设置,您可以在聚合管道中使用 $querySettings 阶段:

db.aggregate( [
   { $querySettings: {} }
] )

结果:

[ 
{
   "queryShapeHash": "4DD2DED8A25C787DFA41325883052FABB97DDEE567B2636A3B188DDF0CCFE6F0",
   "settings": {
     "reject": true,
     "comment": "将被拒绝"
   },
   "representativeQuery": {
     "find": "pizzaOrders",
     "filter": {
       "price": 20
     },
     "$db": "my_database"
   }
 }
]

但是,如果您想检查查询形状——即已执行的不同类型的查询——您有两个选择:

  1. 使用 $queryStats
    • 此聚合阶段提供自上次服务器重启以来运行的查询的统计信息。
use('admin');

db.aggregate( [
{ $queryStats: {} }
])
  1. 检查 MongoDB 日志。
  • 慢查询连同其 queryShapeHashes 一起记录在 MongoDB 日志中。
  • 这对于识别需要优化的低效查询很有用。

要删除设置,我们可以使用查询形状哈希:

db.adminCommand(
   {
       removeQuerySettings: '4DD2DED8A25C787DFA41325883052FABB97DDEE567B2636A3B188DDF0CCFE6F0'
   }
)

这种方法非常有价值,因为它确保数据库不会受到可能导致高资源消耗的第三方查询的影响,而无需更改应用程序。

兼容性和弃用

查询行为

在 8.0 版本之前,如果您搜索等于 null 的值,值为 undefined 的字段也会被返回。然而,在这个新版本中,存储为 undefined 的数据将不再在 null 相等性查询中返回——例如:

// People 集合

[
   { _id: 1, name: null },
   { _id: 2, name: undefined }
]

// 给定此集合,如果您运行以下查询…

db.people.find({name: null})

// 结果是...

[
   { _id: 1, name: null }
]

带有 undefined 的数据将不再被返回。如果您的应用程序包含带有 undefined 的数据,您可以重写或迁移 undefined 数据和查询以解决此行为变更。

注意undefined 类型已被弃用,在某些情况下,如果您尝试插入 undefined,它将被转换为 null

索引过滤器

考虑使用 setQuerySettings,正如本文查询形状部分所讨论的那样,因为索引过滤器在此版本中已被弃用。SetQuerySettings 提供了更多的功能,使其成为首选。随着索引过滤器现在被弃用,建议切换到 setQuerySettings 以利用其高级功能。## 迁移规划与策略

既然您已经了解了最新版本的新功能,并决定升级到最新的 MongoDB 版本,有几件事您需要注意。本主题将描述一些理想的策略和步骤,以确保 MongoDB Atlas 中副本集的迁移顺畅且成功。

请记住,每种情况都有其特殊性,了解您的应用程序如何使用 MongoDB 功能对于有效迁移至关重要。分析哪些功能被大量使用,以及它们可能如何受到升级的影响。

此外,请记住,您可以咨询专家以获得支持,帮助您实现成功的迁移。虽然本教程主要关注 Atlas,但也有关于自管理升级的资源可用。

迁移前评估

升级版本路径

在升级到 8.0 版本之前,所有副本集成员必须运行 7.0 版本。

重要的是要注意,例如,不可能直接从 5.0 系列版本迁移到 8.0,也不能从 6.0 系列版本迁移到 8.0。为此,您必须逐版本连续升级,直到达到 7.0 版本。

查阅发行说明

没有比您所查找版本的发行说明包含更有价值信息的地方了。始终确保关注发布的每一条说明,特别是关于任何破坏性变更、新功能和弃用功能的说明。

检查驱动程序兼容性

在升级任何与 MongoDB 相关的内容之前,检查驱动程序文档中的兼容性表至关重要。为了避免破坏您的应用程序,您应确保 MongoDB 版本与您计划使用的 MongoDB 驱动程序兼容。请看这张图:

[LOADING...]

MongoDB Java 驱动程序兼容性表

我们可以看到,要使用 MongoDB 8.0 的所有功能,您需要使用 5.2 到 5.3 版本的驱动程序。应用程序驱动程序可能需要更新以充分利用较新的服务器功能。在某些情况下,过时的驱动程序可能与较新版本的 MongoDB 完全不兼容。

集群健康检查

开始迁移之前的另一个关键点是检查副本集所有成员的健康状况。确保所有节点运行最佳。 您可以通过访问“Database Cluster”(数据库集群)菜单并单击您的集群来找到此信息:

[LOADING...]

集群健康状态

在此屏幕上,您会注意到每个节点名称旁边都有一个绿点,表明健康状况良好。

预发布集群:您的测试中心

为了确保安全更新并降低风险,使用测试环境至关重要。预发布环境充当一个安全区域,用于测试新版本、功能和更改,而不会影响最终用户。在生产集群处于健康状态的情况下,是时候遵循以下步骤了:

  1. 创建预发布集群

此步骤涉及创建一个专用于测试的集群。遵循标准流程设置新集群,确保其与当前生产版本匹配,以准确模拟生产环境。

[LOADING...]

其他设置 - 创建新集群

  1. 使用生产数据刷新预发布集群

从生产集群恢复最近的备份,以确保预发布环境镜像反映当前的生产状态。您可以通过 Atlas 界面执行此操作,方法是选择备份,选择还原选项,并将目标设为预发布集群。

[LOADING...]

还原备份

  1. 将预发布集群升级到 8.0

将预发布集群更新到 MongoDB 8.0 以测试新版本及其功能。为此,只需单击集群并选择“Edit Configuration”(编辑配置)和“Additional Settings”(其他设置):

[LOADING...]

  1. 测试您的应用程序

运行测试以确保一切按预期工作,包括数据库和应用程序测试。

升级生产集群

在预发布环境中测试后,在升级生产集群之前,确保功能兼容版本 (FCV) 设置正确。

FCV 通过控制集群中启用新 MongoDB 版本的哪些功能,在升级过程中提供额外的安全层。这允许您逐步过渡到最新版本,确保在生产环境中完全启用新功能之前一切正常工作。

[LOADING...]

固定功能兼容版本

虽然这不是强制性的,但配置 FCV 为您提供了灵活性。如有必要,您可以通过调整 FCV 设置恢复到以前的版本。这确保您可以以最小的风险管理迁移过程,并对任何潜在问题拥有更多的控制权。

配置 FCV(如果需要)后,您可以继续升级生产集群。为此,只需按照上一节概述的相同步骤操作,但这次将它们应用于生产集群。

监控

迁移后与之前的所有步骤同样重要。监控操作对于确保过程成功至关重要。

[LOADING...]

MongoDB Atlas 指标

需要检查的一些重要点是:

节点健康:监控节点的健康状况以确保它们正常运行。

操作延迟:密切关注读写操作的延迟,以确保没有性能问题。

查询性能:监控查询的性能以确保它们在升级后高效运行。

索引:检查索引是否正常工作,并在必要时进行优化。

最后但同样重要的是,检查集群中每个节点的指标。它们将为您提供有关系统整体健康状况的有价值见解。您可以在集群的“Metrics”(指标)选项卡中找到它们:

[LOADING...]

集群节点指标

回顾

您的升级计划应根据您组织的具体需求和目标进行定制。确保监控您的 MongoDB 集群的支持生命周期,并随时了解版本发布,以便为无缝高效的升级做好准备。

  1. 了解您的应用程序如何与 MongoDB 功能交互。
  2. 识别对应用程序的任何必要更改。
  3. 提前规划您的升级。
  4. 不要忽视驱动程序的更新。
  5. 在进行升级之前进行彻底的测试。

您的升级有多复杂?

既然我们已经概述了成功升级的关键步骤——包括迁移前评估、预发布集群测试和检查驱动程序兼容性——让我们评估一下您的升级可能有多复杂。升级到 MongoDB 8.0 所需的工作量取决于多种因素,包括您当前的版本、驱动程序兼容性、数据大小和经验水平。

简单的升级

如果您已经在使用 MongoDB 7.0,更新了驱动程序,并且在完全受支持的 Atlas 层上运行,那么迁移通常更快、更直接。在这些情况下,设置预发布集群、验证健康状况和执行升级可以高效完成,通常只需很少或零停机时间。

更复杂的升级

如果您使用的是旧版本(例如 5.0 或 6.0),则需要增量升级(例如 5.0 → 6.0 → 7.0 → 8.0),如前所述。此外,如果您的驱动程序已过时或您有自定义配置,该过程可能需要几个小时,并需要更彻底的测试以防止兼容性问题。

由于升级时间基于这些因素差异很大,使用预发布集群作为参考(在前一节中讨论)可以帮助估算持续时间。 虽然这种方法不会提供确切的时间,但它可以让您对总升级持续时间有一个大致的了解,从而允许您相应地进行计划。

无论复杂性如何,遵循最佳实践——例如测试预发布环境和监控集群健康状况——都能确保平稳可靠的过渡。这种努力是非常值得的,因为升级可以解锁更好的性能、安全改进和新功能。

结论

本文重点介绍了最新版本中的关键更改,包括兼容性注意事项、弃用功能以及平稳迁移的最佳实践。通过了解这些方面,您可以确保无缝过渡到 MongoDB 8.0 并继续受益于其增强的功能。

有关更多信息和帮助,请阅读全文中引用的资源(在下面列出)或在 MongoDB 社区中与我们联系。

本文 MongoDB 8.0 Migration Guide: What You Need to Know Before Upgrading 首次出现在 foojay 上。