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 地址。
我目前使用的是 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 地址。