在OceanBase数据库中,不太理解oceanbase的合并原理,不是说达到内存阀值就会合并吗?但major合并又是和时间有关系。
这个只是一次把memtable 写入到ssttable的level 0 层,后续可能还要把ssttable level 0 -> level 1 , level 2 -此回答整理自钉群“[社区]技术答疑群OceanBase”
你说的应该是两个概念,“不是说达到内存阀值就会合并吗”这个应该是转储,是 MemTable的物化过程,但是也只是物化成增量数据,“但major合并又是和时间有关系”这就是把物化后的增量数据与基线数据合并,一天一次,因为这个操作比较重
参考资料
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000034097
回答不易请采纳
合并方式
合并有很多种不同的方式,具体的描述如下。
全量合并
全量合并是 OceanBase 数据库最初的合并算法,和 HBase 与 RocksDB 的 major compaction 过程是类似的。在全量合并过程中,会把当前的静态数据都读取出来,和内存中的动态数据合并后,再写到磁盘上去作为新的静态数据。在这个过程中,会把所有数据都重写一遍。全量合并会极大的耗费磁盘 IO 和空间,除了 DBA 强制指定外,目前 OceanBase 数据库一般不会主动做全量合并。
增量合并
在 OceanBase 数据库的存储引擎中,宏块是 OceanBase 数据库基本的 IO 写入单位,在很多情况下,并不是所有的宏块都会被修改,当一个宏块没有增量修改时,合并可以直接重用这个数据宏块, OceanBase 数据库中将这种合并方式称之为增量合并。增量合并极大地减少了合并的工作量,是OceanBase 数据库目前默认的合并算法。更进一步地,OceanBase 数据库会在宏块内部将数据拆分为更小的微块,很多情况下,也并不是所有的微块都会被修改,可以重用微块而不是重写微块。微块级增量合并进一步减少了合并的时间。
渐进合并
为了支持业务的快速发展,用户不可避免地要做加列、减列、建索引等诸多 DDL 变更。这些 DDL 变更对于数据库来说通常是很昂贵的操作。MySQL 在很长一段时间内都不能支持在线的 DDL 变更(直到 5.6 版本才开始对 Online DDL 有比较好的支持),而即使到今天,对于 DBA 来说,在 MySQL 5.7 中做 Online DDL 仍然是一件比较有风险的操作,因为一个大的 DDL 变更就会导致 MySQL 主备间的 replication lag。
OceanBase 数据库在设计之初就考虑到了 Online DDL 的需求,目前在 OceanBase 数据库中加列、减列、建索引等 DDL 操作都是不阻塞读写的,也不会影响到多副本间的 paxos 同步。加减列的 DDL 变更是实时生效的,将对存储数据的变更延后到每日合并的时候来做。然而对于某些 DDL 操作如加减列等,是需要将所有数据重写一遍的,如果在一次每日合并过程中完成对所有数据的重写,那么对存储空间和合并时间都会是一个比较大的考验。为了解决这个问题,OceanBase 数据库引入了渐进合并,将 DDL 变更造成的数据重写分散到多次每日合并中去做,假设渐进轮次设置为 60,那么一次合并就只会重写 60 分之一的数据,在 60 轮合并过后,数据就被整体重写了一遍。渐进合并减轻了 DBA 做 DDL 操作的负担,同时也使得 DDL 变更更加平滑。
并行合并
在 OceanBase 数据库 V1.0 中增加了对分区表的支持。对于不同的数据分区,合并是会并行来做的。但是由于数据倾斜,某些分区的数据量可能非常大。尽管增量合并极大减少了合并的数据量,对于一些更新频繁的业务,合并的数据量仍然非常大,为此 OceanBase 数据库引入了分区内并行合并。合并会将数据划分到不同线程中并行做合并,极大地提升了合并速度。
合并触发
合并触发有三种触发方式:自动触发、定时触发与手动触发。
参考文档https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001050879
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。