数据库之Doris DB详细讲解

1 Doris

1.1 简介

1.1.1 引言

在大数据时代,企业亟需能够同时应对海量数据和实时分析挑战的引擎。Apache Doris(原 Palo) 应运而生,它是一个现代化、高性能的 MPP(大规模并行处理)关系型分析型数据库 核心目标是为用户提供对超大规模数据集的毫秒级交互式查询体验。
简单来说,它主要用于海量数据的快速分析和报表查询,而不是处理日常的事务(比如银行转账、电商下单等)。
它最初由百度开发,后来贡献给了 Apache 基金会,现在是一个顶级的开源项目,全称是 Apache Doris

主要应用场景:

  • 实时数据看板和报表:为运营、管理层提供实时的业务指标(如GMV、日活、订单量等)查询和展示。
  • 用户行为分析:快速分析海量的用户日志,进行漏斗分析、留存分析、路径分析等。
  • 日志存储与分析:替代传统的 ELK 方案,处理大规模的结构化日志,查询性能更强,成本更低。
  • 统一数据查询网关:通过“湖仓一体”的能力,用一个系统同时查询数据湖和历史数据仓库中的数据。

1.1.2 优势

相较于同类产品(如 ClickHouse、StarRocks、Hadoop生态组件),Doris 的核心优势在于:

  • 极简架构:部署运维简单,无需复杂组件栈,开箱即用;
  • 卓越的实时分析能力:独特的数据模型支持高吞吐数据摄入与秒级更新,保障查询即时性;
  • 优异的易用性:兼容 MySQL 协议,提供类 SQL 语法,便于开发和集成;
  • 高并发优势:优化设计支撑数千 QPS 高并发查询,显著优于一些竞品;
  • 统一分析平台:单一系统处理实时、离线、日志及标准结构化数据的即席查询和报表分析。

1.2 部署

1.2.1 docker部署

1.2.1.1 下载并启动

# 下载脚本
https://doris.apache.org/files/start-doris.sh
# 赋予执行权限
chmod 755 start-doris.sh
# 启动,-v 表示指定启动哪个版本
bash start-doris.sh -v 3.0.4

启动后日志信息如下图


image.png

1.2.1.2 检查状态

## 检查 FE 状态,确定 Join 与 Alive 列均为 true
mysql -uroot -P9030 -h127.0.0.1 -e 'SELECT `host`, `join`, `alive` FROM frontends()'
image.png
## 检查 BE 状态,确定 Alive 列为 1
mysql -uroot -P9030 -h127.0.0.1 -e 'SELECT `host`, `alive` FROM backends()'
image.png

1.2.2 本地部署方式

环境建议:

  • 操作系统: 推荐使用 Ubuntu 等 AMD/ARM 主流 Linux 环境。
  • Java 环境: 建议使用 Java 17 运行环境。
  • 用户权限: 建议在 Linux 上新建一个 Doris 用户,避免使用 root 用户进行操作。

1.2.2.1 前期准备

修改系统最大打开文件句柄数
vi /etc/security/limits.conf 
* soft nofile 1000000
* hard nofile 1000000

修改完文件句柄数配置后,执行以下命令使配置生效(临时生效,但配合上面可以永久生效)
ulimit -n 1000000
修改虚拟内存区域
cat >> /etc/sysctl.conf << EOF
> vm.max_map_count = 2000000
> EOF

执行以下命令使配置生效
sudo sysctl -p

1.2.2.2 下载JDK17

# jdk17 下载地址
https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jdk/x64/linux/OpenJDK17U-jdk_x64_linux_hotspot_17.0.16_8.tar.gz
# 解压
tar -zxvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.16_8.tar.gz -C /usr/local/
# 重命名
mv jdk-17.0.16+8/ jdk17

1.2.2.3 下载Doris安装包

# doris 下载地址
https://doris.apache.org/zh-CN/download

# 运行以下命令,有输出结果,及表示机器支持 AVX2 指令集
# 建议选择支持 AVX2 指令集的机器,以利用 AVX2 的向量化能力实现查询向量化加速
cat /proc/cpuinfo | grep avx2

