如何在具有高可用性的Blue-Green部署方案中执行RavenDB索引更改?

时间:2013-06-07 15:50:05

标签: deployment ravendb continuous-deployment blue-green-deployment

上下文

  • 我正在尝试设计一种稳定,一致的方法来更新生产中的RavenDB索引
  • 我专注于索引更新故事(即我知道我的设置并未完全解决高可用性问题)
  • 这是一个假设情景(即目前没有任何东西在制作中)
  • 假设硬件/软件/网络配置是灵活的(即添加另一个RavenDB实例,更多服务器,持久缓存等)。

当前托管方案

  • 2x Web服务器在主动 - 被动配置中负载均衡,每个运行1个Web应用程序
  • 运行RavenDB实例的1x服务器(最新的稳定版本)

约束

  • 必须在整个过程中保持高可用性
  • 部署过程将完全自动化
  • 部署过程可能会在整个部署过程中的任何时刻启动回滚
  • 索引重建可能需要1分钟;没有数据可以显示这么久是不可接受的

潜在解决方案

添加第二个RavenDB实例并在主动 - 主动配置中复制RavenDB

  • 活动Web服务器与活动RavenDB实例进行对话
  • 被动Web服务器与被动RavenDB实例进行对话

部署看起来像这样:

  • 停止复制
  • 将新的Web应用程序代码部署到被动Web服务器
  • 启动Web应用程序并让它在其RavenDB实例中自动更新索引定义
  • 测试
  • 将负载均衡器切换到被动Web服务器,使其处于活动状态
  • 监视(持续x时间)并在需要时回滚
  • 开始复制,让其他RavenDB实例中的索引定义和数据更新

回滚看起来像这样:

  • 将负载均衡器切换到被动Web服务器,使其处于活动状态

有更优化的方法来实现这个吗?

1 个答案:

答案 0 :(得分:0)

我们通过将索引名称存储在配置变量中来实现类似的功能。然后我们使用新名称创建一个带有更新定义的新索引。完成后,我们将配置变量切换为指向新的索引名称。

根据您的流程,您可以在单独的版本中对索引名称进行硬编码,进行此设置并切换部分启动代码,或者任何最适合您的选项。

只要索引定义输出没有根本不同,此过程就可以正常工作。如果是,您可能需要更多控件,Web服务器使用哪个定义。