每个用户伪造索引:有很多别名不好吗?

Faking Index per User: is having many aliases bad?

在Elastic/Elasticsearch网站的Faking Index per User article中,建议对多个(数千个?)客户端使用单个索引,并使用过滤器别名将它们的数据无形地分开。

我听到有人说这不是一个好的做法,因为别名是集群状态的一部分。

为什么会这样?第一次听说这个。

别名 本身 没有任何问题。别名非常轻量级:当您创建别名时,它会查找索引并在该索引上放置一个 "alias tag"。

当您针对别名执行搜索时,如果没有匹配的索引,它将检查标记的别名并使用基础索引。整个过程很轻松。因此,从搜索的角度来看,拥有多个别名确实没有问题。

然而,关于集群状态的说明是有效的(排序)。数百万个别名(或数百万个字段等)会使集群状态膨胀。只要有变化,这个集群状态就会发布到所有节点,这就是 Elasticsearch 保证所有节点都能响应所有查询的方式。

所以问题是,如果您的集群状态变得庞大(数百兆字节等),将其发布到集群的物理行为将变得不可忽略。想象一下,每次添加一个字段或别名时,都会将一个 800mb 的文件发布到 100 个节点。 master 也有一定的 CPU 成本,这成为一个问题。

在实践中,有很多技巧可以保持这种可管理性,例如压缩、集群状态之间的差异、批处理等。但从根本上说,集群状态代表一个单一的瓶颈,如果让状态增长,这可能会成为一个问题太大了。

在现实世界中,很少有集群会遇到这个问题,因为它需要大量的字段/别名/索引/分析器才能将集群状态实际膨胀到如此大的大小。

如果您对此有顾虑,可以关注Pending Tasks API。 Pending Tasks 将显示在主节点上排队等待处理的所有集群级任务。它应该几乎总是空的,因为 master 很少是集群中的瓶颈。但是如果你看到这个队列在增长(并且你的主服务器上的负载很高),你可能有一个集群状态问题。