1.TIDB ONLINE DDL
TIDB 支持ONLINE DDL,也就是 DDL操作不会锁表,在执行DDL执行期间,增删改查这种DML语句是不会阻塞的。
ONLINE DDL 的模块分为:start job 模块,workders模块,schema load模块。还涉及持久化存储在
TIKV集群中的三个队列数据结构,job queue 用于存储DDL任务,add index queue 用于存储加索引的DDL任务,
history queue 负责存储那些已经执行完毕的DDL操作。
用户发出DDL语句,start job 模块负责接收DDL请求,为DDL操作分配ID,通常把分配了ID 的DDL操作叫做JOB;
START JOB 会将job持久化到TIKV中的 job queue 或者 add index queue队列中。在队列中的Job等待
worker模块取走并执行他们。
整个TIDB数据库同一时刻只允许一个TIDB SERVER 执行DDL操作,即同一时间只能有一个worker模块修改
表的结构或者添加索引。每一个TIDB SERVER中都有一个worker模块
每一个TIDB SERVER 中都有一个worker模块 ,只有当TIDB SERVER 的角色为Owner时才会启用。
如果TIDB 数据库 中有多个TIDB SERVER ,那么这些TIDB server会按照一个固定时间轮流成为
owner角色,这个时间叫做任期。当一个TIDB SERVER 是owner角色并且在任期中,它的worker
模块就可以处理DDL操作。数据库当前的OWNER角色信息被持久化到PD中,worker模块
可以查看自己所在的TIDB SERVER 当前是否为owner角色,当owner的任期到期后,PD会发起选举,
选择新的OWNER;
当worker执行完JOB QUEUE或者 add index queue 中的某个DDL job后,就将其记录在History queue
中,DDL语句就算是执行完毕了。
除了worker模块,还有 schema load模块,用于在当前TIDB SERVER 成为owner角色后加载最新的schema信息,
这样可以保证当前owner角色的TIDB SERVER 拥有最新的SCHEMA信息。
无论是 job queue 和 add index queue,他们的特点都是其里面的JOB只能按照先进先出的原则串行执行。
换句话说同一时刻只能有一条非加索引的DDL语句和加索引的DDL语句执行。并可以并行执行。
为什么会将DDL JOB 存储在TIKV中,主要原因是如果节点在执行DDL操作的过程中发送宕机,在数据库
重启后,依然能够从持久化保存的队列中找到没有执行完毕的DDL JOB,继续执行。
例如索引添加到一半,断电了。重启后可以从add index queue 中找到没有执行完的索引,完成操作。