1

语境

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

当前托管方案

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

约束

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

潜在的解决方案

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

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

部署将如下所示:

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

回滚看起来像这样:

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

有没有更优化的方法来实现这一点?

4

1 回答 1

0

我们通过将索引名称存储在配置变量中来完成类似的操作。然后我们以新名称创建一个新索引,其中包含更新后的定义。完成后,我们切换配置变量以指向新的索引名称。

根据您的流程,您可以在单独的构建中对索引名称进行硬编码,进行此设置并切换您的启动代码的一部分,或者为最适合您的任何方式选择任意数量的替代方案。

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

于 2014-08-03T06:00:59.933 回答