Doris简介、部署、功能介绍以及架构设计

1. Doris简介

Doris 中文官方文档:https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary

1.1 Doris概述

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 能够较好的满足报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用

Apache Doris 最早是诞生于百度广告报表业务的 Palo 项目,2017 年正式对外开源,2018 年 7 月由百度捐赠给 Apache 基金会进行孵化,之后在 Apache 导师的指导下由孵化器项目管理委员会成员进行孵化和运营。目前 Apache Doris 社区已经聚集了来自不同行业数百家企业的 400 余位贡献者,并且每月活跃贡献者人数也超过 100 位。 2022 年 6 月,Apache Doris 成功从 Apache 孵化器毕业,正式成为 Apache 顶级项目(Top-Level Project,TLP)

Apache Doris 如今在中国乃至全球范围内都拥有着广泛的用户群体,截止目前, Apache Doris 已经在全球超过 2000 家企业的生产环境中得到应用,在中国市值或估值排行前 50 的互联网公司中,有超过 80% 长期使用 Apache Doris,包括百度、美团、小米、京东、字节跳动、腾讯、网易、快手、微博、贝壳等。同时在一些传统行业如金融、能源、制造、电信等领域也有着丰富的应用

 

1.2 Doris使用场景

Doris数据库是一个分布式列式存储和查询系统,主要用于实时分析和查询海量数据。它适用于以下场景:

  1. 实时分析:Doris数据库可以快速查询和分析海量数据,支持实时查询和聚合操作,可以帮助企业快速做出决策并调整业务策略。
  2. 大数据仓库:Doris数据库可以作为企业的数据仓库,存储大规模的数据,并提供高效的查询和分析能力,帮助企业更好地理解和利用数据。
  3. 日志存储和分析:Doris数据库可以快速存储和分析实时生成的日志数据,支持实时查询和聚合操作,帮助企业及时发现和解决问题。
  4. 金融数据分析:Doris数据库可以存储和分析金融相关的大规模数据,如证券交易数据、客户信息等,帮助金融机构更好地理解市场趋势、客户需求等信息。

总之,Doris数据库适用于需要处理海量数据、需要实时查询和分析数据的场景。

 

1.3 Doris架构

Doris整体架构如下图所示,Doris 架构非常简单,只有两类进程

img

Frontend(FE)和 Backend(BE)这两类进程都是可以横向扩展的,单集群可以支持到数百台机器,数十 PB 的存储容量。并且这两类进程通过一致性协议来保证服务的高可用和数据的高可靠。这种高度集成的架构设计极大的降低了一款分布式系统的运维成本

除了

Doris借助MySQL协议,用户使用任意MySQL的ODBC/JDBC以及MySQL的客户端,都可以直接访问Doris

Broker 是 Doris 集群中一种可选进程,主要用于支持 Doris 读写远端存储上的文件和目录,如 HDFS、BOS 和 AFS 等

 

2. Doris安装和部署

2.1 Doris安装环境要求

2.1.1 Linux 操作系统版本需求

Linux 系统版本
CentOS7.1 及以上

2.1.2 软件需求

软件版本
Java1.8 及以上
GCC4.8.2 及以上

2.1.3 Linux文件系统

ext4和xfs文件系统均支持

2.1.4 机器配置( 生产环境 )

模块CPU内存磁盘网络实例数量(最低要求)
Frontend16核+64GB+SSD 或 RAID 卡,100GB+ *万兆网卡1-3 *
Backend16核+64GB+SSD 或 SATA,100G+ *万兆网卡3 *

如只是部署调试,熟悉了解或是简单测试环境,配置可以低

 

2.1.5 端口预留

