在代码部署期间实现零停机时间

时间:2013-05-17 12:50:59

标签: java oracle oracle10g

部署期间需要实现零停机时间。场景是我有6个生产盒,我的代码将被部署。第一个代码将部署在3个框中。在这个时间点,我将启动并运行旧的和新的代码。我在我的DB表中应用加密逻辑,只能通过我的新代码处理。当用户点击我的旧代码库时,我的应用程序将失败。有哪些可能的解决方案。我的应用程序是java应用程序,我的用户是oracle 10g。

2 个答案:

答案 0 :(得分: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个更新到3个盒子,只能从/向A_ENCRYPTED读取和写入
  • 在另外3个方框上执行相同的发布。现在没有人再使用A列了。
  • 执行删除A列的脚本。

答案 1 :(得分:0)

故障状态是旧代码+新数据,因此转换阶段需要是新代码+旧数据。您的新代码需要能够分辨旧数据和新数据之间的区别并同时使用它们。然后,一旦所有旧代码消失,您就可以转换为新的数据格式。

  1. 旧代码+旧数据
  2. 新代码+旧数据
  3. 新代码+新数据