大数据之实时数据分析之doris数据库

一、概要

Apache Doris是一款现代 MPP (Massively Parallel Processing大规模并行处理)的分布式 SQL 分析数据库,所谓分析数据库就是将其数据集分布在许多机器或节点上,以处理大量数据,采用 Apache 2.0认证授权。它的前身是原百度 Palo,由百度在2017年开源,2018年进入 Apache 孵化器。Apache Doris它可以提供亚秒级查询和高效的实时数据分析。凭借其分布式架构,将支持高达 10PB 级别的数据集,并且易于操作。它可以满足各种数据分析场景,比如:历史数据报告、实时数据分析、交互式数据分析、探索性数据分析等。
在这里插入图片描述
关于MPP (Massively Parallel Processing),即大规模并行处理,它是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。整个集群称为非共享数据库集群,非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。故MPP数据库作为一款 Shared Nothing架构的分布式并行结构化数据库集群,它的高性能、高可用及高扩展特性,可以为超大规模数据管理提供高性价比的通用计算平台,并广泛地用于支撑各类数据仓库系统、BI 系统和决策支持系统。

MPP 采用完全并行的MPP + Shared Nothing 的分布式扁平架构,这种架构中的每一个节点(node)都是独立的、自给的、节点之间对等,而且整个系统中不存在单点瓶颈,具有非常强的扩展性。

MPP数据库适合存储高密度价值数据,并且是长期存储和频繁使用(读/消费),MPP并行数据库会花大量的精力在Load阶段,把数据处理成适合分析的中间格式。带来的优点就是从查询速度快,通常在秒级甚至毫秒级以内就可以返回查询结果。缺点是不支持细粒度的容错。MPP 具备以下技术特征:

1、相对低的硬件成本:完全兼容 x86 架构的 PC Server,无需昂贵的 Unix 服务器和磁盘阵列;

2、集群架构与部署:完全并行的 MPP + Shared Nothing 的分布式架构,采用 Non-Master 部署,节点对等的扁平结构;

3、海量数据分布压缩存储:可处理 PB 级别以上的结构化数据,采用 hash分布、random 存储策略进行数据存储;同时采用先进的压缩算法,减少存储数据所需的空间,可以将所用空间减少 1~20 倍,并相应地提高 I/O 性能;

4、 数据加载高效性:基于策略的数据加载模式,集群整体加载速度可达2TB/h;

5、高扩展、高可靠:支持集群节点的扩容和缩容,支持全量、增量的备份/恢复;但当节点数达到100左右时,MPP会遇到SQScalability的问题,速度变慢,或者不稳定。增加或者删除节点时,需要的维护工作比较大,集群会遇到数据迁移和重新平衡的问题;

6、 高可用、易维护:数据通过副本提供冗余保护,自动故障探测和管理,自动同步元数据和业务数据。提供图形化工具,以简化管理员对数据库的管理工作;

7、高并发:读写不互斥,支持数据的边加载边查询,单个节点并发能力大于 300 用户;

8、行列混合存储:提供行列混合存储方案,从而提高了列存数据库特殊查询场景的查询响应耗时;MPP数据库一般是列式的,即MPP数据库通常将每一列存储为一个对象,而不是将表中的每一行存储为一个对象(事务数据库的功能)。这种体系结构使复杂的分析查询可以更快,更有效地处理。

9、标准化:支持SQL92 标准,支持 C API、ODBC、JDBC、ADO.NET 等接口规范。

我们这里顺带回顾下OLTP与OLAP区别:

OLTP(OnLine Transaction Processing ,联机事务处理)系统:如mysql,这种关系型数据库擅长事务处理,在数据操作中保持着很强的一致性和原子性 ,能够很好的支持频繁的数据插入和修改 ,但是,一旦数据量过大,OLTP便力不从心了。

OLAP(On-Line Analytical Processing,联机分析处理)系统:例如Greenplum。并不特别关心对数据进行输入、修改等事务性处理,它更关心对已有的大量数据进行多维度的、复杂的分析的一类数据系统。

与Hadoop的区别:

1、.底层数据库不同:MPP跑的是SQL,而Hadoop底层处理的是MapReduce程序。SQL on Hadoop是利用Hadoop平台存储数据,在其之上实现SQL查询引擎。最大的特点是Scalability非常好,可以支持超过1000个节点的集群。但是由于Hadoop的特点,很多查询还是需要做大量的数据扫描操作,因此查询速度往往比MPP要慢,而且支持的并发查询数一般也比较低。