实例名称端口名称默认端口通讯方向说明
BEbe_prot9060FE-->BEBE上thrift server的端口用于接收来自FE 的请求
BEwebserver_port8040BE<-->FEBE上的http server端口
BEheartbeat_service_port9050FE-->BEBE上心跳服务端口用于接收来自FE的心跳
BEbrpc_prot*8060FE<-->BEBE<-->BEBE上的brpc端口用于BE之间通信
FEhttp_port8030FE<-->FE用户<--> FEFE上的http_server端口
FErpc_port9020BE-->FEFE<-->FEFE上thirt server端口号
FEquery_port9030用户<--> FEFE上的mysql server端口
FEedit_log_port9010FE<-->FEFE上bdbje之间通信用的端口
Brokerbroker_ipc_port8000FE-->BROKERBE-->BROKERBroker上的thrift server用于接收请求

端口部署可以更改,表中为官方版本各组件的默认端口

 

2.1.6 部署常见的注意事项

(1)FE的磁盘空间主要用于存储元数据,包括日志和image。通常从几百MB到几个GB不等。

(2)BE的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量* 3(3副本)计算,然后再预留额外40%的空间用作后台compaction以及一些中间数据的存放。

(3)一台机器上可以部署多个BE实例,但是只能部署一个 FE。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个BE实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)

(4)测试环境也可以仅适用一个BE进行测试。实际生产环境,BE实例数量直接决定了整体查询延迟。

(5)所有部署节点关闭Swap。

(6)FE节点数据至少为1(1个Follower)。当部署1个Follower和1个Observer时,可以实现读高可用。当部署3个Follower时,可以实现读写高可用(HA)。

(7)Follower的数量必须为奇数,Observer 数量随意。

(8)根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署3个 Follower和1-3个Observer。如果是离线业务,建议部署1个Follower和1-3个Observer。

(9)Broker是用于访问外部数据源(如HDFS)的进程。通常,在每台机器上部署一个 broker实例即可。

 

2.2 Doris集群部署

2.2.1 机器规划

机器1: hdt-dmcp-ops01机器2: hdt-dmcp-ops02机器3: hdt-dmcp-ops03机器4: hdt-dmcp-ops04机器5: hdt-dmcp-ops05
FE(LEADER)FE(FOLLOWER)FE(OBSERVER)FE扩容使用FE扩容使用
BEBEBEBE扩容使用BE扩容使用

生产环境建议 FE 和 BE 分开

2.2.2 安装包准备

官方下载地址:https://doris.apache.org/download

注意:查看服务器是否支持 CPU Model :avx2

如果CPU不支持avx2指令集,请选择无avx2版本。您可以通过cat /proc/cpuinfo检查是否支持。avx2指令将提高诸如布隆过滤器之类的数据结构的计算效率

支持avx2 可以下载X86( avx2 ) , 不支持avx2 可以下载X86( no avx2 )

lscpu

2.2.3 下载安装包

2.2.4 安装Java和gcc环境

因java和gcc都为常用环境,如没有需自行安装

2.2.5 设置系统文件句柄数和内核参数优化

在操作系统中,每个进程都有一个打开文件句柄的限制,它限制了进程能够同时打开的文件数。这个限制对于一些需要同时处理大量文件的应用程序来说可能会成为瓶颈。因此,可以通过修改系统最大打开文件句柄数来提高应用程序的性能。

具体来说,增加最大打开文件句柄数可以:

  1. 提高服务器的并发性能:如果你的服务器需要同时处理大量的网络连接和文件 I/O 操作,那么增加最大打开文件句柄数可以提高服务器的并发性能,从而降低响应时间和延迟。
  2. 提高数据库性能:一些数据库软件如 MySQL,需要在处理大量的数据时打开大量的文件句柄,增加最大打开文件句柄数可以提高数据库的性能。
  3. 解决程序打开文件失败的问题:如果你的程序在运行时出现 "too many open files" 的错误,那么增加最大打开文件句柄数可以解决这个问题。

 

2.2.6 时间同步

Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常

2.2.7 解压安装

2.2.8 配置FE

注意:

http_port 默认为8030端口,可以不改;因为8030端口也是Hadoop的ResourceManager端口,是Hadoop的常用组件资源管理器,所以我这里更换了一个8130端口避免冲突

priority_networks 换成本机ip/24

