Apache Doris
Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。
基于此,Apache Doris 能够较好的满足报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等使用场景,用户可以在此之上构建用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
- Doris 采用列式存储,按列进行数据的编码压缩和读取,能够实现极高的压缩比,适合分析工作负载,支持高度压缩和查询性能优化。
- Doris 采用 MySQL 协议,高度兼容 MySQL 语法,支持标准 SQL,用户可以通过各类客户端工具来访问 Doris,并支持与 BI 工具的无缝对接。
MMP架构
MPP,全称为 Massively Parallel Processor,翻译过来就是大规模并行处理。MPP系统是由许多松耦合的处理单元组成的(要注意的是这里指的是处理单元而不是处理器)。
每个处理单元内的CPU都有自己私有的资源,如总线,内存,硬盘等,且都有操作系统和管理数据库的实例复本。
这种结构最大的特点在于不共享资源(share-nothing)。
- Share Nothing、节点之间数据不共享,只有通过网络连接实现的协同
- 每个节点有独立的存储和内存
- 数据根据某种规则(如Hash)散布到各个节点
- 计算任务也是会发布到各个节点并行执行,最后再将结果聚合到整体返回
- 用户使用时会看做整体
- MPP数据库(如GreePlum)往往优先考虑C一致性,然后是A可用性,最后考虑P分区容忍
- MPP架构目前被并行数据库广泛采用,一般通过scan、sort和merge等操作符实时返回查询结果
技术概述
Doris 整体架构如下图所示,Doris 架构非常简单,只有两类进程
- Frontend(FE),主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作。
- Backend(BE),主要负责数据存储、查询计划的执行。
这两类进程都是可以横向扩展的,单集群可以支持到数百台机器,数十 PB 的存储容量。并且这两类进程通过一致性协议来保证服务的高可用和数据的高可靠。这种高度集成的架构设计极大的降低了一款分布式系统的运维成本。
Doris 部署
https://doris.apache.org/zh-CN/docs/1.2/install/standard-deployment
部署前
Frontend(FE)
- FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个 GB 不等。
- BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量 * 3(3副本)计算,然后再预留额外 40% 的空间用作后台 compaction 以及一些中间数据的存放。
- 一台机器上可以部署多个 BE 实例,但是只能部署一个 FE。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)
- 测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。
- 所有部署节点关闭 Swap。
- FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower)。
- FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
- Follower 的数量必须为奇数,Observer 数量随意。
- 根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。
Backend(BE)
一台机器上可以部署多个 BE 实例,但是只能部署一个 FE。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)
这两类进程都是可以横向扩展的,单集群可以支持到数百台机器,数十 PB 的存储容量。
端口说明
Doris 各个实例直接通过网络进行通讯。以下表格展示了所有需要的端口
| 实例名称 | 端口名称 | 默认端口 | 通讯方向 | 说明 |
|---|---|---|---|---|
| BE | be_port | 9060 | FE ⇒ BE | BE 上 thrift server 的端口,用于接收来自 FE 的请求 |
| BE | webserver_port | 8040 | BE ⇐> BE | BE 上的 http server 的端口 |
| BE | heartbeat_service_port | 9050 | FE ⇒ BE | BE 上心跳服务端口(thrift),用于接收来自 FE 的心跳 |
| BE | brpc_port | 8060 | FE ⇐> BE, BE ⇐> BE | BE 上的 brpc 端口,用于 BE 之间通讯 |
| FE | http_port | 8030 | FE ⇐> FE,用户 ⇐> FE | FE 上的 http server 端口 |
| FE | rpc_port | 9020 | BE ⇒ FE, FE ⇐> FE | FE 上的 thrift server 端口,每个fe的配置需要保持一致 |
| FE | query_port | 9030 | 用户 ⇐> FE | FE 上的 mysql server 端口 |
| FE | edit_log_port | 9010 | FE ⇐> FE | FE 上的 bdbje 之间通信用的端口 |
| Broker | broker_ipc_port | 8000 | FE ⇒ Broker, BE ⇒ Broker | Broker 上的 thrift server,用于接收请求 |
当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。 部署前请确保各个端口在应有方向上的访问权限。