1 前言
Mycat目前版本支持跨分片的join,主要实现的方式有四种。
全局表
ER分片
HBT(参考MyCAT人工智能解决跨分片SQL.docx)
ShareJoin
ShareJoin在开发版中支持,前面三种方式1.3.0.1支持
2 ShareJoin
ShareJoin是一个简单的跨分片Join,基于HBT的方式实现。
目前支持2个表的join,原理就是解析SQL语句,拆分成单表的SQL语句执行,然后把各个节点的数据汇集。
支持任意配置的A,B表
如:
A,B的dataNode相同
<table name="A" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="B" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
A,B的dataNode不同
<table name="A" dataNode="dn1,dn2 " rule="auto-sharding-long" />
<table name="B" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
或
<table name="A" dataNode="dn1 " rule="auto-sharding-long" />
<table name="B" dataNode=" dn2,dn3" rule="auto-sharding-long" />
2.1相关类图
JoinParser: SQL语句的解析
TableFilter:存解析后的各个子表
ShareJoin:执行拆分的语句管理控制,和字段,记录的管理
ShareDBJoinHandler:第一个表执行后获取数据的handler
ShareRowOutPutDataHandler:最后一个表执行后获取数据的handler
EnginerCtx:执行引擎
SQLJob:SQL语句执行任务
SQLJobHandler:SQL语句执行后获取数据的handler
BatchSQLJob:批量执行任务控制
AllJobFinishedListener:所有任务完成侦听器
RouteService-----》HintCatletHandler---》ShareJoin
2.1测试
默认mycat的环境测试:
/*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.id, b.name as tit from customer a,company b on a.company_id=b.id;
/*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.id, b.name as name from orders a join customer b where a.customer_id=b.id;
/*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.* from orders a join customer b where a.customer_id=b.id;
/*!mycat:catlet=demo.catlets.ShareJoin */ select a.id,a.user_id,a.traveldate,a.fee,a.days,b.id as nnid, b.title as tit from travelrecord a join hotnews b on b.id=a.days order by a.id ;
2.3升级
未来支持多表的跨分片Join
小表放人缓存或广播方式
3全局表
一个真实的业务系统中,往往存在大量的类似字典表的表格,它们与业务表之间可能有关系,这种关系,可以理解为“标签”,而不应理解为通常的“主从关系”,这些表基本上很少变动,可以根据主键ID进行缓存,下面这张图说明了一个典型的“标签关系”图:
在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性:
- 变动不频繁
- 数据量总体变化不大
- 数据规模不大,很少有超过数十万条记录。
鉴于此,MyCAT定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:
- 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
- 全局表的查询操作,只从一个节点获取
- 全局表可以跟任何一个表进行JOIN操作
将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据JOIN的难题。通过全局表+基于E-R关系的分片策略,MyCAT可以满足80%以上的企业应用开发。
3.1配置
全局表配置比较简单,不用写Rule规则,如下配置即可:
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
需要注意的是,全局表每个分片节点上都要有运行创建表的DDL语句。
4ER分片
MyCAT借鉴了NewSQL领域的新秀Foundation DB的设计思路,Foundation DB创新性的提出了Table Group的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION的效率和性能问题,根据这一思路,提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。
customer采用sharding-by-intfile这个分片策略,分片在dn1,dn2上,orders依赖父表进行分片,两个表的关联关系为orders.customer_id=customer.id。于是数据分片和存储的示意图如下:
这样一来,分片Dn1上的的customer与Dn1上的orders就可以进行局部的JOIN联合,Dn2上也如此,再合并两个节点的数据即可完成整体的JOIN,试想一下,每个分片上orders表有100万条,则10个分片就有1个亿,基于E-R映射的数据分片模式,基本上解决了80%以上的企业应用所面临的问题。
4.1 配置
以上述例子为例,schema.xml中定义如下的分片配置:
<table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>
</table>
5HBT分片
解决跨分片的SQL JOIN的问题,远比想象的复杂,而且往往无法实现高效的处理,既然如此,就依靠人工的智力,去编程解决业务系统中特定几个必须跨分片的SQL的JOIN逻辑,MyCAT提供特定的API供程序员调用,这就是MyCAT创新性的思路——人工智能。
以一个跨节点的SQL为例,
Select a.id,a.name,b.title from a,b where a.id=b.id
其中a在分片1,2,3上,b在4,5,6上,需要把数据全部拉到本地(MyCAT服务器),执行JOIN逻辑,具体过程如下(只是一种可能的执行逻辑):
EngineCtx ctx=new EngineCtx();//包含MyCat.SQLEngine
String sql=,“select a.id ,a.name from a ”;
//在a表所在的所有分片上顺序执行下面的本地SQL
ctx.executeNativeSQLSequnceJob(allAnodes,new DirectDBJoinHandler());
DirectDBJoinHandler类是一个回调类,负责处理SQL执行过程中返回的数据包,这里的这个类,主要目的是用a表返回的ID信息,去b表上查询对于的记录,做实时的关联:
DirectDBJoinHandler{
Private HashMap<byte[],byte[]> rows;//Key为id,value为一行记录的Column原始Byte数组,这里是a.id,a.name,b.title这三个要输出的字段
Public Boolean onHeader(byte[] header)
{
//保存Header信息,用于从Row中获取Field字段值
}
Public Boolean onRowData(byte[] rowData)
{
String id=getColumnAsString(“id”);
//放入结果集,b.title字段未知,所以先空着
rows.put(getColumnRawBytes(“id”),rowData);
//满1000条,发送一个查询请求
String sql=”select b.id, b.name from b where id in (………….)”;
//此SQL在B的所有节点上并发执行,返回的结果直接输出到客户端
ctx.executeNativeSQLParallJob(allBNodes,sql ,new MyRowOutPutDataHandler(rows));
}
Public Boolean onRowFinished()
{
}
Public void onJobFinished()
{
If(ctx.allJobFinished())
{///used total time ….
}
}
}
/最后,增加一个Job事件监听器,这里是所有Job完成后,往客户端发送RowEnd包,结束整个流程。
ctx.setJobEventListener(new JobEventHandler(){public void onJobFinished(){ client.writeRowEndPackage()}});
以上提供一个SQL执行框架,完全是异步的模式执行,并且以后会提供更多高质量的API,简化分布式数据处理,比如内存结合文件的数据JOIN算法,分组算法,排序算法等等,
期待更多的牛人一起来完善。
http://www.cnblogs.com/tonylovett/p/5251471.html
相关推荐
Mycat 跨分片 Join 指南是 Mycat 中的一种join 操作方式,主要实现了跨分片的数据join 操作,支持多种实现方式。下面是对Mycat 跨分片 Join 的详细解释。 1. 全局表 在 Mycat 中,全局表是一种特殊的表,具有以下...
Mycat跨分片聚合处理、Mycat跨分片JOIN、Mycat分布式事务 第6课 Mycat性能测试与调优 Mycat性能参数及调优 Mycat性能测试 第7课 Mycat高可用方案 读写分离机制 集群机制 高可靠性的几种生产方案 第8课 ...
命令行工具指南 第4课 Mycat分片规则详解 Mycat 几种分片规则的使用说明以及例子 第5课 Mycat跨分片问题 Mycat跨分片聚合处理、Mycat跨分片JOIN、Mycat分布式事务 第6课 Mycat性能测试 与调优 Mycat性能参数及调优 ...
【MyCat打包合集】包含了关于MyCat数据库中间件的重要资料,主要涵盖了MyCat的安装指南、分片规则以及跨分片Join的操作指南,同时也详细列出了各数据库的分页语法支持,这对于理解和使用MyCat进行分布式数据库管理...
以下是一个具体的例子,展示了如何利用MyCAT API解决跨分片JOIN: 首先,考虑一个典型的跨节点SQL,如: ```sql SELECT a.id, a.name, b.title FROM a, b WHERE a.id = b.id ``` 在这个例子中,表a分布在分片1、2、...
在描述的示例中,我们看到一个典型的跨分片JOIN操作:`SELECT a.id, a.name, b.title FROM a, b WHERE a.id = b.id`。在这个例子中,表 `a` 分布在分片 1, 2, 3 上,而表 `b` 分布在分片 4, 5, 6 上。MyCAT 的处理...
5. Mycat的分片JOIN和全局序列号章节详细讲解了Mycat如何处理分片表的JOIN操作以及如何管理全局序列号,这对于确保数据一致性和避免冲突至关重要。 6. 常见问题与解决方案章节列举了Mycat使用者可能遇到的问题以及...
Mycat分片JOIN** Mycat支持在分布式数据库上执行JOIN操作,这包括对全局表、ERJoin、Sharejoin等的使用。在高级进阶篇中,还将讲解如何在Mycat中实现复杂的JOIN逻辑。 **7. 全局序列号** 全局序列号用于生成全局...
实现跨分片JOIN是一个复杂任务,MyCAT计划开发一个SQL处理引擎,允许用户编写类似于存储过程的代码来处理JOIN操作,以克服现有JOIN的局限。 3. **引入Droid SQL Parser支持多种SQL语法**: MyCAT计划集成阿里的...
“Mycat的分片JOIN”章节讲述了在使用分片表时如何实现JOIN操作,并讨论了全局表、ERJoin等高级主题。 “全局序列号”章节则对Mycat如何生成和使用全局唯一的序列号进行了介绍,这在分布式数据库场景下是保证数据...
5. **第5课Mycat跨分片问题**:探讨Mycat如何处理跨分片聚合查询、跨分片JOIN操作以及分布式事务管理等问题。 6. **第6课Mycat性能测试与调优**:介绍Mycat性能相关的参数设置及调优方法,以及如何进行性能测试。 7....
Mycat对SQL进行了增强,支持部分SQL的分布式事务,如两阶段提交,以及部分复杂的SQL操作,如跨节点的JOIN操作。 6. **性能优化** 通过批量处理、结果集缓存、线程池等手段,Mycat提高了系统的并发处理能力,降低...
#### 五、Mycat的分片JOIN Mycat支持多种类型的JOIN操作,包括全局表、ERJoin、Sharejoin等。 ##### 7.1 join概述 介绍了Mycat支持的JOIN操作类型及其工作原理。 ##### 7.2 全局表 全局表是指在所有分片节点上...
ER(实体关系)表分片是Mycat的一个重要特点,它能够保证关联查询时子表的记录与父表记录存放在同一个数据分片上,避免跨库的join操作。ER分片策略有助于解决数据分片后跨库join的问题,是数据切分规划的重要规则之...
Mycat能够智能地识别出哪个分片应该接收请求,并将其路由至正确的后端数据库服务器。这种方式极大地提高了数据处理效率,并且简化了前端应用程序的设计。 #### 四、配置示例 为了更好地理解和应用Mycat的读写分离...
4. **Mycat数据分片** 数据分片策略有哈希分片、范围分片、列表分片等,可以根据业务需求选择合适的策略。例如,哈希分片通过计算字段的哈希值决定数据存放的位置,适合均匀分布数据;范围分片则根据字段的范围划分...
2. **数据分片策略**:数据分片是Mycat性能的关键,常见的有哈希分片、范围分片、复合分片等。选择合适的分片策略可以显著提升查询效率,避免热点数据的出现。例如,哈希分片适合均匀分布的数据,范围分片适用于有序...