meta_dir 换成本地存储元数据路径

2.2.9 启动FE

2.2.10 FE Web 登录页面

访问地址: http://hdt-dmcp-ops01:8130/login 初始用户: root 密码:无

2.2.11 配置 BE

注意:

  • storage_root_path

Doris的storage_root_path参数是指数据存储的根目录,它是在Doris集群的配置文件中进行设置的。该参数指定了Doris存储数据的根目录,包括了Doris的元数据、数据块、日志等。在Doris集群中,不同的节点可以通过配置不同的storage_root_path参数来指定存储数据的不同目录。

需要注意的是,storage_root_path参数只需要在集群初始化时设置一次,一旦集群启动后,不应该再修改该参数。如果需要更改存储路径,应该通过添加新的磁盘来扩展存储空间

storage_root_path可以通过路径区别存储目录的介质,HDD或SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开,如:

storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris

说明:

/home/disk1/doris.HDD,50,表示存储限制为50GB,HDD;

/home/disk2/doris.SSD,10,存储限制为10GB,SSD;

/home/disk2/doris,存储限制为磁盘最大容量,默认为HDD

  • priority_networks 换成本机ip/24
  • webserver_port = 8043

Hadoop的8040端口是ResourceManager Web应用程序的默认端口,为避免冲突,改成了8043

2.2.12 分发BE和BE存储目录并配置

2.2.13 添加 BE

BE节点需要先在FE中添加,才可加入集群。可以使用mysql-client连接到FE

注意:

这里需要有MySQL客户端连接MySQL的client,安装忽略,yum安装mysqld或者mariadb均可

FE 默认没有密码

注意:

这里密码改过以后,那FE的前端访问页面的ROOT密码,就是改后的,注意下次登录时需要输入对应的新密码

注意:

这时的BE已经添加,但是状态是异常的(Alive: false),因为BE服务还未启动

2.2.14 启动 BE

此时的 Alive: true ,表示BE已经正常

 

3. Doris扩容和缩容

3.1 FE 扩容和缩容

可以通过将FE扩容至3个以上节点(必须是奇数)来实现FE的高可用

3.1.1 FE扩容

从查询结果看,目前只有一个 FE,Role 为 FOLLOWER

FE分为Leader,Follower和Observer三种角色。 默认一个集群只能有一个Leader,可以有多个Follower和Observer。其中Leader和Follower组成一个Paxos选择组,如果 Leader宕机,则剩下的Follower 会自动选出新的Leader,保证写入高可用。Observer 同步 Leader的数据,但是不参加选举。 ​ 如果只部署一个FE,则FE 默认就是Leader。在此基础上,可以添加若干Follower和 Observer。

此时只是加入角色,各 FE 节点服务还未部署

分发 FE目录

新 FE 节点创建元数据目录

修改配置文件(fe.conf)

启动新的 FE 节点

注意:

扩容的节点第一次启动时,启动命令需要添加参 --helper leader的IP:port,第一次需要成功启动加入到集群后,后续就不需要helper参数了

查看 FE 状态

也可以在WEB-UI上查看验证,使用新增加的ops04尝试访问

 

3.1.1 FE缩容

删除只需执行如下命令即可:

注意:

删除 Follower FE 时,确保最终剩余的 Follower(包括 Leader)节点为奇数的合理状态

 

3.2 BE扩容和缩容

3.2.1 BE扩容

BE扩容和第一次部署添加 BE 方式一样

在MySQL命令行,通过 ALTER SYSTEM ADD BACKEND 命令增加BE节点

此时已经可以看到新加入集群的 BE 节点信息

也可以在WEB-UI界面查看所有backends情况

 

3.2.2 BE缩容

使用 DECOMMISSION 方式删除BE节点

语法:ALTER SYSTEM DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";

示例:ALTER SYSTEM DECOMMISSION BACKEND "hdt-dmcp-ops05:9050";

