it-swarm.cn

如何在不造成停机的情况下更新生产代码库/数据库架构?

在不导致任何停机的情况下更新生产服务器代码库/数据库架构的一些技术是什么?

43
Olivier Lalonde

通常,我处理过的有这种要求的网站都位于负载均衡器后面,或者具有单独的故障转移位置。在此示例中,我假设您只有一个负载平衡器,2个Web服务器(A和B)和2个数据库服务器(M和N-通常通过日志传送链接数据库服务器-至少在SQL Server世界中如此) )。

  1. Web服务器A将与负载均衡器断开连接(因此所有传入流量都流向B)。
  2. 日志传送已停止(DB Server M将首先进行更新)。
  3. 更新Web服务器A。将配置指向DB ServerM。
  4. 测试并验证更新是否有效(通常是人们直接点击IP地址)。
  5. 设置负载平衡器,以使现有会话继续转到B。新会话转到A。
  6. 等待B上的所有会话都过期(可能是半小时或更长时间,通常我们会观察流量并安排1小时的休息时间)。
  7. 更新B和N。
  8. 测试并验证更新是否有效。
  9. 再次设置日志传送并进行测试。
  10. 将负载均衡器设置为正常运行。

在一个非常复杂的Web应用程序中,步骤1-5可能描述了一整夜,并且是一个50页的带有时间和紧急联系电话的Excel电子表格。在这种情况下,将系统的一半更新计划在下午6点至凌晨6点进行,同时使系统可供用户使用。通常在第二天晚上安排处理DR站点的更新-希望第一天一切都好。

如果需要正常运行时间,则首先在质量检查环境中测试补丁,理想情况下,该硬件应与生产环境相同。如果它们没有受到干扰,则可以按常规时间表(通常在周末)进行应用。

20
Tangurena

对于典型的数据库(例如Oracle),可以在仍然并行运行查询的同时更改数据库架构。但是,这需要一些前瞻性的计划。

它们是要应用更改的一些限制:

  • 它应与现有代码一起使用,这意味着该代码应同时处理模式的旧版本和新版本
  • 它不会在数据库上造成如此大的负担,以至于交易会停止(我在看着你CREATE INDEX
  • 它不应该导致数据丢失(您不能删除并重新创建表)

为了使模式向后兼容,通常可以添加或修改列,如果现有代码不再使用它,则只能删除某些内容。

如果您的代码不能透明地处理更改,请在更改数据库之前更改代码。

有关预先计划的简单建议:始终在数据库请求中明确列名(请勿使用SELECT * FROM)。这样,您将不会在旧请求中显示新列。

9
Matthieu M.

并非所有系统都可以,它必须以支持它的方式进行设置。

例如,几年前我帮助升级的主要系统之一应该是24/7可用的。它由多层组成,包括非现场用户界面层和业务层之间的纯通信层。由于通信层的编码方式,可以在不造成实际中断的情况下实现对业务层或数据库架构的任何将来更改。在最坏的情况下,更改生效后,用户将经历10到30秒的暂停。

如果更改纯粹是对业务层的代码更改,则可以将它们排队并“循环”入,仅需几毫秒的延迟。

之所以可以这样做是因为:

  • 通信层可以保存消息。这使我们可以在除UI层之外的任何其他层上实际中断,而无需降低UI。
  • MVDB处理的业务层称为 niData 。这会将所有代码保存在内存中。编译代码后,可以使用命令将新的目标代码强制插入内存,从而替换旧的目标代码。

其他技术涉及将事务复制到现有系统的另一个镜像。通过将更新应用于一个,切换并重放在更新和切换之间完成的所有事务。 YMMV取决于您的系统。

5
Dan McGrath

与嵌入式数据库系统和嵌入式系统的世界不同。嵌入式系统包括各种网络/电信基础设施设备,在这个领域中,它们通常谈论99.999%(五个9s)的正常运行时间。

我们(McObject)是eXtremeDB嵌入式数据库系统产品家族的供应商,其中包括eXtremeDB High Availability。

首先,要了解“嵌入式数据库”是指数据库系统是一个已编译并与您的应用程序代码链接的库;从这种意义上讲,它“嵌入”在您的应用程序中。

使用eXtremeDB High Availability,您的应用程序有一个MASTER实例(可能是一个或多个进程),而您的应用程序有一个或多个REPLICA实例。当副本建立与主数据库的连接时,它通过称为“初始同步”的过程接收主数据库的副本。这可以在主应用程序继续其工作的同时完成。一旦同步,它将通过复制接收主服务器的事务。因此,副本始终具有当前数据,并且在主服务器发生故障时可以接管副本(通过称为故障转移的过程)。

初始同步的一个特征称为“二进制模式演化”。用简单的英语来说,这意味着填充副本数据库的过程将适应副本数据库模式与主数据库模式之间的差异。

在实践中,这意味着您可以构建应用程序的新版本(具有新的/删除的表,新的/删除的/更改的字段,新的/删除的索引),将新版本的应用程序附加到主数据库,然后导致更新的副本将成为新的主副本(即,将故障转移到新副本,使其成为主副本,而旧的主副本将自身关闭)。瞧,您已经将应用程序从版本N迁移到了N + 1,而没有中断系统的可用性。现在,您可以将旧的主数据库和任何其他副本升级到版本N + 1。

1
user22538