1

需要在部署期间实现零停机时间。场景是我总共有 6 个生产箱,我的代码将在其中部署。第一个代码将部署在 3 个盒子中。此时,我将启动并运行我的旧代码和新代码。我在我的 DB 表中应用了一个加密逻辑,它只能由我的新代码处理。当用户访问我的旧代码库时,我的应用程序将失败。有哪些可能的解决方案。我的应用程序是 java 应用程序,我使用 oracle 10g。

4

2 回答 2

3

解决方案是拥有一系列允许这样做的版本。假设代码在更新之前使用名为 A 的纯文本列。

  • 将另一列 A_ENCRYPTED 添加到数据库中。旧代码仍然使用 A 并忽略 A_ENCRYPTED,所以一切都很好
  • 在三个盒子上发布第一次更新,这些盒子从 A 读取,写入 A,还加密值并将结果写入 A_ENCRYPTED。旧代码和新代码都从 A 读取和写入,所以一切都很好
  • 将此第一个更新发布到其他三个盒子。现在每个人都写信给 A 和 A_ENCRYPTED
  • 执行一个脚本,加密 A 中的所有内容并将结果存储在 A_ENCRYPTED 中。现在 A 和 A_ENCRYPTED 对于所有行都是一致的,并且由于所有框都写入两列而继续保持一致。
  • 现在发布对从 A_ENCRYPTED 读取的三个框的第二次更新,并且仍然写入 A 和 A_ENCRYPTED。其他 3 个框仍然可以正常工作,因为 A 始终与 A_ENCRYPTED 保持一致。
  • 在其他 3 个盒子上做同样的释放。现在所有的盒子都从/向 A_ENCRYPTED 读写。
  • 现在发布对 3 个仅从 A_ENCRYPTED 读写的盒子的第三次更新
  • 在其他 3 个盒子上做同样的释放。现在没有人使用 A 列了。
  • 执行删除列 A 的脚本。
于 2013-05-17T13:56:01.013 回答
0

故障状态是旧代码+新数据,所以过渡阶段需要是新代码+旧数据。您的新代码需要能够区分新旧数据并同时使用两者。然后,一旦所有旧代码都消失了,您就可以转换到新的数据格式。

  1. 旧代码+旧数据
  2. 新代码+旧数据
  3. 新代码+新数据
于 2013-05-18T14:13:57.660 回答