注意:

  • 该命令用于安全删除BE节点。命令下发后,Doris 会尝试将该BE上的数据向其他BE节点迁移,当所有数据都迁移完成后,Doris会自动删除该节点。
  • 该命令是一个异步操作。执行后,可以通过 SHOW PROC '/backends'; 看到该 BE 节点的isDecommission状态为true。表示该节点正在进行下线。
  • 该命令不一定执行成功。比如剩余BE存储空间不足以容纳下线BE上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且BE会一直处于 isDecommission为true的状态。
  • DECOMMISSION的进度,可以通过SHOW PROC '/backends'; 中的TabletNum查看,如果正在进行,TabletNum将不断减少。
  • 该操作可以通过如下命令取消:

CANCEL DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";

  • 如执行取消命令后,该BE上的数据将维持当前剩余的数据量。后续Doris重新进行负载均衡

 

除了使用DECOMMISSION方式,还可以直接使用 DROP 方式删除 BE 节点,但生产环境不建议使用

示例:ALTER SYSTEM DROP BACKEND "be_host:be_heartbeat_service_port";

DROP BACKEND 会直接删除该BE,并且其上的数据将不能再恢复。方式比较暴力,所以不推荐使用 DROP BACKEND 这种方式删除BE节点。当执行这个语句时,也会有对应的防误操作提示信息

 

4. Doris 基本概念与介绍

4.1 Doris基本概念

4.1.1 Row & Column

一张表包括行(Row)和列(Column):

Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列和指标列

Doris数据库是一个分布式的列式存储引擎,它的数据模型是基于列式存储的。在Doris数据库中,一个Row就是一个数据行,它由多个Column组成。每个Column则代表这个数据行中的一个属性或者字段。因此,我们也可以将一个Row看做是一个数据表中的一行数据,而Column则对应数据表中的列。

在Doris数据库中,由于数据是以列式存储的,因此在查询时可以只读取需要的Column数据,而不用读取整个Row数据,这就大大提高了查询性能。同时,Doris还支持Column的压缩和编码,可以进一步减小存储空间,提高数据的存储和查询效率。

总之,在Doris数据库中,Row和Column是基本的数据结构,Row代表一个数据行,Column代表一个属性或字段,这种设计使得Doris能够高效地存储和查询海量数据。

 

4.1.2 Tablet & Partition

在Doris的存储引擎中,用户数据首先被划分成若干个分区(Partition),划分的规则通常是按照用户指定的分区列进行范围划分,比如按时间划分。而在每个分区内,数据被进一步的按照Hash的方式分桶,分桶的规则是要找用户指定的分桶列的值进行Hash后分桶。每个分桶就是一个数据分片(Tablet),也是数据划分的最小逻辑单元。

Tablet之间的数据是没有交集的,独立存储的。Tablet也是数据移动、复制等操作的最小物理存储单元。

Partition可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行,例如,可以按照数据的时间戳、地理位置、业务类型等进行分区,以保证数据的高效存储和查询。每个Partition都包含一定数量的数据块(Data Block),一个数据块包含一段连续的数据和对应的元数据信息,用于支持查询和数据的压缩存储等功能。

总之,Doris的Tablet和Partition是实现高性能、高可用的分布式存储和计算的关键组件,通过合理的划分和分配,可以充分利用计算和存储资源,提高数据的利用率和系统的性能

4.2 Doris字段类型

