Solr Cloud:跨节点分布分片

Solr Cloud: Distribution of Shards across nodes

我目前使用的是 Solr Cloud 6.1,在 7.0 之前也可以观察到以下行为。

我正在尝试创建一个包含 5 个分片且复制因子为 2 的 Solr 集合。我有 5 台物理服务器。通常,这会将所有 10 个副本平均分配给可用服务器。

但是,当使用 -h(主机名)参数启动 Solr Cloud 以给每个 Solr 实例一个单独但不变的主机名时,这不再有效。然后分布如下所示:

solr-0:
wikipedia_shard1_replica1  wikipedia_shard2_replica1  wikipedia_shard3_replica2  wikipedia_shard4_replica1  wikipedia_shard4_replica2

solr-1:

solr-2:
wikipedia_shard3_replica1  wikipedia_shard5_replica1  wikipedia_shard5_replica2

solr-3:
wikipedia_shard1_replica2

solr-4:
wikipedia_shard2_replica2

我尝试使用 Rule-based Replica Placement,但规则似乎被忽略了。

我需要使用主机名,因为 Solr 在 Kubernetes 集群中运行,其中 IP 地址经常更改,并且在容器重启后 Solr 将找不到它的核心。我首先怀疑较新的 Solr 版本是导致此问题的原因,但我将其缩小到主机名问题。

有解决办法吗?

解决方案实际上非常简单(但没有真正记录):

在 OpenShift/Kubernetes 中创建 Service 时,所有匹配的 Pods 都会得到负载平衡器的支持。当所有 Solr 实例都分配了一个唯一的主机名时,该主机名将全部解析为一个 IP 地址(负载均衡器的 IP 地址)。

Solr 无法处理该问题,无法均匀分布其分片。

解决方案是使用来自 Kubernetes 的 headless services。 Headless 服务不受负载平衡器支持,因此每个主机名都解析为唯一的 IP 地址。