之后在收到每条DDL变更时,把alter table add/drop column等,全部传递给druid,由druid识别ddl语句并在内存里执行具体的add/drop column的行为,维护一份最终的表结构
定时把druid的内存表结构,做一份checkpoint,之后的位点回溯,可以是checkpoint + 增量DDL重放的方式来快速构建任意时间点的表结构
最终方案示意图
C0为初始化的checkpoint,拿到所有满足订阅条件的表结构
D1为binlog日志流中的DDL,它会有时间戳T的标签,用于记录不同D1/D2之间的先后关系
定时产生一个checkpoint cm,并保存对应的checkpoint时间戳
用户如果回溯位点到任意时间点Tx,对应的表结构就是 checkpoint + ddl增量的结合
接口设计:
public interface TableMetaTSDB { /** * 初始化 */ public boolean init(String destination); /** * 获取当前的表结构 */ public TableMeta find(String schema, String table); /** * 添加ddl到时间表结构库中 */ public boolean apply(BinlogPosition position, String schema, String ddl, String extra); /** * 回滚到指定位点的表结构 */ public boolean rollback(BinlogPosition position); /** * 生成快照内容 */ public Map<String/* schema */, String> snapshot(); }