10.4 OLAP业务支持

OLAP业务的特点是SQL每次执行涉及的数据量很大,需要一次性分析几百万行甚至几千万行的数据。另外,SQL执行时往往只读取每行的部分列而不是整行数据。

为了支持OLAP计算,OceanBase实现了两个主要功能:并发查询以及列式存储。并行查询功能允许将SQL请求拆分为多个子请求同时发送给多台机器并发执行,列式存储能够提高压缩率,大大降低SQL执行时读取的数据量。本节首先介绍并发查询功能,接着介绍OceanBase的列式存储引擎。

10.4.1 并发查询

如图10-13所示,MergeServer将大请求拆分为多个子请求,同时发往每个子请求所在的ChunkServer并发执行,每个ChunkServer执行子请求并将部分结果返回给MergeServer。MergeServer合并ChunkServer返回的部分结果并将最终结果返回给客户端。

10.4 OLAP业务支持 - 图1

图 10-13 OceanBase并发查询

MergeServer并发查询执行步骤如下:

1)MergeServer解析SQL语句,根据本地缓存的子表位置信息获取需要请求的ChunkServer。

2)如果请求只涉及一个子表,将请求发送给该子表所在的ChunkServer执行;如果请求涉及多个子表,将请求按照子表拆分为多个子请求,每个子请求对应一个子表,并发送给该子表所在的ChunkServer并发执行。MergeServer等待每个子请求的返回结果。

3)ChunkServer执行子请求,计算子请求的部分结果。SQL执行遵从10.2.4节提到的本地化原则,即能让ChunkServer执行的尽量让ChunkServer执行,包括Filter、Project、子请求部分结果的GroupBy、OrderBy、聚合运算等。

4)每个子请求执行完成后,ChunkServer将执行结果回复MergeServer,Merge-Server首先将每个子请求的执行结果保存起来。如果某个子请求执行失败,MergeServer会将该子请求发往子表其他副本所在的ChunkServer执行。

5)等到所有的子请求执行完成后,MergeServer会对全部数据排序、分组、聚合并将最终结果返回给客户。OceanBase还支持批量读取(multiget)操作一次性读取多行数据,且读取的数据可能在不同的ChunkServer上。对于这样的操作,MergeServer会按照ChunkServer拆分子请求,每个子请求对应一个ChunkServer。假设客户端请求5行数据,其中第1、3、5行在ChunkServer A上,第2、4行在ChunkServer B上。那么,该请求将被拆分为(1、3、5)和(2、4)两个子请求,分别发往ChunkServer A和B。


Class ObMsSqlRequest

{

public:

//唤醒正在等待的工作线程

int signal(ObMsSqlRpcEvent&event);

//等待某个子请求返回

int wait_single_event(int64_t&timeout);

//处理某个子请求的返回结果

virtual int process_result(const int64_t timeout,ObMsSqlRpcEvent*event,bool&finish)=0;

};


ObMsSqlRequest类用于实现并发查询,相应地,ObMsSqlScanRequest以及ObMs-SqlGetRequest类分别用于实现并发扫描和并发批量读取。MergeServer将大请求拆分为多个子请求,每个子请求对应一个子请求事件(ObMsSqlRpcEvent)。工作线程将子请求发给相应的ChunkServer后开始等待(调用waitsingle_event方法),ChunkServer执行完子请求后应答MergeServer。MergeServer收到应答包后回调signal函数,唤醒工作线程,工作线程接着调用process_result进行处理。ObMsSqlScanRequest和ObMsSql-GetRequest实现了process_result接口,将每个子请求返回的部分结果保存到结果合并器merge_operator中。如果所有的子请求全部执行完成,processresult函数返回的finish变量将置为true,这时,merge_operator中便保存了并发查询的最终结果。

细心的读者可能会发现,OceanBase这种查询模式虽然解决了绝大部分大查询请求的延时问题,但是,如果查询的返回结果特别大,MergeServer将成为性能瓶颈。因此,新版的OceanBase系统将对OLAP查询执行逻辑进行升级,使其能够支持数据量更大且更加复杂的SQL查询。