2、扩展能力不同:MPP虽然是宣称可以横向扩展Scale OUT,但是这种扩展一般是扩展到100左右,而Hadoop一般可以扩展1000+。
3、应用场景不同:Hadoop更适合处理非结构化和半结构化数据,尤其适合海量数据批处理等应用要求,多用于海量数据存储查询、批量数据ETL、非机构化数据分析(日志分析、文本分析)等;而MPP适合替代现有关系数据进行现有条件下的大数据处理,且具有较高的效率,适合多维度数据自助分析、数据集市等。如何场景中数据都是结构化的数据,且习惯使用传统的RDBMS,可以考虑MPP,例如Greenplum/Gbase/elasticsearch/doris/MemSQL/Teradata等;但是如有很多非结构化数据,或者数据量巨大,有需要扩展到成百上千个数据节点需求的,这个时候Hadoop是更好的选择,如Hive/Spark等。

与传统数据库的对比:

在这里插入图片描述
Doris 主要集成了 Google Mesa 和 Apache Impala 的技术,基于列式存储引擎,可以通过 MySQL 客户端进行通信。Doris 的定位是面向在线报表和分析的数据仓库系统,可以对标于商业的MPP 数据仓库系统,比如Greenplum、Vertica、Teradata 等。Doris 的目标:

在这里插入图片描述
Doris优势:

扫描二维码关注公众号,回复: 14276849 查看本文章

完全兼容MySQL协议;
采用列式存储、对数据以高压缩比进行压缩存储、向量化执行等先进技术,因此获得了极高的查询效率;
支持多种存储模型:同时支持类似于Mesa将列分为Key和Value的存储模型,同时支持Unique Key和Dup Key的存储模型。用户可以根据自己的业务场景,选用不同的存储模型;
支持两层分区;
支持多种数据导入方式;
安全资源隔离扩容缩容;
备份和恢复;
支持web监控和管理;

相关知识参考:

1、Apache Doris : 一个开源 MPP 数据库的架构与实践

2、Doris 建表、数据导入与删除

3、Doris 数据模型、ROLLUP 及前缀索引

4、Doris官网;官方中文文档

二、产品架构及原理

在这里插入图片描述
整体架构如下图:

在这里插入图片描述
如上图所示,Doris 的整体架构分为了两层。多个 FE 组成第一层,提供 FE 的横向扩展和高可用。多个 BE 组成第二层,负责数据存储于管理。Doris 的整体架构和 TiDB 类似,借助 MySQL 协议,用户使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客户端,都可以直接访问 Doris。Doris 中的模块包括 FE 和 BE 两类:FE 主要负责元数据的管理、存储,以及查询的解析等;一个用户请求经过 FE 解析、规划后,具体的执行计划会发送给 BE,BE 则会完成查询的具体执行。BE 节点主要负责数据的存储、以及查询计划的执行。目前平台的 FE 部分主要使用 Java,BE 部分主要使用 C++。

2.1、组件及原理

FE(Frontend):,Doris的前端节点。它主要负责接收和返回客户端请求、元数据、集群管理和查询计划生成。各个 FE 之间,通过 bdbje(BerkeleyDB Java Edition,在 Doris 中,使用 bdbje 完成元数据操作日志的持久化、FE 高可用等功能)协议进行 leader 选举,数据同步等工作。FE角色分为追随者Follower和观察者 Observer,其中Leader是Follower组中选举产生的;其中一个 follower 成为 leader 节点,负责元数据的写入操作。当 leader 节点宕机后,其他 follower 节点会重新选举出一个 leader,保证服务的高可用。observer 节点仅从 leader 节点进行元数据同步,不参与选举。可以横向扩展以提供元数据的读服务的扩展性。

BE(Backend): Doris的后端节点。主要负责数据存储与管理、查询计划执行等工作。

Broker:Broker是一个无状态的进程。主要是让 Doris 在类 Unix 的文件系统接口中可以访问如 HDFS 上的数据那样的外部数据源,从而可以用于数据导入或数据导出操作。

Tablet:Tablet是一张表的实际物理存储单元。在由BE组成分布式存储层中,经过分区分桶后,以Tablet为单位存储一张表。每个 Tablet 包括元信息和几个连续的 RowSet。 .

Rowset:Rowset是tablet中某次数据变化的数据集合,数据变化包括:数据的导入、删除、更新。Rowset按版本信息记录。每次更改都会生成一个版本。

