ocean base整体架构介绍
面向批量事务处理的分布式数据库系统ocean base采用了Zone(可用区域)的概念,每个Zone是一个机房内的一组服务器,包括多个ocean base服务器(观察者)。每个观察者包含SQL引擎、事务引擎和存储引擎,并服务于多个数据分区。每个区域中的一个观察者可以同时启用RootService,用于执行集群管理、服务器管理、自动负载平衡和其他操作。观察者会运行SQL引擎、事务引擎和存储引擎,用户的SQL查询经过SQL引擎的解析和优化后,会转化为事务引擎和存储引擎的内部调用。对于跨服务器操作,ocean base还会执行强一致的分布式事务,从而在分布式集群上实现数据库事务ACID。 ocean base数据库采用无共享架构,所有节点完全平等。每个节点都有自己的SQL引擎、事务引擎和存储引擎,运行在普通PC服务器组成的集群上,具有可伸缩、高可用、高性能、低成本的核心特性。 集群架构 ocean base支持跨区域的数据部署,每个区域可能位于不同的城市,距离通常比较远,所以ocean base可以支持多城市部署和多城市容灾。一个区域可以包含一个或多个zone,zone是一个逻辑概念,包含一个或多个运行OBServer进程的服务器(以下简称OBServer)。每个区域包含一个拷贝(全功能拷贝或日志拷贝)。因为ocean base的数据副本是分区域的,所以同一个区域的数据会分布在多个区域。每个分区的主副本所在的服务器称为Leader,所在的区域称为Primary Zone。 存储引擎 ocean base的存储引擎采用基于LSM树的架构,将基线数据和增量数据分别保存在磁盘(SSTable)和内存(MemTable)中,特点是读写分离。对数据的更改是增量数据,只写入内存。所以DML是一个性能非常高的完整内存操作。读取时,数据可能在内存中有更新版本,在永久存储中有基线版本。有必要合并两个版本以获得最新版本。SQL引擎 ocean base的SQL引擎是整个数据库的数据计算中心。与传统数据库类似,整个引擎分为三个部分:解析器、优化器和执行器。当SQL引擎接收到SQL请求后,会经过语法解析、语义分析、查询重写、查询优化等一系列过程,由执行器执行。不同的是,在分布式数据库中,查询优化器会根据数据的分布信息生成分布式执行计划。如果查询涉及的数据在多台服务器上,就需要采取分布式计划,这是分布式数据库SQL引擎的一个重要特性,也是考验查询优化器能力的一个场景。ocean base的查询优化器做了很多优化,比如运算符下推、智能连接、分区裁剪等。如果SQL语句涉及大量数据,ocean base的查询执行引擎还做了并行处理、任务拆分、动态分区、流水线调度、任务切割、子任务结果合并、并发限制等优化技术。 为了加快SQL请求的处理速度,ocean base采用了SQL请求特有的“快速参数化”来加快执行计划的查找。 解析器(语义解析模块) 生成语法树后,解析器会进一步将语法树转换成带有数据库语义信息的内部数据结构。在这个过程中,解析器将把SQL请求中的令牌翻译成相应的对象(如库、表、列、索引等。)根据数据库元信息,生成“语句树”。 变压器(逻辑重写模块) 在查询优化中,经常使用等价重写的方法将用户的SQL转换成另一个等价的SQL,以便优化器生成最佳的执行计划。我们称这个过程为“查询重写”。在Resolver之后,Transformer分析用户SQL的语义,根据内部规则或代价模型将用户SQL重写为其他等价形式,并提供给后续优化器进行进一步优化。Transformer的工作模式是在原有的语句树上进行等价变换,变换的结果仍然是一棵“语句树”。 优化器(优化器) 优化器是整个SQL优化的核心,它的作用是为SQL请求生成最佳的执行计划。在优化过程中,优化器需要综合考虑SQL请求的语义、对象数据的特性、对象的物理分布等因素,解决访问路径选择、连接顺序选择、连接算法选择、分布式计划生成等几个核心问题,最终选择一个SQL对应的最优执行计划。SQL的执行计划是由多个操作符组成的“执行树”。 代码生成器(代码生成器) 优化器负责生成最佳执行计划,但其输出结果不能立即执行,需要由负责这个过程的代码生成器转换成可执行代码。 遗嘱执行人(执行者) 当SQL的执行计划生成后,执行器将启动SQL的执行过程。对于不同类型的执行计划,执行程序的逻辑有很大不同:对于局部执行计划,执行程序会简单地从执行计划顶层的操作符开始调用,操作符的逻辑会完成整个执行过程并返回执行结果;对于远程或者分布式的计划,执行者需要将执行树按照预先选择的划分划分成几个可以调度的线程,通过RPC发送到相关节点执行。 计划缓存(执行计划缓存模块) 执行计划的生成是一个复杂的过程,需要很长时间,尤其是在OLTP场景中,这一点不容忽视。为了加快SQL请求的处理速度,SQL执行引擎会将SQL第一次生成的执行计划缓存在内存中,后续的执行可以重复执行这个计划,从而避免了重复的查询优化过程。
页:
[1]