在线ddl

【产品名称】在线ddl操作

【产品版本】

【问题描述】请问一下,能大概说一下ob在线ddl的原理么

我大概看了一下相关的代码,也是依据多版本来实现的。现在有几个疑问希望能得到解答

我们支持的在线ddl基本是保证不改变源数据结构和存储数据的属性下进行的,以在线创建索引为例

创建索引的时候,我们如果对表进行不改变数据的情况下进行操作,我的理解是这时候读取旧版本的数据就可以实现。在我们创建完索引之后,更新一下数据版本

现在问题就是,我们在线创建索引的时候,如果对表进行了一些增删改操作,这时候怎么保证这些操作和创建索引没有冲突呢?

请教各位大神能大概的介绍一下相关原理,谢谢!

OceanBase索引构建过程中,需要处理两部分数据,第一部分是索引构建过程中,业务写入主表时,需要同步写入到索引表而产生的增量数据,第二部分是索引构建时,需要补充跟主表相比缺少的数据,我个人理解,题主想问的问题是,如果这两部分数据产生冲突了OceanBase会怎么处理?

OceanBase的存储引擎是基于LSM-TREE架构的,对于主表和索引表,都分别有一个或多个的SSTable和Memtable,其有两个特点

  1. 非Inplace Update存储,增量数据维护在Memtable中
  2. 数据按照版本管理:可以简单理解为SSTable和Memtable按照数据的版本号进行排序,比如,对于一个主表中有SSTable中可能有[1-300)版本号的数据,而Memtable中有(300, 正无穷)版本号内的数据

对于索引构建中产生的增量数据,OceanBase根据LSM-TREE存储引擎的特点,会将索引表的数据写入到索引表的Memtable中,而对于索引构建中需要补全的数据,会基于某个快照版本号,将构建出来的数据,直接写入到索引表的SSTable中。相对于本地更新的存储模型,LSM-TREE存储引擎可以天然地让两个部分的数据不会产生直接的更新冲突,索引构建过程中我们将两个部分产生的数据都保留下来,当然这两部分数据有可能包含相同的行,即题主所述的冲突,但根据LSM-TREE存储引擎的特性,查询的数据总是先以新版本的数据源为准,可以保证索引表中的数据是以后面Memtable中产生的数据为准。

另外,关于OceanBase索引构建的原理,可以参考我之前写的一篇文章,https://zhuanlan.zhihu.com/p/48370599。

1 个赞

感谢您的回复,这块最近也一直在做相关的调研,也有一些了解了

现在还有点疑问在于您说的关于增量数据处理,我们可以取一个快照对数据进行索引创建,但是在创建过程中,我们可能做dml中的delete或者update。这个时候,对创建的索引中的这些信息也会有影响,这个时候,创建的索引和增量索引进行同步的时候,怎么去掉已经删除行的索引,更新已经更新行的索引呢