Version:由Start和End两个属性组成,维护数据变化的记录信息。通常用来表示 Rowset 的版本范围,新导入后会生成一个 Start 和 End 相等的 Rowset,在 Compaction 之后生成一个有范围的 Rowset 版本。

Segment:表示Rowset中的数据段。多个 Segment 形成一个 Rowset。

Compaction:合并连续版本的Rowset的过程称为Compaction,合并过程中数据会被压缩。

2.2、Doris 数据分布

如果从表的角度来看数据结构,用户的一张 Table 会拆成多个 Tablet,Tablet 写入/存储到Doris会存成多副本,存储在不同的 BE 中,从而保证数据的高可用和高可靠。类似于kafka的分区存储多副本。

在这里插入图片描述

2.3、Doris 数据模型

1)Doris 数据模型特点

1、键值对存储形式:类似于字典搜索查询的键值对格式,Doris 中所有数据分成两列:Key 列和 Value 列。如下图所示,Time、Id、Country 列共同组成 Key 列,Clicks、Cost 列为 Value 列。Key 列有序可进行快速查找,Value 列可以按照具体聚合类型内部完成数据聚合。
在这里插入图片描述

2、Key 列
全局有序
排列,查询时方便快速定位查找。Doris 数据模型的一个显著特点是 Key 列全局唯一,因此存在相同 Key 值的不同 Value,则后面的数据与前面的数据自动做 ( SUM,MIN,MAX,REPLACE ) 等聚合处理。例如,下图中绿色方框中的两行,相同的 Key 值对应不同的 Value;因此,新的 Value 到达后,就会与先前的中间数据作 SUM 处理,得到最新的数据,不仅提升效率,还可提高数据处理的准确性。
在这里插入图片描述

2)按列存储

在 Doris 中,数据以表(Table)的形式进行逻辑上的描述。Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列指标列

1、Doris 的数据是按列存储的,每一列单独存放。
2、查询时,只访问查询涉及的,大量降低 I/O。
3、数据类型一致,方便压缩。
4、数据包建索引,数据即索引。
5、利用原始过滤条件以及 min、max 和 sum 等智能索引技术,将数据集查询范围尽可能地缩小,大大减少 I/O,提升查询效率。

3)物化视图

物化视图是提取某些维度的组合建立对用户透明的却有真实数据的视图表格。Doris 的物化视图可以保证用户在更新时,直接更新原始表,Doris 会保证原表、物化视图原子生效。在查询的时候用户也只需指定原始表,Doris 会根据查询的具体条件,选择适合的物化视图完成查询。通常用户可以通过物化视图功能完成以下两种功能:

1、更换索引列进行重排列
2、针对指定列做聚合查询

示例如下:
在这里插入图片描述

2.4、Doris 关键技术

1)数据可靠性

在这里插入图片描述

1、元数据使用 Memory+Checkpoint+Journal ,使用 BTBJE ( 类似于 Raft ) 协议实现高可用性和高可靠性。

2、Doris 内部自行管理数据的多副本和自动修复。保证数据的高可用、高可靠。在服务器宕机的情况下,服务依然可用,数据也不会丢失。

2)易运维

1、部署方便:Doris 部署无外部依赖,只需要部署 BE 和 IBE 即可搭建起一个集群。
2、操作方便:它支持 Online Schema Change(在线更改表模式( 加减列,创建 Rollup )) ,不会影响当前服务,不会阻塞读、写等操作;这种执行是异步的 ( 用户不需要一直盯在那里 );
3、副本自动均衡:传统数据库的扩(缩)容比较麻烦,有时甚至需要重做数据;而 Doris 数据库只需要一条 SQL ( 无须额外操作 ) 即可实现扩(缩)容。
4、内置监控:使用 Prometheus、Grafana 将监控项指标列出。

数据库同步操作和异步操作却别:

同步,是所有的操作都做完,才返回给用户结果;即写完数据库之后,再响应用户,用户体验不好;

异步,不用等所有操作等做完,就相应用户请求;即先相应用户请求,然后慢慢去写数据库,用户体验较好。缓存机制(也就是消息队列),就是异步操作的一个典型应用。

3)MySQL 兼容性

MySQL 的兼容性主要体现在以下两方面:

1、兼容 MySQL 的网络协议 ( MySQL Network Protocol )

2、兼容 MySQL 语法,使用 MySQL 语法可对 Doris 数据库进行查询;比如:MySQL 的调度服务器 Proxy,可以直接用作 Doris 的 Proxy。

3、Doris 的前端展示,可以使用 MySQL 专属展示器 Tableu。

