创建一个不托管任何分片或 proxyShard 的种子节点是否可以

Is it okay to create a Seed Node which does not host any shard or proxyShard

我有一个 3 节点集群

1 S1 - 种子节点 2 S2 - 托管分片 SRD 的节点(在配置中将 S1 作为种子节点) 3 S3 - 托管在 S2 中托管的分片的代理分片的节点(在配置中将 S1 作为种子节点)

这里S1只是创建了actorsystem,什么都不做

当我启动集群(首先是 S1,然后是 S2 和 S3)并且当 S3 尝试向分片 SRD 发送消息时(使用代理分片 actor ref),它会抱怨:

WARN  akka.cluster.sharding.ShardRegion - Trying to register to coordinator at [Some(ActorSelection[Anchor(akka.tcp://ngage-akka-seed-cluster@akka-0.akka-svc.default.svc.cluster.local:2551/),
Path(/system/sharding/CallEntityCoordinator/singleton/coordinator)])], but no acknowledgement. Total [1] buffered messages.

这里 - akka-0.akka-svc.default.svc.cluster.local 是种子节点!!!,为什么它联系种子节点(没有任何分片)而不是 S2?

默认情况下,akka-cluster-sharding 分片和分片代理会自动假设相应的区域存在于集群中的所有节点上。但是,您可以对其应用约束 - 分片区域和代理都允许您指定集群 role,即:

# HOCON config
akka.cluster.roles = [ "sharding" ]
akka.cluster.sharding.role = "sharding"

您也可以手动指定:

// shard region - current cluster node must have that role
ClusterSharding(system).start(
    typeName = "Counter",
    entityProps = Props[Counter],
    settings = ClusterShardingSettings(system).withRole("sharding"),
    extractEntityId = extractEntityId,
    extractShardId = extractShardId)

// shard region proxy - current cluster node doesn't need to have that role
ClusterSharding(system).startProxy(
    typeName = "Counter",
    role = "sharding",
    dataCenter = Some("B"),
    extractEntityId = extractEntityId,
    extractShardId = extractShardId)

如果已配置,集群分片将仅在指定 role 的集群节点上查找分片区域。您可以使用此机制从节点列表中排除种子节点,集群分片将尝试与之联系。