1. 所有client都是无状态,不依赖于三方进程进行调度,相对比较简单。
2. 可扩展的调度逻辑,demo中实现的是基于db来做任务调度的方案;但是可以实现基于其他存储或者三方调度进程的调度方案。
3. db调度逻辑健壮性
3.1 两段式提交保证数据一致性
因为调度的数据更新和tidb的sql执行是两个系统,所以为了保证数据一致性。在内存中保存了一份sql执行结果,
当发生网络错误或者其他非语法错误的db问题,再次进入时,会检查内存中的状态,如果为已执行则直接提交任务。
3.2 全排列算法通过chan来输出结果避免内存占用过高
3.3 通过分布式锁(利用多进程抢夺mysql行锁)来递进式生成任务序列来避免单个事务过大(可能有很多影响: 比如 undo log
过大,导致小表查询变慢等问题)
对于检查执行结果的另外一个方案.
如果demo中,可以指定sql语句为非查询语句,则可以使用消费tidb binlog的方案进行校验。
Usage of ./tidb-muddled-client:
-b string
同一批次客户端的批次id
-c string
配置文件文件路径
-id string
节点id
-p string
伙伴id,exp: 1,2,3
因为两个client之间是完全无状态的,所以在没有三方协调进程的辅助下,需要通过数据做同步。 批次id就承担了这个作用,同时需要指定伙伴client的标识。
示例:
./tidb-muddled-client -c ./config/config.toml -id 1 -p 2 -b 9982
./tidb-muddled-client -c ./config/config2.toml -id 2 -p 1 -b 9982
├── README.md
├── algorithm 工程算法实现
│ ├── permutation.go
│ └── permutation_test.go
├── common 公共库
│ ├── errors.go
│ ├── permutation.go
│ └── permutation_test.go
├── config 配置目录
│ ├── config.toml
│ ├── config2.toml
│ ├── sql.file
│ └── sql2.file
├── coordinate 任务协调器
│ ├── coordinate.go
│ └── db_coordinate.go 基于db的任务协调器
├── doc 文档
│ └── sql.md
├── global.go
├── go.mod
├── go.sum
├── init.go
├── loader 输入加载模块
│ ├── file_loader.go
│ └── loader.go
├── main.go
├── sql_cmd.go client的sql处理逻辑
├── sql_load.go client的sql加载逻辑
在没有任务调度的前提下,通过数据做状态同步和任务调度,是实现的主要思路。
在编码中,主要是把client输入,以及任务调度这两个地方,做了抽象:
- sql加载可以通过不同的源进行扩展
- 任务的调度是基于存储系统做的,在这个思路下,抽象了任务调度的基础接口
本例中实现的任务调度是基于db存储来做的 在基于存储做任务调度的思路下,可以实现其他的调度器,比如基于redis或者基于消息队列,单机可以考虑共享内存的方案
+----------------------------+
| |
+-----+ Coordinater base on db |
| | |
| +----------------------------+
+-----------------+ | +----------------------------+
| | | | |
| Coordinater +--------------+ Coordinater base on redis |
| | | | |
+----+-----+------+ | +----------------------------+
^ | |
| | | +----------------------------+
| | | | |
regist task | | check result +-----+ Coordinate base one queue |
| | | |
| v +----------------------------+
+-----------------+ +----+-----+------+
| | input | |
| Sql Loader +------------>+ Client |
| | | |
+-------+---------+ +-----------------+
|
+--------------------------------+
| | |
| | |
+-----+------+ +----+-----+ +-------+------+
| | | | | |
| FileLoader | | DbLoader | | OtherStorage |
| | | | | |
+------------+ +----------+ +--------------+