在Elastic / Elasticsearch网站的Faking Index per User article中,建议对多个(数千?)客户端使用单个索引,并使用过滤器别名以无形方式分离其数据。
我听说有人说这不是一个好习惯,因为别名是群集状态的一部分。
为什么会这样?这是我第一次听到这个。
答案 0 :(得分:5)
别名本身没有错。别名非常轻量级:当您创建别名时,它会查找索引并在该索引上放置“别名标记”。
当您对别名执行搜索时,如果没有匹配的索引,它将检查标记的别名并使用基础索引。整个过程非常轻松。因此,从搜索角度来看,确实没有问题需要很多别名。
但是,关于群集状态的注释是有效的(sorta)。数以百万计的别名(或数百万个字段等)将使群集状态膨胀。只要有变化,就会将此群集状态发布到所有节点,这就是Elasticsearch保证所有节点都能响应所有查询的方式。
所以问题是如果您的群集状态变得庞大(数百兆字节等),将其发布到群集的物理行为变得不可忽视。想象一下,每次添加字段或别名时,都会将800mb的文件发布到100个节点。主机上还有一定的CPU成本,这就成了一个问题。
在实践中有很多技巧可以保持这种可管理性,比如压缩,集群状态之间的差异,批处理等等。但从根本上说,如果让状态变得过大,集群状态就会成为一个问题
在现实世界中,很少有集群能够解决这个问题,因为它需要非常多的字段/别名/索引/分析器来实际将群集状态膨胀到如此大的大小。
如果您对此感到担心,可以留意Pending Tasks API。待处理任务将显示排队等待在主节点上处理的所有集群级任务。它应该几乎总是空的,因为主服务器很少是集群中的瓶颈。但是,如果您看到此队列在增长(以及主服务器上的高负载),则可能会出现群集状态问题。