解压安装包

tar -zxvf apache-doris-3.0.6.2-bin-x64.tar.gz -C /ops/app/
mv /ops/app/apache-doris-3.0.6.2-bin-x64/ /ops/app/doris3.0.6.2

1.2.2.4 安装 fe

vim /ops/app/doris3.0.6.2/fe/conf/fe.conf
## 指定 Java 环境
JAVA_HOME=/usr/local/jdk17

# 指定 FE 监听 IP 的 CIDR 网段,32 表示子网掩码位数
priority_networks=127.0.0.1/32

## 启动
/ops/app/doris3.0.6.2/fe/bin/start_fe.sh --daemon

## 检查 FE 状态,确定 Join 与 Alive 列均为 true
mysql -uroot -P9030 -h127.0.0.1 -e 'SELECT `host`, `join`, `alive` FROM frontends()'

+-----------+------+-------+
| host      | join | alive |
+-----------+------+-------+
| 127.0.0.1 | true | true  |
+-----------+------+-------+

1.2.2.5 安装 be

vim /ops/app/doris3.0.6.2/be/conf/be.conf

## 指定 Java 环境
JAVA_HOME=/usr/local/jdk17

# 指定 BE 监听 IP 的 CIDR 网段,32 表示子网掩码位数
priority_networks=127.0.0.1/32

## 启动
/ops/app/doris3.0.6.2/be/bin/start_be.sh --daemon

## 检查 BE 状态,确定 Alive 列为 true
mysql -uroot -P9030 -h127.0.0.1 -e 'SELECT `host`, `alive` FROM backends()'

+-----------+-------+
| host      | alive |
+-----------+-------+
| 127.0.0.1 |     1 |
+-----------+-------+

启动be时如果提示

Disable swap memory before starting be

执行以下命令,临时禁用交换内存:

sudo swapoff -a

1.2.2.6 修改密码

默认root账号密码为空,如果想要修改密码执行以下命令

## 进入客户端
mysql -uroot -P9030 -h127.0.0.1

## 修改当前用户密码
SET PASSWORD = PASSWORD('123456')

## 修改指定用户密码
SET PASSWORD FOR 'jack'@'192.%' = PASSWORD('123456')

1.3 查询建表操作

1.3.1 连接Doris客户端

# 使用 MySQL 客户端连接, -P 表示端口,默认root账号密码为空
mysql -uroot -P9030 -h127.0.0.1
image.png

1.3.2 建库建表

# 创建数据库与测试表
create database demo;

use demo; 
create table mytable
(
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.05",    
    k3 CHAR(10) COMMENT "string column",    
    k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
) 
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 1;

这里需要注意如果执行以上脚本报错,表示集群只有一个可用 Backend 节点,但建表时默认配置(replication_num)要求的副本数是 3:

ERROR 1105 (HY000): errCode = 2, detailMessage = replication num should be less than the number of available backends. replication num is 3, available backend num is 1

解决办法是在建表语句加入一行代码:

CREATE TABLE mytable (
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.05",    
    k3 CHAR(10) COMMENT "string column",    
    k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
) 
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ( 
    "replication_num" = "1"  -- 设置副本数为 1
);

插入测试数据

insert into mytable values
(1,0.14,'a1',20),
(2,1.04,'b2',21),
(3,3.14,'c3',22),
(4,4.35,'d4',23);

1.3.3 常用命令

## 切换Catalog
switch <catalog名>;

## 删除Catalog
drop catalog <catalog名>;

## 查询mysql数据库
show databases;

## 切换到指定数据库
use <数据库名>;

## 查询数据库表
show tables;

1.4 be和fe

Doris 采用了一种非常经典且简洁的主从架构(Master-Slave),主要由 Frontend(FE)Backend(BE) 两类进程组成。

1.4.1 Frontend (FE) 调度中心

