java - 具有自动更新和 MongoDB 副本集的应用程序

标签 java mongodb updates auto-update high-availability

我目前正在为我们的应用程序提供高可用性功能。

我们的应用程序具有自动更新功能(使用 Mongeez),可确保所有数据库/集合/文档的结构都采用适合该应用程序版本的正确格式。

问题是我很难解决复制和版本控制问题。

我将使用以下示例来更好地说明问题。

Example

我需要在不停机的情况下将两台服务器上的应用程序 X 更新为应用程序 X2.0,因此我执行以下操作:

  1. 停止应用程序 XA
  2. 在服务器 A 上安装 2.0 版本
  3. 启动应用程序 X2.0A
  4. 应用程序 X2.0A 自动将 MongoDB 更新为 2.0 格式
  5. 由于我们使用的是 MongoDB 副本集,它会自动传播所有 MongoDB 实例中的更改
  6. 问题!!!... 应用程序 XB 仍在运行 1.0 版,但它使用的是 2.0 版的数据库/集合/文档结构

我该如何解决这个问题?我在之前的“工作流程”中做错了什么?

最佳答案

假设:

  • F1:格式 1.0
  • F2:格式 2.0
  • XA:读写F1
  • XB:新应用,读写F2(文档2.0)

如果F2和F1兼容,你可以让XA和XB一起运行。 看来这个原因不是你描述的:)

如果F2与F1不兼容,还有很多工作要做。

===============简单方法==================

  1. 在您的文档中添加一个version字段(或者使用一个字段来区分F1和F2)
  2. 使您的 XB 与 F1&F2 兼容:如果它读取 F1,则写入 F1,如果读取 F2,则写入 F2
  3. 将所有应用程序升级到XB(XA不受影响,因为此时没有F2)
  4. 让 XB 只写入 F2:如果读取 F1 然后写入 F2,重新部署 XB。
  5. 将所有 F1 文档转换为 F2

=============== 常见但复杂的方法 ==================

让我们先定义一些概念:

  • C1:为F1收集
  • C2:为F2收集
  • XB:带有控制读数开关的应用程序:来自 C1 或 C2。它使用 XA 的逻辑从 C1 读取。

步骤:

  1. 运行XA,在C1中读写F1
  2. 将所有数据从 C1 迁移到 C2(从 F1 升级到 F2)
  3. 分析并执行 oplog 以确保 C1 中的所有新修改都迁移到 C2
  4. XB 从 C1 读取,写入 C1&C2(重要!)
  5. 逐步部署XB,XA不受影响,因为C1可用
  6. 切换所有XB从C2读取
  7. 删除 XB 中 F1 的遗留代码

您需要一些程序(脚本)来执行第 2 步和第 3 步。

如果不关心冷数据,可以跳过step2&step3,让XB运行一段时间迁移热数据。

===============另一种方法==================

  1. 将您的服务器分成几组。例如:G1(XA1, XA2), G2(XA3, XA4)
  2. 使用 nginx/haproxy 来平衡您的请求
  3. 将所有请求发送给G1(XA1, XA2)
  4. 部署XB到G2,结果:G2(XB3, XB4)
  5. 将所有请求发送到 G2(XB3, XB4)
  6. 部署XB到G1,结果:G1(XB1, XB2)
  7. 将所有请求发送到 G1(XB1, XB2)/G2(XB3, XB4)
  8. 将所有 F1 文档转换为 F2

存在风险:

  1. 在步骤3/步骤5中,你的服务器负载可能会重载,所以你需要在非营业时间进行
  2. 如果您在 XB 中有错误,则无法回滚。

关于java - 具有自动更新和 MongoDB 副本集的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497373/

相关文章:

java - 如何在java中获取cpu类型?

javascript - 更改 JSON 文档的键

javascript - 来自 MongoDB 的数据不显示

performance - MongoDB动态排名

java - 在java中使用RMI的简单聊天应用程序出错

基于 Java/Ruby 的 IMAP 代理库

java - java 构造函数不工作

java - BasicDBObject 更新重复的同一文档

java - 仅当记录因数据修改而更新时才更新日期

file-upload - 在环回中使用远程 Hook 从另一个模型访问数据