根据这篇博文:https ://www.elastic.co/blog/changeing-mapping-with-zero-downtime/ ,我正在使用推荐的最佳实践来更新生产中的索引,使用别名实现零停机时间。尽管如此,当更新运行时,我们会定期在我们的应用程序中看到“索引丢失”异常。我似乎无法诊断这种行为,我不确定问题可能是什么。
当前流程
- 确定默认别名所针对的索引(最多有 1 个)
- 通过附加/递增计数器来对当前索引名称进行排序:index-name-v1
- 创建新索引并填充数据
- 一次操作更新别名:删除旧索引并添加新索引
- 从现在的当前索引中删除 -2 版本的索引——这样做是为了确保在别名更新之前返回数据的索引不会被删除
尽管如此,我们在查询数据时还是会遇到随机和常规的索引缺失错误。别名永远不会被删除,只会自动更新。这种方法有什么我没有考虑的缺陷吗?
public virtual void SwapAlias(string aliasName, string oldIndexName, string newIndexName)
{
Client.Alias(a =>
{
a.Add(add => add.Alias(aliasName).Index(newIndexName));
if (oldIndexName != null && oldIndexName != newIndexName)
a.Remove(remove => remove.Alias(aliasName).Index(oldIndexName));
return a;
});
}