和其他很多分布式分数据相比,OceanBase 数据库的一个巨大优势是提供全局一致的 Schema 视图,所有节点都能及时看到 Schema 的变更。在 OceanBase 数据库里,所有 DDL 都会被转发给 RS(Root Service)来统一调度执行。在执行 DDL 的过程中,RS 执行内部表的更新后,会将本机缓存中的模式信息刷新到最新状态。然后 RS 将最新的模式版本号通知所有在线的 OBServer,在每个 OBServer 都反馈收到通知后,此 DDL 正常返回。
RS 和每个 OBServer 始终保持心跳,除了正常通知外,心跳包也会将最新版本号发给每个 OBServer。当 OBServer 收到 DDL 变更后的版本号后,会构造一个刷新 schema 的任务以刷新此 OBServer 的 schema。
对于 OceanBase 数据库中同一个客户端会话,每一次 DDL 操作引起的模式变化,后面的操作都可见。因为后续的操作和执行 DDL 操作可能不是发生在一个节点上,所以需要检测后续执行的 OBServer 上 schema 是否是刷到预期版本。如果没有,则直到刷到对应版本的 schema 后才可以继续执行。
对于并发的多个会话的操作,在一个会话中修改了表模式, 另外一个会话也有可能看不到最新的变更。对于分布式执行计划,如果执行的 OBServer 并没有刷到指定版本的 schema,同样需要阻塞地刷到对应的版本。