是否可以创建不承载任何分片或proxyShard的种子节点

时间:2017-12-05 20:05:38

标签: akka akka-cluster

我有一个带

的3节点集群

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

这里S1只是创建了actor系统,而没有其他任何东西

当我启动集群(首先是S1,然后是S2和S3)并且当S3尝试向分片SRD发送消息时(使用proxyshard 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?

1 个答案:

答案 0 :(得分:3)

默认情况下,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的群集节点上查找分片区域。您可以使用此机制从节点列表中排除种子节点,群集分片将尝试与之联系。