-
Notifications
You must be signed in to change notification settings - Fork 8.8k
NamingServer support design
1.在上述模型中,在namspace做环境隔离,在cluster层处理事务分组(流量切分),在unit层面做负载均衡
2.一个事务分组会被映射到一个cluster中,然后在该cluster下的unit列表中通过负载均衡策略选取一个unit,根据其元数据中指向的tc节点执行事务
3.定位一个事务分组需要(namspace,cluster)二元组
seata概念 | rocketmq概念 -- | -- vgroup | topic cluster(多集群) | cluster(单集群) unit(负载均衡) | queue(负载均衡) tc节点 | broker节点
1.通过控制台在某个cluster下创建一个事务分组vgroup
2.通过namingserver,对应的cluster将事务分组持久化到存储中,raft写文件file,无状态写到外置统一存储器如db
3.tc节点在心跳的时候将vgroup->cluster的映射关系更新到namingserver
3.client通过自己配置的事务分组vgroup从namingserver获取对应cluster元数据,元数据包含如下图的json伪代码
4.client在事务流程中,使用cluster下的unit进行负载均衡,再进行begin,registry,commit,rollback等
5.事务决议后,对应的unit下的leader节点下发二阶段,无状态节点下,每个unit的唯一node就是leader
[{
clusterName:cluster1
clusterType:raft
[
{
nodeAddr:10.2.15.44:100
weight:1
}
{
nodeAddr:10.2.15.44:101
weight:1
}
{
nodeAddr:10.2.15.44:102
weight:1
}
]
}]
要保证这个切换是从begin开始,而不是registry这种中间态切换
1.在控制台修改事务分组对应的cluster集群
2.将修改后的vgroup->cluster映射关系持久化保存到新旧两个cluster集群中,新的cluster创建该事务分组vgroup,老的cluster删除原事务分组vgroup(tc无状态时使用db存储,raft时使用file存储)
3.两个cluster都将更新后的信息推送到namingserver
4.client通过自己的事务分组从namingserver刷新到新的cluster元数据,用新的clutser下的unit负载均衡
5.决议下发
在切换流量的时候,由于新cluster和旧cluster无法同时达成一致性,因此在切换流量的动作开始-->达成最终一致(新cluster包含vgroup,老cluster没有vgroup)的过程中,可能会短暂出现一个vgroup对应多个cluster的情况(如下图,一个vgroup拉到了两个cluster的信息)
[{
clusterName:cluster1
clusterType:raft
[
{
nodeAddr:10.2.15.44:100
weight:1
}
{
nodeAddr:10.2.15.44:101
weight:1
}
]
},
{
clusterName:cluster2
clusterType:raft
[
{
nodeAddr:10.2.15.44:102
weight:1
}
{
nodeAddr:10.2.15.44:103
weight:1
}
{
nodeAddr:10.2.15.44:104
weight:1
}
]
}]