各位老师,迁移至国产分布式数据库后的分库分表方案,一直困扰着我;也查阅了很多相关资料,但是还是感觉没有一个满意的可落地方案。因此提出几个具体问题,希望各位老师能够解答,也希望各位同业一起交流。
1 尽量保证单库查询的原则是指的一个交易事务范围内,还是单个sql范围内呢。
2 一笔记账交易涉及多类表:如账户表,参数表,凭证表,流水表,机构表等。如何合理划分分片键呢,保证尽量单库处理。能否有具体的案例参考。
3 如何衡量分库分表策略合理呢。是否有类似单库sql占比,两分片sql占比等类似的指标进行衡量呢。
4 是否可以提供某个具体案例,交易描述,分片策略等,帮助我们进行参考
一般表记录数快速增长的做水平表(比如日志表、流水表等), 表记录数增长缓慢且知道最大增长到多少的做垂直表, 表记录数快速增长的做全局表/广播表(比如参数表、配置表)
金融行业一般用机构号来做分片的较多
收起先考虑表的性质,是在线交易型(存放在线交易数据),还是分析型(历史数据归档和交易日志等),在线交易型的表分区优先考虑事务处理逻辑,避免分布式事务,考虑和其他表关联的情况,来确定分区键以及分区的方式,索引的创建和使用需要考虑表分区键,在线交易系统单笔交易涉及sql数量一般都比较多,单个事务内包含多条sql,建议分析交易处理逻辑以及sql涉及的表结构,再做分区。分析型的表优先考虑历史数据归档以及清理的问题,另外还有历史数据查询的效率问题,OceanBase现有的表组,支持全局唯一性索引(可以不带分区键),广播表,对分表非常的友好。
收起通常单sql查询索引合理的情况下不会有问题,这里的单sql指的是单表的sql,如果带上分片字段的话是最优解,只操作单节点。单sql的更新,update和delete需要带上分片字段,否则存在跨节点更新,会有效率问题,对于不支持全局一致性的数据库来说,可能还有一致性问题。insert时涉及跨节点更新时也要注意。两个以上表操作sql设计是难点,总得原则就是避免跨节点数据流动,能拆就拆,不能拆的关键字段必须是分片字段。
收起