在我们的应用程序中,我们有一个Elasticsearch集群,可供所有客户共享。
针对该群集发出的请求类型在计算上非常繁琐,可能需要几分钟才能完成。由于集群中的数据类型,获得的请求的类型以及使用它们的不规则性,我们无法预测何时将发出这些请求或事先进行任何缓存。如果多个客户端同时发出请求,则它们的响应速度将比正常情况下慢。
对于大多数客户而言,这不是问题。他们的数据不足以产生显着的差异(3s-> 10s有时没什么大不了的)。但是对于较大的客户,时间差可能只有几分钟,而且非常明显。
首先,我们想要的是一致性-即使这些操作的平均速度较慢。为此,我们希望为这些特殊客户端提供专用节点,而所有其他客户端都使用共享节点。乍一看,似乎唯一的方法是创建专用集群。
但这会增加任何与elasticsearch交互以首先查找要路由到的集群的应用程序的开销。理想情况下,我们将能够在集群中创建专用节点。这样,应用程序不需要知道集群路由,并且索引配置可以在这些“虚拟集群”之间共享。
每个文档都有一个客户端ID,我们可以使用_routing
在该客户端ID中进行分配。但这有其自身的问题。首先,这不允许我们创建通用的默认集群。其次,这可能意味着专用节点与其他客户端共享客户端数据-目标是通过消除节点资源争用来获得一致的速度。最后,这不允许我们为给定路由分配多个节点。
有没有一种方法可以创建可以显式添加节点的路由规则。例如我想将3个节点添加到路由键582123。
是否可以为与现有路由不匹配的节点创建默认路由规则?如果没有,我们总是可以有一个明确的默认路由。我们仍然需要在路由查找应用程序端进行操作,但是在多集群方案中,它仍然可以降低复杂性。
最佳答案
根据您使用的elasticsearch版本和索引设置,可以使用per-index allocation。基本上,您为节点提供一个属性,然后在索引级别设置中指定该索引(更准确地说,其分片)应在何处结束。正如您将在文档中阅读的那样,您需要确保不违反其他约束,例如
Shards are only relocated if it is possible to do so without breaking another routing constraint, such as never allocating a primary and replica shard on the same node.
这意味着您需要具有不同的索引。
关于elasticsearch - Elasticsearch for Special Client中的专用节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60934815/