邮箱:oxwangfeng@qq.com
分类: 服务器与存储
2016-01-28 14:05:51
随着数据规模及其访问量对关系数据库提出了很大挑战:数十亿条的记录、数TB的数据、数千TPS、数万QPS让传统的关系数据库不堪重负,单纯的硬件升级已经无法使得问题得到解决。一般常见的做法就是进行水平拆分,通常选取某些业务字段作为拆分键,按照一定方式散列到不同的数据库服务器上,客户端请求通过中间件路由到不同的分区。但是在分库分表过程中,很容易带来跨机查询,这样就会带来了额外的带宽、IO、CPU开销;
本方案主要是研讨在join关联中如何减少带宽、IO、CPU开销,如何进行高效的进行关联操作。
OceanBase的join关联采用预定义方式,一个表冗余了相关关联表的字段,并且采用每天定时把关联表的字段添加到相关表中。这样虽然增加了相应时间,但是每天需要定时进行数据合并并且进行数据冗余;这样的处理不太适合实时性要求比较高的OLTP应用。
目前已知的OLTP开源实现中,还没有对关联查询的较好支持;有些也仅仅是支持小表之间的关联,不适合用于大数据表之间的关联;
使用场景:
一个表的拆分键必须和另外一个表的拆分键进行关联;比如select A.ID1,B.ID2 FROM A JOIN B ON
A.ID1=B.ID1 A表的拆分键为ID1,B表的拆分键为ID2, ID2是A的外键;
预处理:
在元数据中配置A和B的关系:A和B表都设置为相同的散列方式,具有相同的分片数。
本方案主要有4个步骤,其中步骤1),2),3)是不断迭代执行的。
1)首先解析出带有join的sql语句中所涉及的关联表,并且解析出关联的列;
2)
查找配置,查询join关联的两个列否具有主外键关系,是否具有相同的散列方式。如果有,则进行下一步;
3)根据路由,优化sql,并且生成执行计划。如果具有相同的主外键关系,并且配置中配置相同的散列方式,则相关联的数据不仅在相同的机器上,还在相对应的分片上。比如SELECT A.ID FROM A JOIN B ON A.ID = B.ID, A的ID和B的ID是主外键关系,由于具有相同的散列方式。进行执行计划后,sql就会被优化为SELECT An.ID FROM An JOIN Bn ON
An.ID = Bn.ID, n表示某个分片,A和B相关联的分片都在第n个分片上;
4)分发到相应数据库服务器上执行join关联查询
技术方案:
流程图
通过本技术方案,可以让分布式数据库系统能够保持分布式系统的优点的前提下,尽可能的处理复杂的带JOIN的sql语句,并且能够支持OLTP的应用。
通过本技术方案,没有跨机查询,这样了减少了带宽、IO开销,也减少了中间件系统处理数据合并的CPU操作;所以,能够极大的提高分布式数据库系统的效率;此外,由于此技术方案实时性比较高,非常适合用在OLTP中;
关键:
1)在分布式mysql集群系统中,通过JOIN查询的解析以及查询配置,能够将具有主外键关系的join查询散列到相同的机器上,从而使整个系统能够处理复杂的带关联查询。
2)本方案处理join关联查询的方案,非常适合OLTP应用,实时性特别高,并且对cpu、io、带宽压力较小。
专业名词:
分布式mysql系统: 类似于mysql官方提供的mysql proxy架构的系统,能够分库分表,让sql进行并行查询并且结果汇总
sql解析:将sql语句中各种语法元素,比如关键词select,from,where, in, any等内部各种信息解析的处理。