一篇讲明白Doris数仓特点
导读:Doris是一款基于MPP技术的SQL分析型数据库系统,能
够在海量数据的OLAP场景下提供毫秒级的查询响应性能。Doris
的实现架构脱胎自Apache Impala和Google Mesa系统,并进行
了大量的改造和优化,最终形成了今天大家看到的这款架构优雅、性
能卓越、功能丰富、简单易用的OLAP数据库系统。
01
极简架构
Doris从设计上来说,融合了Google Mesa的数据存储模型、Apache的ORCFile存储格式、Apache Impala查询引擎和MySQL交互协议,是一个拥有先进技术和先进架构的领先设计产品,如图1所示。
▲图1 Doris技术分解图
在架构方面,Doris只有两类进程:一类是FE,可以理解为Doris的管理节点,主要负责用户请求的接入、查询计划的解析、元数据的存储和集管理相关工作;另一类是BE,主要负责数据存储、查询计划的执行。这两类进程都是可以横向扩展的。除此之外,Doris不依赖任何第三方系统(如HDFS、Zookeeper等)。这种高度集成的架构设计极大地降低了运维成本。
FE节点包含Leader、Follower和Observer三种角。默认一个集只能有一个Leader,可以有多个Follower和Observer。其中,Leader和Follower组
成一个Paxos选择组,如果Leader宕机,剩下的Follower会自动选出新的Leader,保证写入高可用。Observer同步Leader的数据,但是不参加选举。如果只部署一个FE,则FE默认就是Leader。
FE节点主要包括存储管理(Store Manager)模块、状态管理(State Store)模块、协调(Coordinator)模块、元数据(StoreMeta)模块和元数据缓存(StoreMeta Cache)模块。存储管理模块负责管理所有的元数据信息,包括数据库、表信息、tablet信息、tablet的副本信息等。存储管理模块还负责管理用户的权限信息(即用户的认证信息和授权信息)和数据的导入任务等。状态管理模块负责管理所有BE进程的存活状态信息、查询负载信息等非持久化信息,并提供发布订阅接口。协调模块负责接收用户发来的请求,然后进行语句解析、生成执行规划,根据当前集的状态,对执行规划进行调度。元数据模块负责对元数据的读写,只有FE Leader拥有此权限。元数据缓存模块负责同步元数据,以供语句解析、生成执行规划,主要是Follower和Observer角的权限。
BE节点可以无限扩展,并且所有BE节点的角都是对等的。在集足够大的情况下,部分BE下线不影响集提供服务。BE节点主要由存储引擎(Store Engine)和查询执行器(Query Executor)组成。存储引擎负责管理节点本地的tablet数据,发送或者接收数据形成副本,定期合并更新多个版本的数据减少存储占用。存储引擎还负责接收来自查询执行器的数据读取需求和批量数据导入需求。一个查询在MPP集中执行时,会拆成一个树状的执行树,这棵树的执行由Coordinator来协调执行,树的叶子节点也叫计划片断(PlanFragment),每一个PlanFragment分配给一个BE节点的查询执行器来执行,这就是查询执行器模块的作用。
02
使用简单
Doris不仅架构简单,开发和使用也非常简单。对一款OLAP数据库来说,性能不是数据库的全部,易用性才是决定是否持续使用的关键,Doris从系统设计之初就一直以用户的易用性作为出发点。
从数据分析的全周期来看,一般可以简单归纳成四个方面,从数据建模→数据导入→用户上手分析→持续使用以及维护升级,Doris的易用性无处不在。在数据建模方面,Doris支持Aggregate、Unique和Duplicate三种模型,可以满足OLAP领域的各种应用场景。同时,Doris建表语句,相对于MySQL 只增加了一些分布式系统所具有的特性,比如分布键、分桶数等。有过分布式数据库使用经验的用户非常容
易理解和上手操作。
在数据导入方面,Doris提供多种数据导入方案(如图2所示),可以针对不同的数据源进行选择,同时在数据导入过程中提供原子性保证。不论是使用Broker Load进行批量导入,还是使用INSERT语句进行单条导入,都是一个完整的事务操作。导入事务可以保证一批次内的数据原子生效,不会出现部分数据写入的情况。
▲图2 Doris数据导入支持
同时,每一个导入作业都会生成一个Label,这个Label是在数据库内用于唯一区分一个导入任务。Label可以由用户指定,部分导入功能也会由系统自动生成。Label用于保证对应的导入作业仅能成功导入一次,一个成功导入的Label再次使用时,会被拒绝并报错Label already used。通过这个机制,数据消费侧可以实现At-Most-Once语义。如果结合上游系统的At-Least-Once语义,则可以实现端到端数据导入的Exactly-Once语义。数据导入流程如图3所示。
▲图3 Doris数据导入流程doris
在SQL开发方面,Doris支持标准的SQL语言,在方言方面向MySQL兼容。不论是简单的单表聚合、排序过滤操作,还是复杂的多表关联、子查询、窗口函数等,Doris都可以通过SQL轻松完成,极大地降低
了用户的迁移和使用成本。Adhoc这类高吞吐的即席查询和库内ETL场景也是Doris的强项。Doris还能够支持复杂SQL语法,包括Grouping Set等高级语法功能,同时还可以通过UDF或UDAF来自定义拓展功能。在TB级别数据上,Doris可以部分代替Hive等离线系统的功能,使得用户在一套数据库中满足所有需求。
在工具方面,Doris在FE模块中实现了兼容MySQL协议,方便用户使用标准的MySQL客户端或各种语言的类库进行连接,对各种工具的支持都非常好。在数据库开发方面[3] [4] ,我们可以无缝使用DBeaver、DataGrip、Navicat等主流开发工具;在编程应用方面[5] [6] ,Doris完全支持MySQL的JDBC和ODBC接口,可以支持C、Python、Java、Shell等开发语言;在BI 应用方面,Doris支持帆软BI、观远BI、永洪BI、Tableau等各种敏捷BI软件;在ETL调度方面,Doris支持Kettle、DolphinScheduler等主流软件。
在集可靠性方面,Doris元数据使用内存存储+检查点+镜像日志文件的模式,使用BTBJE(类似于Raft )协议实现元数据的高可用性和高可靠性。Doris内部自行管理数据的多副本和自动修复,保证数据的高可用、高可靠性。在部分服务器宕机情况下,集依然可以正常运行,数据也不会丢失。Doris部署无外部依赖,只需要部署BE和FE模块即可搭建一个集。Doris 支持在线更改表模式(加减列、创建Rollup ),不会影响当前服务,不会阻塞读、写等操作,因为这种操作是异步执行的。
在集扩缩容方面,Doris基于自身的分布式管理框架,可以自动管理数据副本的分布、修复和均衡。比如对于副本损坏的情况,Doris会自动感知并进行修复。而对于节点扩缩容,仅需一条SQL命令即可完成,Doris会自动进行数据分片均衡,整个过程完全不影响系统服务,无须运维人员进行任何额外的操作。
在集升级方面,Doris的升级方式却极其简单,只需要替换二进制程序,滚动重启集即可。在设计上,Doris完全向前兼容,所以也可以通过灰度升级的方式进行新版本的验证和测试。而Doris本身的一些失败重试和故障路由功能也极大地降低了升级过程中发生的错误对业务的影响。
03
功能丰富
Doris提供了非常丰富的功能来帮助业务适应不同的应用场景。下面重点介绍一些Doris的特功能。
首先是分区分桶裁剪功能。Doris支持两个层次的数据划分:第一层是Partition,支持Range和List的划分方式。第二层是Bucket分桶,将数据通过Hash进行水平划分,数据分片Tablet在集中均匀打散。Doris数据分布示例如图4所示。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。