FEDoris 的元数据管理节点和查询协调器,相当于集群的“大脑”。一个集群通常有1个主FE(Leader)和多个 follower(及observer)FE组成,通过类Paxos的BDB JE协议实现高可用。

主要职责:

  • 元数据管理:存储和管理整个集群的元数据,包括:
    • 数据库、表的定义(表结构、分区、分桶信息)。
    • 数据分片(Tablet)的分布位置、副本信息。
    • 集群节点信息。
  • 查询协调:
    • 接收并解析客户端发送的SQL请求。
    • 生成并优化分布式执行计划(查询计划)。
    • 将执行计划分发给相关的BE节点执行。
    • 汇总各个BE返回的中间计算结果,生成最终结果返回给客户端。
  • 用户权限管理:管理账号与授权。
  • 高可用:主FE负责写入元数据,并同步给Follower FE。如果主FE宕机,Follower会自动选举出新的主FE。

1.4.2 Backend (BE)

BE是Doris的数据存储和计算节点,相当于集群的“劳动力”。一个集群通常包含多个BE节点来实现横向扩展和高可用。

主要职责:

  • 数据存储:负责存储实际的表数据。数据被水平分割成多个分片(Tablet),每个Tablet会有多个副本,分布在不同BE上。
  • 查询执行:
    • 接收FE下发的查询计划片段(Fragment)。
    • 在本地的数据分片上执行扫描、聚合、排序等计算任务。
    • 将中间计算结果返回给FE或其他BE。
  • 数据写入与 compaction:
    • 负责处理数据导入(Insert, Broker Load, Stream Load等)请求,将数据写入成为特定格式(如Segment文件)。
    • 定期进行Compaction操作,将小的数据文件合并成大的文件,优化查询性能。

1.4.3 Doris Web UI

访问fe的web ui,浏览器输入地址:http://127.0.0.1:8030
默认账号:root
默认密码:空

image.png

客户端的登录账号和密码与Doris Web UI的登录账号和密码是一致的,如果客户端修改了密码,登录Doris Web UI时也要更新账号密码。
fe可视化界面主要功能是在Playground上执行一些数据库命令。


image.png

访问be的web ui,浏览器输入地址:http://127.0.0.1:8040
be 可视化界面主要用于查看一些配置信息。


image.png

需要注意的是,Playground 中执行和具体数据库/表没有关系的语句,务必在左侧库栏里随意选择一个数据库,才能执行成功;另外,当前还不能在Playground 中执行SET类型的SQL语句。

1.5 MySQL 源

1.5.1 简介

创建 MySQL Catalog 相当于在 Doris 内部为远程的 MySQL 数据库建立了一个“快捷方式”或“映射”。之后,就可以像查询本地 Doris 表一样,直接查询和关联 MySQL 数据库中的表,而无需进行繁琐的数据导入。

其核心价值体现在:

  • 数据虚拟化与联邦查询
    • 不需要先将 MySQL 中的数据通过 INSERT INTO 或 datax 等工具导入到 Doris 中。
    • 可以直接使用 SELECT * FROM mysql_catalog.db.table ... 进行实时查询,Doris 会自动将查询转换为 MySQL 的 SQL 语句,发送到 MySQL 执行并获取结果。
    • 可以实现 Doris 本地表 和 MySQL 远程表 进行 JOIN 等关联查询,将低速的明细数据放在 MySQL,将高速的聚合数据放在 Doris,实现冷热数据分离与联合分析。
  • 简化技术架构
    对于需要同时分析 Doris 和 MySQL 中数据的业务,无需再开发复杂的数据同步管道,降低了架构复杂度和维护成本。
  • 实时数据访问
    查询到的永远是最新的数据,没有导入延迟。非常适合查询低频变更的维表、配置表,或者对实时性要求极高的少量明细数据。
  • 权限隔离
    可以通过在 MySQL 侧配置账号权限,来控制 Doris 只能访问特定的数据库和表,保证数据安全。

