Skip to content

NamingServer support design

funkye edited this page Jan 7, 2024 · 1 revision

namingserver领域模型

tc集群无状态部署

tc集群的raft集群部署

1.在上述模型中,在namspace做环境隔离,在cluster层处理事务分组(流量切分),在unit层面做负载均衡

2.一个事务分组会被映射到一个cluster中,然后在该cluster下的unit列表中通过负载均衡策略选取一个unit,根据其元数据中指向的tc节点执行事务

3.定位一个事务分组需要(namspace,cluster)二元组

Seata事务流程与namingserver的联系

Rocketmq领域模型对比

层级对比
seata概念 | rocketmq概念 -- | -- vgroup | topic cluster(多集群) | cluster(单集群) unit(负载均衡) | queue(负载均衡) tc节点 | broker节点

控制台交互链路

tc集群无状态

tc集群raft部署

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
		}	
	]
}]

控制台切换group->cluster流量

要保证这个切换是从begin开始,而不是registry这种中间态切换

tc集群无状态部署

tc集群raft部署

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
		}	
	]
}]
Clone this wiki locally