TINYINT1字节范围:-2^7 + 1 ~ 2^7 - 1
SMALLINT2字节范围:-2^15 + 1 ~ 2^15 - 1
INT4字节范围:-2^31 + 1 ~ 2^31 - 1
BIGINT8字节范围:-2^63 + 1 ~ 2^63 - 1
LARGEINT16字节范围:-2^127 + 1 ~ 2^127 - 1
FLOAT4字节支持科学计数法
DOUBLE12字节支持科学计数法
DECIMAL[(precision, scale)]16字节保证精度的小数类型。默认是 DECIMAL(10, 0)precision: 1 ~ 27scale: 0 ~ 9其中整数部分为 1 ~ 18不支持科学计数法
DATE3字节范围:0000-01-01 ~ 9999-12-31
DATETIME8字节范围:0000-01-01 00:00:00 ~ 9999-12-31 23:59:59
CHAR[(length)] 定长字符串。长度范围:1 ~ 255。默认为1
VARCHAR[(length)] 变长字符串。长度范围:1 ~ 65533
BOOLEAN 与TINYINT一样,0代表false,1代表true
HLL1~16385个字节hll列类型,不需要指定长度和默认值、长度根据数据的聚合程度系统内控制,并且HLL列只能通过配套的hll_union_agg、Hll_cardinality、hll_hash进行查询或使用
BITMAP bitmap列类型,不需要指定长度和默认值。表示整型的集合,元素最大支持到2^64 - 1
STRING 变长字符串,0.15版本支持,最大支持2147483643 字节(2GB-4),长度还受be 配置string_type_soft_limit, 实际能存储的最大长度取两者最小值。只能用在value 列,不能用在 key 列和分区、分桶列

 

4.3 Doris数据模型

Doris 的数据模型主要分为3类

 

建测试库

 

4.3.1 Aggregate使用示例

可以观察结果针对同一个user_id进行的聚合结果

根据建表语句中AGGREGATE KEY(user_id,date,city,age,sex),涉及的字段信息都相同进行聚合,如有不同不触发聚合

10000信息相同进行聚合,而10004灌入日期时间就已经不同,不进行聚合

 

4.3.2 Unique 使用示例

可以观察结果针对同一个user_id进行的聚合结果

根据建表语句中UNIQUE KEY(user_id, username),涉及的字段信息都相同进行去重,如有不同不触发去重

 

注意:

Unique 模型完全可以用聚合模型中的 REPLACE 方式替代。其内部的实现方式和数据存储方式也完全一样

简单的理解就是 Unique 能实现的功能都可以用 Aggregate 实现

补充示例:

 

4.3.3 Duplicate 使用示例

Duplicate 这种数据模型区别于 Aggregate 和 Unique 模型。数据完全按照导入文件中的数据进行存储,不会有任何聚合。即使两行数据完全相同,也都会保留。 而在建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照那些列进行排序。

在 DUPLICATE KEY 的选择上,建议适当的选择前 2-4 列就可以,这种数据模型适用于既没有聚合需求,又没有主键唯一性约束的原始数据的存储。

 

4.4 Doris web-ui使用

4.5 Doris丰富的建表示例

可以查看建表的各类示例:

例如帮助中有非常丰富的不同场景的建表示例( 都可以通过HELP CREATE TABLE;直接查看获取 ):

  1. 创建一个 olap 表,使用 HASH 分桶,使用列存,相同key的记录进行聚合
  2. 创建一个 olap 表,使用 Hash 分桶,使用列存,相同key的记录进行覆盖,
  3. 创建一个 olap 表,使用 Range 分区,使用Hash分桶,默认使用列存,
  4. 创建一个 olap 表,使用 List 分区,使用Hash分桶,默认使用列存,
  5. 创建一个 mysql 表
  6. 创建一个数据文件存储在HDFS上的 broker 外部表, 数据使用 "|" 分割,"\n" 换行
  7. 创建一张含有HLL列的表
  8. 创建一张含有BITMAP_UNION聚合类型的表(v1和v2列的原始数据类型必须是TINYINT,SMALLINT,INT)
  9. 创建两张支持Colocate Join的表t1 和t2
  10. 创建一个数据文件存储在BOS上的 broker 外部表
  11. 创建一个带有bitmap 索引的表
  12. 创建一个动态分区表(需要在FE配置中开启动态分区功能),该表每天提前创建3天的分区,并删除3天前的分区。例如今天为2020-01-08,则会创建分区名为p20200108, p20200109,
  13. 创建一个带有rollup索引的表
  14. 创建一个内存表
  15. 创建一个hive外部表
  16. 通过 replication_allocation 指定表的副本分布
  17. 创建一个 Iceberg 外表