--- title: "实际分片不是主分片 - 如何解决此 Elasticsearch 异常" date: 2026-02-02 lastmod: 2026-02-02 description: "当在 Elasticsearch 中对非主分片执行操作时,会出现此错误。主分片保存原始数据,非主分片(副本分片)保存该数据的副本。某些操作只能在主分片上执行。" tags: ["分片管理", "主分片", "副本分片", "集群健康"] summary: " 版本: 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; " --- > **版本:** 6.8-8.9 简而言之,当在 Elasticsearch 中对非主分片执行操作时,会出现此错误。主分片保存原始数据,非主分片(副本分片)保存该数据的副本。某些操作只能在主分片上执行。要解决此问题,您可以将操作重新路由到主分片,或者将副本分片提升为主分片。然而,将副本提升为主分片应谨慎操作,因为这可能导致数据不一致。另一个解决方案是确保集群健康状况为绿色,这表明所有主分片都处于活动状态。 日志上下文 -------- 日志 "actual shard is not a primary" 的类名是 [TransportReplicationAction.java](https://www.geeksforgeeks.org/java-lang-class-class-java-set-1/)。我们从 Elasticsearch 源代码中提取了以下内容,供那些需要深入上下文的人参考: ```java 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; ```