语境
- 我正在尝试设计一种稳定、一致的方法来更新生产中的 RavenDB 索引
- 我特别关注索引更新故事(即我知道我的设置并没有完全解决高可用性问题)
- 这是一个假设场景(即目前没有任何东西在生产中)
- 假设硬件/软件/网络配置是灵活的(即添加另一个 RavenDB 实例、更多服务器、持久缓存等)
当前托管方案
- 2x Web 服务器负载平衡在主动-被动配置中,每个运行 1 个 Web 应用程序
- 1x 服务器运行 RavenDB 实例(最新稳定版本)
约束
- 全过程必须保持高可用
- 部署过程将完全自动化
- 部署过程可能会在整个部署过程中的任何时候启动回滚
- 索引重建可能需要长达 1 分钟;这么长时间没有可显示的数据是不可接受的
潜在的解决方案
添加第二个 RavenDB 实例并以主动-主动配置复制 RavenDB
- 活动 Web 服务器与活动 RavenDB 实例对话
- 被动 Web 服务器与被动 RavenDB 实例对话
部署将如下所示:
- 停止复制
- 将新的 Web 应用程序代码部署到被动 Web 服务器
- 启动 Web 应用程序并让它自动更新其 RavenDB 实例中的索引定义
- 测试
- 将负载均衡器切换到被动 Web 服务器,使其处于活动状态
- 监控(x 时间)并在需要时回滚
- 开始复制并让索引定义和数据在另一个 RavenDB 实例中更新
回滚看起来像这样:
- 将负载均衡器切换到被动 Web 服务器,使其处于活动状态
有没有更优化的方法来实现这一点?