Skip to content

ctl survey

jimin edited this page Dec 21, 2023 · 1 revision

项目背景

运维 ctl 命令在 Seata 中非常重要,它是 Seata 的命令行工具,可以帮助我们管理和操作 Seata 的各种组件。运维 ctl 命令可以让我们快速地启动、停止和管理 Seata 服务,定位和解决问题。此外,运维 ctl 命令还提供了丰富的指令,可以让我们方便地检查 Seata 的健康状态、模拟事务和打印导出配置信息等,大大提高了我们的工作效率和运维体验。

本项目拟研发针对 Seata 集群的 ctl 工具 seatactl,提供对 Seata server 集群的部署状态、动态配置、事务模拟等功能。

项目目标

  1. 命令行支持集群节点健康检查状态返回。
  2. 命令行支持事务的模拟,包括但不限于事务 begin、commit 和 rollback。
  3. 命令行支持配置项的打印和动态修改,包括配置中心、注册中心配置、存储和事务控制配置。
  4. 命令行支持 Raft 存储模式运行中动态加入和摘除节点。

项目方案

整体架构

  1. seata-server 提供对应的 admin 接口,用于针对 seata 的行为及状态管理(get set 等)
  2. seatactl 支持 Seata 目前兼容的所有服务注册中心(Nacos等),获取完整的集群列表
  3. seatactl 支持对 Seata 单节点/集群 进行 admin 管理

命令工具概况

$ seatactl [action] [type] [flags]

actions:
  get
  set
  delete
  reload

type:
  node
  registry
  config
  storage
  txn

flags:
  -e, --endpoint=<url>      Single node with server URL
  -r, --registry=<name>     Cluster registry config name
  -a, --application=<app>   Cluster app name 
  -d, --data=<data>         Data

根据 Seata 部署方式的不同,存在如下两种情况:

  1. 单机部署的 Seata 节点可以直接使用 -e 配置 sever URL
  2. 集群部署的 Seata 集群可以先将注册中心配置信息保存在本地,然后运行时由 -r 和 -a 指定
[registry-1]
type=eureka
service-url=http://localhost:8761/eureka

[registry-2]
type=nacos
server-addr=127.0.0.1:8848
group="SEATA_GROUP"
namespace=""
username="nacos"
password="nacos"

...

例如在名为registry-1的 Eureka 部署名为cluster-1 的 Seata 集群,参数列表为:

$ seatactl [action] [type] -r registry-1 -a cluster-1 ...

服务状态检查

# 单机
$ seatactl get node -e <url>
# 集群
$ seatactl get node -r <registry> -a <app>

ID      IP              PORT      AGE        STATUS
1       10.100.0.1      8080      24d        UP
2       10.100.78.115   8080      22d        DOWN
...

除展示 Server 相关硬件信息外,还包含 UP / DOWN 两种节点状态。

注册中心配置

seatactl 可在集群模式下通过命令修改所有节点的服务注册中心配置。

  1. 获取注册中心公共配置:
$ seatactl get registry -d 'key' -r <registry> -a <app>
  1. 修改注册中心公共配置:
$ seatactl set registry -d 'key=value' -r <registry> -a <app>
  1. 删除注册中心公共配置:
$ seatactl delete registry -d 'key' -r <registry> -a <app>

配置中心配置

seatactl 可直接通过命令修改配置项。

  1. 获取指定配置
# 单机
$ seatactl get config -d 'key' -e <url>
# 集群
$ seatactl get config -d 'key' -r <registry> -a <app>
  1. 修改指定配置
# 单机
$ seatactl set config -d 'key=value' -e <url>
# 集群
$ seatactl set config -d 'key=value' -r <registry> -a <app>
  1. 删除指定配置
# 单机
$ seatactl delete config -d 'key' -e <url>
# 集群
$ seatactl delete config -d 'key' -r <registry> -a <app>
  1. 如果用户手动更新了配置文件/配置中心,触发 reload 重新读取
# 单机
$ seatactl reload config -e <url>
# 集群
$ seatactl reload config -r <registry> -a <app>

存储配置

seatactl 可对存储配置(file, redis, raft)进行管理。

  1. 获取当前存储配置状态
# 单机
$ seatactl get storage -e <url>
# 集群
$ seatactl get storage -r <registry> -a <app>

结果:

ID      IP              TYPE        STATUS
1       10.100.0.1      raft        UP
2       10.100.78.115   raft        DOWN
  1. 加入/修改存储节点
# 单机
$ seatactl set storage -d <config> -e <url>
# 集群
$ seatactl set storage -d <config> -r <registry> -a <app>
  1. 删除存储节点
# 单机
$ seatactl delete storage -d <config> -e <url>
# 集群
$ seatactl delete storage -d <config> -r <registry> -a <app>

事务模拟

事务关系可以梳理为一个有向无环图 DAG,可以保存至事务模拟文件。例如如下 DAG 可以定义为:

# 定义事务模型
AT/TCC/Saga/XA

# 定义事务关联服务,以及执行该服务(分支事务)时的状态,成功 succ 或错误 err 或 超时 Timeout
svc1: succ
svc2: succ
svc3: succ
svc4: err

# 定义分支事务之间的调用关系
start -> svc1
svc1 -> svc2
svc1 -> svc3
svc3 -> svc4

事务模拟方法为:

# 单机
$ seatactl get txn -d <dag-file> -e <url>
# 集群
$ seatactl get txn -d <dag-file> -r <registry> -a <app>

模拟结果:

Use transaction model: AT
Start
First Stage(一阶段):
svc1 submit
svc2 submit
svc3 submit
svc4 submit

Second Stage(二阶段):
svc1 commit
svc2 commit
svc3 commit
svc4 failed!
svc1 rollback
svc2 rollback
svc3 rollback
svc4 rollback
end

技术实现

开发计划

7月1日——7月15日 创建并初始化 seatactl 工具、 admin 接口
7月16日——7月29日 服务状态检查
7月30日——8月12日 注册中心配置
8月13日——8月26日 配置中心配置
8月27日——9月9日 存储配置
9月10日——9月23日 事务模拟
9月24日——10月1日 项目结项相关
Clone this wiki locally