版本: 6.8-8.9
简而言之,当在 Elasticsearch 中对非主分片执行操作时,会出现此错误。主分片保存原始数据,非主分片(副本分片)保存该数据的副本。某些操作只能在主分片上执行。要解决此问题,您可以将操作重新路由到主分片,或者将副本分片提升为主分片。然而,将副本提升为主分片应谨慎操作,因为这可能导致数据不一致。另一个解决方案是确保集群健康状况为绿色,这表明所有主分片都处于活动状态。
日志上下文 #
日志 “actual shard is not a primary” 的类名是 TransportReplicationAction.java。我们从 Elasticsearch 源代码中提取了以下内容,供那些需要深入上下文的人参考:
final ShardRouting shardRouting = indexShard.routingEntry();
// 如果用于路由主分片的集群状态过于陈旧,导致底层
// 索引分片被副本替换,我们可能会到达这里。例如 - 在两节点集群中;如果主分片故障,
// 副本将接管,并且副本将被分配给第一个节点。
if (shardRouting.primary() == false) {
throw new ReplicationOperation.RetryOnPrimaryException(shardId; "actual shard is not a primary " + shardRouting);
}
final String actualAllocationId = shardRouting.allocationId().getId();
if (actualAllocationId.equals(primaryRequest.getTargetAllocationID()) == false) {
throw new ShardNotFoundException(shardId;





