我们这次讨论的 OceanBase AP 场景 PoC,是替换原有 AP 系统。也就是说,前提是:默认原有业务数据库的 schema 模型等都已经是被验证过的,而不是重新为新业务设计。 整体来看,可以采用平迁策略。即原系统是行存,用 OB 替换之后也是行存;原系统是列存,替换之后也是列存。聚集键、分区键等也保持和原系统保持一致即可。识别出特殊场景后,再做不一致设计。
这里只有索引比较特殊,不是完全平替。一些 AP 数据库,索引创建的可能会比较随意,数量极大。在 OceanBase 中,索引尽量按业务需求来创建,在替换时应该只保留需要的索引。 表结构设计
这里有一个在表格,列举了主流 AP 数据库中,表结构设计时需要关注的一些要点。
表格中的内容不全,可能会在后面的学习笔记中继续完善和修改。表格中只罗列一些信息,主要是为了在不同数据库间进行术语转换。
** **OceanBaseOther AP DataBases数据聚集 (Data Clustering)+ 堆表[1]: 插入序
+ 索引组织表: 主键序+ CLUSTERED KEY
+ ORDER BY
+ CLUSTER ON数据分布 (Data Distribution)+ 分区
- 通常一级时间维度 range 分区+ DISTRIBUTED BY
- HASH / RANDOM / ROUNDROBIN / REPLICATED合并策略+ 手动合并
+ table_mode:
- normal
- queuing
- moderate
- super
- extreme+ None
+ 手动合并分区管理+ 手动分区
+ ODC 设置分区计划[2]
+ 435 BP2 自动分区分裂[3]
+ 435 BP2 动态分区管理[4]+ LIFECYCLE
+ TTL(partition_retention_condition)
+ 动态分区管理colocatetablegroupcolocate_with聚合表Alternative MV+ Aggregation Table
+ Alternative MV最小迁移单位partition / tablet+ shard
+ tablet
+ share storage
+ segment
- 二级 hash 分区
复制代码
tablegroup sharding
primary zone
复制表
BROADCAST
上面这个表格太大,不适合在手机上阅读,接下来就通过文字来简单记录下这张表格中的要点。 数据聚集
大多 AP 数据库都是按时间维度(由老到新)做聚集的堆表,对应 OceanBase 中的堆表。如果其他 AP 数据库用到了 CLUSTERED KEY,对应的则是 OceanBase 的索引组织表(默认)。 在 OceanBase 中,可以通过 default_table_organization 配置项来控制创建的表类型默认是堆表还是索引组织表。
附上一个堆表和索引组织表的示意图(图中蓝色表示同属于具体一个用户的数据,红色表示同属于一天的数据)。
按时间聚集(堆表默认):
按用户聚集(索引组织表,主键为 user):
按时间聚集 + 分区:
在常见的 AP 数据库中,有一些是通过 clustered key 进行数据聚集,还有个别的数据库数据聚集方式相对复杂,会分成很多层次。因为不同数据库的数据聚集方式可能都有一些出入,所以把某些 AP 数据库里的索引直接平迁到 OceanBase 里作为主键,可能并不合适。需要先理解原数据库的数据聚集方式,以及分片是怎么拆到多个机器上的,否则可能会出问题。 数据分布
数据分布这里,可以简单理解成怎么把数据分布到多台机器上去。除了 share storage 的数据库,其他都是要考虑数据分布的。
很多 AP 数据库都有分区(partition)+ 数据分布(distributed key)。其中分区(partition)是用于做数据管理的,例如可以把用于存放三年之前旧数据的分区给 drop 掉。而数据分布式单独设计的。当原数据库的表有 partition + distributed key 的时候,就需要在 OceanBase 中的对应表中设计分区键了。数据分区方式参考原数据库即可,例如 partition by 对应一级分区,distributed by 对应二级分区。
这里再介绍一个 AP 场景非常典型的表结构设计:堆表 (4.3.5.1 OLAP 模式默认为堆表) + 时间纬度一级 range 分区 + 业务纬度二级 hash 分区。
在 OceanBase 中,除了分区,还有 tablegroup、复制表、primary zone 等概念,这里不再一一解析。 合并策略
OceanBase 里的索引和纯 AP 数据库的索引可能还不太一样,在一个 table scan 算子里,对同一张表进行谓词过滤,只能用到一个索引。所以建议就是按需建索引,尽量别像其他纯 AP 数据库一样,大量创建(不必要的)索引。
OB 正在支持 index merge 的能力,这个能力会对查询谓词进行拆分,将每部分谓词使用不同的索引进行 index range scan,随后合并各个索引表的扫描结果,再统一进行回表。当查询中各个索引的过滤性不强,但联合过滤性强时,会有较大的性能优势。
其实现在的版本已经支持通过 UNION_MERGE Hint 来进行 index merge 了,不过随着 AP 业务的不断拓展,马上还会支持更常用的多个全文索引和二级索引的 index merge。 colocate / tablegroup
一些 AP 数据库在打散数据时,支持更细粒度地去调整数据在不同节点的分布情况。例如 StarRocks 支持通过 colocate_with,可以将两张或多张表的分区分布规则设置为一致,从而在分布式查询中显著减少数据重分布的开销,提升 Join 查询性能。
另一些纯 AP 数据库,并不支持这个能力,大多都是非常简单的 distributed by 分布键,不过只要能保持 hash 分区规则和分片数一致,基本都能保证分布规则是一样的。
在 OceanBase 中,可以通过 tablegroup[8] 来替换类似于 colocate_with 的能力。tablegroup 也是用来调整一批表的分区分布规则,让查询中尽量少一些数据在网络中的重分布,使得计划中出现更多的 partition wise join。 复杂数据类型
AP 场景常用的复杂数据类型是 json、bitmap、array、string,这些 OceanBase 都支持了,直接平迁就行,所以先略过不提。 聚合表