暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Oceanbase与基于mycat的分库分表差异

2491

    最近一个客户一直在强调将引用系统的数据进行分库分表,具体原因不说了,在整理方案的时候简单做了一个mycat与OB(分布式数据库)的对比,以下摘抄对比部分进行讨论,欢迎大佬们指正,当然最后我的建议是推荐客户使用分布式数据库。

    在做方案的时候主要从以下几个角度来进行区分。

     一、单表查询

mycat

    在使用mycat的时候建议使用分片键进行查询,这样可以通过路由功能直接找到所在的水平库表,如下图:

    客户端执行一条sql语句,路由根据分片建id,可以确定是在那个分库分表中。

    但是一旦没有分片建,那么就会从所有的分库中查询结果在进行汇总,这样会非常消耗mycat和mysql的资源。

OBCluster

    这里先引用ob官方文档里的一张图


    OBProxy 中保存了 Partition 和 OBServer_addr 的映射缓存,如果where条件中存在分区键,则会直接找到patition的主副本,如果查询中没有指定分区建,则会路由到随便一台机器,这台机器执行remote的并行执行计划,相比与mycat来说obcluster集成了路由、并行执行计划、远程执行计划等,并且obproxy基本上不存在性能瓶颈的情况,并且ob是支持类似于oracle的全局索引和本地索引,因此可以大大提升查询效率。

     二、分页查询

mycat

如果某个表存在三个分片,数据分布如下

DB1.table1:[0,1,2,3,4,5] 
DB2.table2:[32,33,34,35] 
DB3.table3:[22,23,24,25]

如果执行一下sql语句,没有使用任何条件

select * from table limit 2;

这样的查询结果集是不确定性的,因为查询结果可能是【0,1】或【32,33】或【22,23】,为了解决此类问题mycat后台执行了特别多的处理来保证结果的正确,因此非常消耗cpu进行计算。

Obcluster

我们先看一下ob的分布式执行计划


生成分布式计划就是EXCHANGE 表示的位置表示从此处开始分布式执行计划,每个TABLE SCAN 和 EXCHANGE OUT构成了一个分布式执行计划任务实行并行执行。不对存在单节点性能瓶颈

     三、join操作

mycat

使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布

Obcluster

obproxy会根据事务开始的第一条sql语句进行路由,如果join的表的主副本不在本地,则开启remote执行计划

     四、其他的一些对比图

特性 Mysql OceanBase
水平拆分 借助Mycat、sharding jdbc等中间件 支持
数据迁移 需要手工拆分 无需手工介入
应用改造工作量 对应用透明 对应用透明
分布式事务 不支持 支持
分表设计 复杂 简单
多表join 支持(join)的谓词必须在同一数据库分片 支持
排序、聚合、full scan、range scan 效率低 效率高
读写分离 不支持 支持
二次改造 复杂 简单
可扩展性 需要开发人员重新水平拆分表 无需开发接入
备份恢复 备份恢复多套数据库  备份一套即可
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论