openGauss支持在线reindex开发合作项目实践分享
收藏回复举报
openGauss支持在线reindex开发合作项目实践分享
发表于2022-10-25 22:26:12
0 查看

很荣幸能够在研究生阶段参与到华为鲲鹏众智项目,并为openGauss数据库贡献自己的一份力量。我们团队做的项目是《openGauss支持在线reindex开发合作项目》,具体内容是在openGauss数据库内核中增加在线reindex功能(即reindex concurrently语句),执行在线reindex语句时并不会影响其他业务的执行(增删改查)。

对我个人来言,参与这个项目是一项全新的挑战。因为这是我第一次参与DBMS系统软件的内核开发,之前只是通过书本、博客、公众号去了解openGauss数据库内核代码;同时,这也是我第一次参与这么大型的项目开发,在此之前自己只是基于数据库做一些小型的、简单的Web应用。因此,当得知自己能参与这个项目时,内心感到即高兴又不安,高兴是因为可以通过该项目了解数据库内核框架,磨炼自己的代码技巧,不安是因为担心自己hold不住这个项目,从而拖了团队后腿。

通过参与该项目,我对openGauss数据库内核架构、openGauss表级锁机制、索引的组织和实现等有了更进一步的理解,提高了编程能力,了解到如何参与开源软件开发,收获颇深。在此,感谢鲲鹏社区能提供这样的机会,使我们能够参与到大型项目开发;感谢导师和华为各位专家的指导,帮助我更好地理解openGauss内核代码,从而少走了许多弯路。希望未来可以继续参与openGauss数据库开发,为国产数据库贡献自己的一份力量。

此外,借此机会,给大家介绍一下在线reindex具体实现流程:

普通reindex语句,其实现方式是根据索引所在表,重新建立索引,因此执行该语句时,不允许其他业务对数据表的修改,避免出现索引与数据表不一致的情况。

在线reindex实现方式与之不同,其并非对原有索引进行重建,而是采取新建索引替换待重建索引的方式完成索引重建,实现步骤如下:

  1. create和build阶段:该阶段将根据待重建索引的元数据信息,新建一个索引元数据信息,随后根据数据表内的数据建立新索引。在这个阶段,新索引无法被使用,用户仍是通过旧索引查询数据;
  2. validate阶段:该阶段将build阶段插入表但未插入新索引的元组加入新索引中(build阶段未加入是因为当时在建立新索引,无法插入元组),同时该阶段允许向新索引写入数据但不允许读取新索引(因为新索引与数据表不一致)。该阶段结束后,新索引与数据表保持一致;
  3. swap阶段:该阶段将交换新旧索引的元数据信息。该阶段结束后,可以通过新索引读取数据,但不可以通过旧索引读取数据,相当于用新索引替换旧索引;
  4. drop阶段:该阶段将删除旧索引,完成在线reindex。

采取这种方式,在线reindex的每一个阶段中都会存在一个可以使用的索引,可以通过该索引查询数据表上的数据,从而实现不影响其他业务执行(增删改查)这一需求。

最后,简单介绍一下参与openGauss开发的流程,想参与的小伙伴可以上openGauss代码仓库查看issue列表,根据自己的兴趣和能力选择一个issue,尝试将其解决,并将解决代码作为PR提交到openGauss代码仓库,由社区负责人员对代码进行检视,检视通过后解决代码便合入openGauss的代码中。当收到代码合入通知后,一想到自己实现的功能将通过openGauss被更多的开发者使用,心里别提有多高兴啦。

西安电子科技大学-计算机科学与技术学院-可信软件系统研究团队-常家俊

指导老师:王小兵老师

本帖最后由 匿名用户2023/11/17 15:13:49 编辑

我要发帖子