每个用户伪造指数:有多个别名不好?

Hes*_*oon 1 alias elasticsearch

在Elastic/Elasticsearch网站上的每用户伪造指数文章中,建议对多个(数千?)客户端使用单个索引,并使用过滤器别名来隐藏数据.

我听说有人说这不是一个好习惯,因为别名是群集状态的一部分.

为什么会这样?这是我第一次听到这个.

Zac*_*ach 5

别名本身没有错.别名非常轻量级:当您创建别名时,它会查找索引并在该索引上放置"别名标记".

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

但是,关于群集状态的注释是有效的(sorta).数以百万计的别名(或数百万个字段等)将使群集状态膨胀.只要存在更改,就会将此群集状态发布到所有节点,这是Elasticsearch保证所有节点都可以响应所有查询的方式.

因此,问题是如果您的群集状态变得庞大(数百兆字节等),将其发布到群集的物理行为变得不可忽视.想象一下,每次添加字段或别名时,都会将800mb的文件发布到100个节点.主机上还存在一定的CPU成本,这成为一个问题.

在实践中,有许多技巧可以保持这种可管理性,例如压缩,集群状态之间的差异,批处理等.但从根本上说,如果让状态变得过大,集群状态就会成为一个问题.

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

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