4、Doris 与 R 语言可以实现无缝对接,用 R 语言可直接操作 Doris 数据库,进行数据分析、数据挖掘等工作。
在这里插入图片描述

4)支持 MPP

MPP 即 Massively Parallel Processing,大规模并行处理,即海量数据并发查询。比如下面的语句:

SELECT k1,SUM(v1) FROM A,B WHERE A.k2=B.k2 GROUP BY k1 ORDER BY SUM(v1)

上述语句包含了合并、聚合计算、排序等多种操作;在执行时,MPP 会将其拆分成多份,分布到每台机器执行,最后再将结果汇总。假如有10台机器,在大数据量下,这种查询执行方式可以使得查询性能达到10倍的提升。如下图所示:
在这里插入图片描述

三、部署配置

3.1、最低环境要求

CPU:2C(最低)8C(推荐)
内存:4G(最低)48G(推荐)
硬盘:100G(最低)400G(推荐),推荐使用 ext4 文件系统;FE的磁盘空间主要用于存储元数据,包括日志和图像。通常它的范围从几百 MB 到几 GB。而BE的磁盘空间主要用于存储用户数据。总磁盘空间按用户总数据*3(3份)计算。然后额外预留 40% 的空间用于后台压缩和一些中间数据存储。
平台:MacOS(Intel)、LinuxOS、Windows虚拟机
系统:CentOS(7.1及以上)、Ubuntu(16.04及以上)
软件:JDK(1.8及以上)、GCC(4.8.2及以上)

下表是官网推荐的生产环境配置:
在这里插入图片描述
环境网络要求:

在这里插入图片描述

其他注意事项及部署规划参考:

1、单台机器可以部署多个BE实例,但只能部署一个FE。如果需要三份数据,则每台机器至少需要一个 BE 实例(而不是每台机器三个 BE 实例)。多个FE服务器时钟必须一致(允许最大5秒时钟偏差);
2、测试环境也可以只用一个 BE 进行测试。在实际生产环境中,BE实例的数量直接决定了整体的查询延迟。
所有部署节点都关闭 Swap。
3、FE 节点数据至少为 1(1 个 Follower)。当部署一个 Follower 和一个 Observer 时,可以实现高读取可用性。当部署三个 Follower 时,可以实现读写高可用性(HA)。Followers 的数量必须是奇数,Observers 的数量是任意的。
4、当集群可用性要求较高时(例如提供在线服务),可以部署三个 Follower 和一到三个 Observer。对于线下业务,建议部署1个Follower和1-3个Observer。
5、通常我们推荐大约10到100台机器来充分发挥Doris的性能(其中3台部署FE(HA),其余部署BE);当然,Doris 的性能与节点的数量和配置呈正相关。最少四台机器(一台 FE,三台 BE,一台 BE 混合一台 Observer FE 提供元数据备份)和较低的配置,Doris 仍然可以流畅运行。部署多个 FE 实例时,请确保 FE 的 http 端口配置相同
6、如果 FE 和 BE 混用,要注意资源竞争,保证元数据目录和数据目录分配到不同的磁盘上。
7、Broker 是访问外部数据源的进程,例如 hdfs。通常,每台机器上都会部署一个代理实例;
8、在多网卡/docker环境下,因目前 Doris 不会自动识别可用 IP。所以我们必须通过FE和BE的priority_networks配置项强制指定正确的IP。配置项需要写在fe.conf和be.conf中。该配置项用于告诉进程在FE或BE启动时应该绑定哪个IP。如:priority_networks=10.1.3.0/24;注意:当配置了优先网络并启动了FE或BE时,只能保证FE或BE的IP绑定正确。在 ADD BACKEND 或 ADD FRONTEND 语句中,还需要指定 IP 匹配优先级网络配置,否则无法建立集群。如果之前已经绑定过,可DROP移除添加错误的 BE,并重新使用正确的 IP 来执行 ALTER SYSTEM ADD BACKEND “10.1.3.2:9050”;目前, Broker 的服务默认绑定到 0.0.0.0。只需使用 ADD BROKER 时配置正确的可访问代理 IP即可。
9、默认情况下,doris 区分大小写。如果需要不区分大小写的表名,则需要在集群初始化之前进行设置。集群初始化完成后无法更改表名区分大小写。配置参看Variable
10、FE配置文件fe.conf中的JAVA_OPTS默认为java最大堆内存为4GB,建议生产环境调整为8G以上。尤其集群方式部署时。

3.2、环境部署

1)部署前准备

