实现零停机时间部署也涉及到同一问题,但我需要一些有关正在考虑的策略的建议。
语境
一个基于Web的应用程序,其中Apache / PHP用于服务器端处理,而MySQL DB /文件系统用于持久性。
我们目前正在建设基础设施。所有网络硬件都将具有冗余,并且所有主网络电缆都将在绑定对中使用以实现容错。服务器被配置为具有硬件容错能力的高可用性对,并且将为虚拟机容错能力和总体性能进行负载平衡。
我的目的是我们能够在不停机的情况下将更新应用到应用程序。在设计基础架构以确保可以提供100%的正常运行时间时,我付出了极大的努力。每次应用更新会有10-15分钟的停机时间,这将是非常令人失望的。这一点特别重要,因为我们打算有一个非常快速的发布周期(有时每天可能达到一个或多个发布)。
网络拓扑结构
这是网络的摘要:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
注意:DB服务器使用主-主复制
建议策略
为此,我目前正在考虑将数据库架构升级脚本分为两部分。升级如下所示:
- 节点A上的Web服务器脱机;流量继续由节点B上的Web服务器处理。
- 过渡模式更改将应用于数据库服务器
- Web服务器更新了代码库,清除了缓存,并采取了其他任何升级操作。
- Web服务器A联机,而Web服务器B脱机。
- Web服务器B代码库已更新,缓存已清除,并且已执行任何其他升级操作。
- Web服务器B联机。
- 最终模式更改将应用于数据库
“过渡模式”将被设计为建立跨版本兼容的数据库。这将主要利用模拟旧版本模式的表视图,而表本身将更改为新模式。这使旧版本可以正常与数据库交互。表名将包含架构版本号,以确保不会对要写入哪个表造成任何混淆。
“最终模式”将删除向后兼容性并整理模式。
题
简而言之,这行得通吗?
进一步来说:
是否会由于在过渡模式更改的特定点并发写入而引起问题?有没有一种方法可以确保连续执行修改表和创建向后兼容视图的查询组?也就是说,将任何其他查询保留在缓冲区中,直到完成模式更改为止,通常只有几毫秒。
有没有更简单的方法可以提供这种程度的稳定性,同时又可以在不停机的情况下进行更新?还最好避免使用“进化”方案策略,因为我不希望陷入向后方案兼容性的局限。