目录1 Doris1.1 简介1.1.1 引言1.1.2 优势1.2 部署1.2.1 docker部署1.2.1.1 下载并启动1.2.1.2 检查状态1.2.2 本地部署方式1.2.2.1 前期准备1.2.2.2 下载JDK171.2.2.3 下载Doris安装包1.2.2.4 安装 fe1.2.2.5 安装 be1.2.2.6 修改密码1.3 查询建表操作1.3.1 连接Doris客户端1.3.2 建库建表1.3.3 常用命令1.4 be和fe1.4.1 Frontend (FE) 调度中心1.4.2 Backend (BE)1.4.3 Doris Web UI1.5 MySQL 源1.5.1 简介1.5.1 MySQL驱动1.5.2 创建MySQL Catalog1.6 可否用doris替换elastic来存储日志
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
启动后日志信息如下图
1.2.1.2 检查状态
## 检查 FE 状态,确定 Join 与 Alive 列均为 true
mysql -uroot -P9030 -h127.0.0.1 -e 'SELECT `host`, `join`, `alive` FROM frontends()'
## 检查 BE 状态,确定 Alive 列为 1
mysql -uroot -P9030 -h127.0.0.1 -e 'SELECT `host`, `alive` FROM backends()'
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
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
drop catalog
## 查询mysql数据库
show databases;
## 切换到指定数据库
use <数据库名>;
## 查询数据库表
show tables;
1.4 be和fe
Doris 采用了一种非常经典且简洁的主从架构(Master-Slave),主要由 Frontend(FE) 和 Backend(BE) 两类进程组成。
1.4.1 Frontend (FE) 调度中心
FE 是 Doris 的元数据管理节点和查询协调器,相当于集群的“大脑”。一个集群通常有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
默认密码:空
客户端的登录账号和密码与Doris Web UI的登录账号和密码是一致的,如果客户端修改了密码,登录Doris Web UI时也要更新账号密码。
fe可视化界面主要功能是在Playground上执行一些数据库命令。
访问be的web ui,浏览器输入地址:http://127.0.0.1:8040
be 可视化界面主要用于查看一些配置信息。
需要注意的是,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容器中,
docker cp /ops/app/mysql-connector-java-8.0.19.jar
# 在fe容器中创建目录
docker exec doris_fe_1 mkdir -p /opt/apache-doris/fe/jdbc_drivers
# 将宿主机中的驱动包拷贝到fe容器中,
docker cp /ops/app/mysql-connector-java-8.0.19.jar
同理,如果是本地部署,也需要将驱动包拷贝至以上路径
# 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 分位响应时间、按小时的流量统计)时,Doris 的 MPP 架构和列式存储优势巨大,查询速度通常比 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 的强项是分析,其文本搜索能力仅限于 LIKE 和 MATCH 等简单匹配,在复杂文本查询场景下远不如 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 中,利用其低成本和高性能的分析能力,用于长期的历史趋势分析、合规审计和生成大型报表。