我有一个带
的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?
答案 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
的群集节点上查找分片区域。您可以使用此机制从节点列表中排除种子节点,群集分片将尝试与之联系。