OnlineDDL
DDL 流程
OceanBase 4.x版本
集群内部处理流程
SQL 指令会先发送到 OBProxy 中处理,然后 OBProxy 经过简单的解析,路由计算,把这条 SQL 发送到集群中的一台 OBserver,我们称为中控 OBServer。中控 OBServer 在收到消息后,经过 SQL 语法语义解析,发现这是一条 alter table 的 DDL 语句,在经过优化器、执行器以及生成物理计划后,通过 RPC 转发给另外一台 RootService(RS) 所在的 OBServer 节点来处理。当 RS 接收到来自中控 OBServer 的 RPC 请求后,从请求包里解析出需要修改的 Schema 表结构信息,并把这些信息更新到对应的内部表,然后再发起一个 DDL Task 任务,最后任务会被相关的 OBServer 节点执行。当任务执行完后,RS 会把任务状态发送回中控 OBServer 节点。特别的,对于执行时间可能比较长的 DDL 操作,RS 会识别出来并在任务创建后,返回任务 ID 给中控 OBServer,然后中控 OBServer 通过轮询任务状态,来决定什么时候结束返回。最后中控 OBServer 会把任务状态回给 OBProxy,OBProxy 再返回给客户端,结束本次 DDL 操作。
DDL任务生成流程
1、RS接收ddl请求,跟中控OBServer进行rpc通信。
2、中控OBServer将信息写入内部表,并定时check内部表状态,用来判断ddl是否完成。
3、RS创建DDL的task任务,将ddl task任务放在任务队列中。
4、DDL Scheduler定期去任务队列获取任务,当拿到ddl task时,开始进行DDL任务执行。
DDL任务处理流程
1、Wait_trans_end--等待表上的事务结束
2、Obtain_snapshot--获取快照点:事务结束后,创建一致性快照
3、Redefinition--补数据:快照结束后补数据,需要数据重整的表,会创建隐藏临时表,进行数据双写。OnlineDDL,不阻塞表上的dml和select。不同的DDL会有不同的补数据逻辑,有的需要进行数据排序后再补。例如创建索引等操做。
4、Copy_table_dependent_object--重建与原表相关的对象以及约束:例如修改列的字段类型,需要重建该列上的索引(RS 会create一个创建索引的ddl task)。
5、Take_effect--新表生效。
OnlineDDL对照表
引用文档:OceanBase Alter Table 原理介绍
引用文档:OceanBase 4.0解读:兼顾高效与透明,我们对DDL的设计与思考