需要注意的局限性:

  • 性能:查询性能取决于 MySQL 服务器的性能和网络延迟。不适合用于对 MySQL 大表进行全表扫描等复杂聚合查询,这会给 MySQL 带来巨大压力。最佳实践是让 Doris 处理大量数据的计算和聚合,让 MySQL 处理其擅长的点查或小范围扫描。
  • 功能:并非所有的 SQL 函数和下推优化都支持,复杂查询可能无法完美下推。

1.5.1 MySQL驱动

首先需要在Docker容器中将MySQL的驱动包放进去,Docker容器包括be和fe两个。

# 在be容器中创建目录
docker exec doris_be_1 mkdir -p /opt/apache-doris/be/jdbc_drivers
# 将宿主机中的驱动包拷贝到be容器中,<be容器ID>通过 docker ps 命令查看
docker cp /ops/app/mysql-connector-java-8.0.19.jar <be容器ID>:/opt/apache-doris/be/jdbc_drivers/
# 在fe容器中创建目录
docker exec doris_fe_1 mkdir -p /opt/apache-doris/fe/jdbc_drivers
# 将宿主机中的驱动包拷贝到fe容器中,<fe容器ID>通过 docker ps 命令查看
docker cp /ops/app/mysql-connector-java-8.0.19.jar <fe容器ID>:/opt/apache-doris/fe/jdbc_drivers/

同理,如果是本地部署,也需要将驱动包拷贝至以上路径

# be
mkdir /ops/app/doris3.0.6.2/be/jdbc_drivers/
cp /ops/app/mysql-connector-java-8.0.19.jar /ops/app/doris3.0.6.2/be/jdbc_drivers/
# fe
mkdir /ops/app/doris3.0.6.2/fe/jdbc_drivers/
cp /ops/app/mysql-connector-java-8.0.19.jar /ops/app/doris3.0.6.2/fe/jdbc_drivers/

1.5.2 创建MySQL Catalog

以下是创建catalog的模板,其中driver_url指向的是/opt/apache-doris/be/jdbc_drivers和/opt/apache-doris/fe/jdbc_drivers两个目录,mysql-connector-java-8.0.19.jar必须和包名保持一致。

# 进入客户端
mysql -uroot -P9030 -h127.0.0.1

# 创建Catalog
CREATE CATALOG mysql_catalog properties(
    'type' = 'jdbc',
    'user' = 'root',
    'password' = '123456',
    'jdbc_url' = 'jdbc:mysql://host:3306/mysql_db',
    'driver_url' = 'file:///opt/apache-doris/fe/jdbc_drivers/mysql-connector-java-8.0.19.jar',
    'driver_class' = 'com.mysql.cj.jdbc.Driver'
);

# 查询Catalog 
show catalogs;

1.6 可否用doris替换elastic来存储日志

答案是:可以,并且在很多场景下,Doris 相比 Elasticsearch 有显著优势,但它并不适合所有日志相关的用例。

Doris 近年来确实成为了替代 Elasticsearch 进行日志存储与分析的一个热门选择,尤其是在需要高性能、低成本、对 SQL 和 BI 工具支持友好的场景下。

Doris 的优势(为什么适合替换):

  • 极高的查询性能(尤其聚合分析)
    当需要分析海量日志,计算各类指标(如:不同错误码的数量、API 接口的 95 分位响应时间、按小时的流量统计)时,DorisMPP 架构和列式存储优势巨大,查询速度通常比 ES 快一个数量级(数秒 vs 数十秒甚至分钟级)。
  • 更低的存储成本
    Doris 采用更高比例的压缩算法(如 ZSTD),其列式存储本身也比 ES 的行列混合存储压缩得更好。这意味着存储相同数量的日志数据,Doris 所占用的磁盘空间通常更少,成本更低。
  • 无缝的 BI 集成与标准 SQL 支持
    • Doris 100% 兼容 MySQL 协议,支持标准 SQL。这意味着任何支持 MySQL 的 BI 工具(如 Tableau, FineBI, Superset)、SQL 客户端都能直接、无缝地连接至 Doris 进行日志分析,学习成本和开发成本极低。
    • 相比之下,ES 的 SQL 功能是后期增加的,有时需要翻译为 DSL,功能和性能上可能存在限制,对分析师和开发人员不如原生 SQL 友好。
  • 架构简单,运维复杂度低
    • Doris 的架构只有 FE(Frontend)和 BE(Backend)两种角色,管理起来相对简单。
    • ES 的架构涉及 Master、Data、Ingest、Coordinating 等节点,角色更多,配置和调优相对复杂,对运维团队的要求更高。
  • 强大的预聚合能力(Rollup)
    对于需要频繁计算的固定报表(如日报、周报),可以在 Doris 中创建 Rollup 物化视图,数据导入时自动预计算聚合结果。查询时直接命中预计算的结果,速度极快。这是 ES 不具备的强大功能。