vi /etc/security/limits.conf  //修改系统可打开/操作最大文件数

* soft nofile 65536
* hard nofile 65536

//配置Doris需要的环境变量
vim /etc/profile.d/doris.sh

export DORIS_HOME=/opt/doris
export PATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin
# save and source

source /etc/profile.d/doris.sh

//Doris的元数据要求时间精度小于5000ms,所以集群内所有机器需要同步时钟,避免时钟问题导致元数据不一致导致服务异常


//Linux swap分区会对Doris造成严重的性能问题,安装前需要禁用swap分区

2)软件下载安装

软件下载地址:https://doris.apache.org/zh-CN/downloads/downloads.html,目前最新版为1.0.0;

1》单机部署:

wget https://dist.apache.org/repos/dist/release/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-bin.tar.gz

tar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz
mv apache-doris-1.0.0-incubating-bin /opt/doris
cd /opt/doris

## 编辑配置前端配置文件,即 FE-Config
vi fe/conf/fe.conf
# Uncomment priority_networks and modify parameters
priority_networks = 127.0.0.0/24
# save and exit

## 配置后端,即BE
vi be/conf/be.conf
# Uncomment priority_networks and modify parameters
priority_networks = 127.0.0.0/24
# save and exit

#启动
start_fe.sh --daemon
start_be.sh --daemon

2》集群部署:

//1)FE前端部署,下载源码包,解压,其中,meta_dir目录是Metadata存储目录;默认值为 ${DORIS_HOME}/doris-meta。该目录需要手动创建。
wget https://www.apache.org/dyn/closer.cgi/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-src.tar.gz

3)验证

FE:浏览器输入http://fe_host:fe_http_port/api/bootstrap //返回 {“status”:“OK”,“msg”:“Success”}即表启动成功
BE:浏览器输入http://be_host:be_http_port/api/health //返回:{“status”: “OK”,“msg”: “To Be added”},则表示启动成功
Doris Web UI:http://FE_IP:FE_HTTP_PORT(默认8030),账号root,密码为空

4)使用mysql-client注册BE到FE

Doris 使用 MySQL 协议进行通信,用户可以通过 MySQL Client 或 MySQL JDBC 连接到 Doris 集群。选择 MySQL 客户端版本时,建议使用 5.1 之后的版本,因为 5.1 之前不支持超过 16 个字符的用户名。Doris SQL 语法基本遵循 MySQL 语法。注册执行以下命令:

mysql -h 127.0.0.1 -P 9030 -uroot
# Register BE
ALTER SYSTEM ADD BACKEND "127.0.0.1:9050";

#访问FE
mysql -h FE-host -P 9030 -u username -p password
set enable_profile=true; //启用FE report功能

更多sql使用参看:查询执行统计

四、配置文件说明

五、应用案例借鉴

在这里插入图片描述

5.1、Doris 在 Elasticsearch 的应用

我们知道,在处理大量数据时,全文查找会用到ES,然ES 的优点是索引,可支持多列索引,甚至可支持全文语义索引(如 term,match,fuzzy 等);然而其缺点是没有分布式计算引擎,不支持 join 等操作;对此,Palo 提供了丰富的 SQL 计算能力,以及分布式查询能力;然而其索引性能较低,不支持全文索引。而Doris 可分别借鉴 ES 和 Palo 的长处,支持 Elasticsearch 多表 Join 操作,同时引入 Elasticsearch 的语义搜索功能,扩充了 Doris 的查询能力。

示例:

1)建立一张 ES 的外部表。
在这里插入图片描述
2)在 ES 外部表中导入一些数据
在这里插入图片描述
3)使用和 ES 一样的搜索语句,进行全文检索查询;类似于下图这样的搜索语句,在 SQL 中比较难以表达,但是在 ES 中较容易实现。
在这里插入图片描述

5.2、与Kafka 消息队列配合使用

1)Doris 内部支持订阅 Kafka 数据流,实现直接对接 Kafka,创建如下sql:
在这里插入图片描述
2)用户数据源经 Kafka 消息队列收集后,可以依次进入到 Doris 中,通过 Doris 做报表展示和决策分析等工作。

在这里插入图片描述
3)方案优点

无需额外组件,用户可直接通过命令实现 Kafka 消息订阅。
精确传输,秒级延迟。
Doris 可自动感知 Kafka 中 partition 变化,合理调度并发导入。
在数据导入这一过程中,支持对 Kafka 原始数据做二次处理(如转换,过滤等)。

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/125291923