Elasticsearch 的优势(Doris 的不足):

  • 全文检索能力
    • 这是最核心的区别。ES 本质是一个搜索引擎,其强项在于复杂的全文检索、模糊匹配、分词、高亮显示。例如:搜索包含特定关键字“NullPointerException”且不包含“test”目录下的日志。
    • Doris 的强项是分析,其文本搜索能力仅限于 LIKEMATCH 等简单匹配,在复杂文本查询场景下远不如 ES 强大和灵活。
  • 数据写入和实时性
    • ES 的写入和索引几乎是实时的(1 秒后可查),非常适合需要极低写入延迟的日志流场景。
    • Doris 的写入虽然也支持实时流式导入,但通常建议微批处理(比如每分钟一批)来获得更好的吞吐量和性能。实时性上略逊于 ES。
  • 生态工具集成
    • 整个 ELK/EFK 栈(Elasticsearch, Logstash, Kibana)是日志领域的事实标准。Kibana 提供了非常强大的日志数据可视化、仪表盘和探索式查询功能,与 ES 深度集成,开箱即用。
    • Doris 需要借助外部的 BI 工具(如 Grafana, Superset)来实现可视化,虽然也很强大,但在“日志探索”这个特定场景上,Kibana 的体验目前仍更胜一筹。
  • 非结构化数据处理
    • ES 擅长处理半结构化、非结构化的数据。日志格式变化时,其动态映射(Dynamic Mapping)能力处理起来更方便。
    • Doris 作为关系型分析数据库,更适合处理结构化的数据。虽然也支持 JSON 类型,但在处理高度非结构化的日志时,前期可能需要更严格的结构化定义或 ETL 处理。

什么时候用 Doris 替换 ES 存储日志?

  • 如果重心是分析,而不是搜索:更关心的是“统计、聚合、报表”(例如:错误趋势、性能指标、流量监控),而不是“查找某条具体的日志记录”。
  • 对查询速度要求极高:需要对亿级甚至十亿级的日志数据做快速的即席查询(Ad-hoc Query)。
  • 希望与现有 SQL 和 BI 生态无缝集成:团队更熟悉 SQL,希望用标准的 SQL 语句和现成的 BI 工具进行日志分析。
  • 非常关注成本:希望用更少的硬件资源存储和处理更多的日志数据。

什么时候应该坚持使用 Elasticsearch?

  • 如果重心是搜索和排查问题:运维和开发人员需要频繁地、灵活地使用各种条件(关键字、通配符、模糊查询)来检索和定位具体的日志详情以排查线上问题。
  • 已经深度依赖 ELK 栈:团队已经熟练使用 Kibana 进行日志探索和 dashboard 构建,且现有功能完全满足需求。
  • 写入实时性要求极高:要求日志产生后必须在秒级甚至毫秒级内被检索到。

混合架构(推荐):
很多公司采用一种混合架构,结合两者的优势:

  • 热数据用 ES:保留最近 1-7 天的日志在 ES 中,利用其强大的搜索能力供开发运维人员快速排查问题。
  • 温冷数据用 Doris:将超过 7 天的日志自动归档到 Doris 中,利用其低成本和高性能的分析能力,用于长期的历史趋势分析、合规审计和生成大型报表。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容