基于Docker快速部署Apache Doris集群:从单机到高可用实战指南

最近在调研实时数仓方案时,发现 Apache Doris 凭借其极速的查询性能和便捷的运维特性,成为了许多团队的首选。然而,传统的物理机或虚拟机部署方式步骤繁琐,环境依赖复杂,尤其是在开发测试阶段,频繁的部署和清理工作耗时耗力。本文将分享一套基于 Docker 的 Apache Doris 部署方案,从零开始,手把手带你完成一个高可用的 Doris 集群搭建。无论你是想快速体验 Doris 功能,还是为团队搭建一套标准化的开发测试环境,这套方案都能让你事半功倍,避开环境配置的深坑。

1. 背景与核心概念

在深入部署之前,我们有必要先理解两个核心组件:Docker 和 Apache Doris。

1.1 什么是 Docker?

Docker 是一个开源的应用容器引擎。你可以把它理解为一个轻量级的虚拟机,但它比虚拟机更高效、更快速。它允许开发者将应用及其所有依赖(如库、环境变量、配置文件)打包到一个标准化的单元中,这个单元就是 容器 。容器在任何安装了 Docker 引擎的机器上都能以相同的方式运行,真正实现了“一次构建,处处运行”,彻底解决了“在我机器上好好的”这一经典难题。

对于 Doris 部署而言,使用 Docker 的优势显而易见:

  • 环境隔离 :Doris 的 FE(Frontend)和 BE(Backend)服务可以运行在独立的容器中,互不干扰。
  • 快速部署与销毁 :一行命令即可启动或停止整个集群,方便进行功能测试和版本验证。
  • 版本管理 :可以轻松切换不同版本的 Doris 镜像,无需重装系统或处理复杂的依赖冲突。
  • 资源可控 :可以精确地为每个容器分配 CPU、内存等资源。

1.2 什么是 Apache Doris?

Apache Doris 是一个现代化的、高性能的、实时的分析型数据库(MPP)。它最初由百度开发并开源,旨在解决海量数据的实时分析问题。Doris 兼容 MySQL 协议,支持标准 SQL,使得开发者可以像使用 MySQL 一样轻松上手。其核心架构主要包含两个组件:

  1. Frontend (FE)

    • 职责 :负责元数据管理、集群管理、用户认证以及查询的接收和规划。
    • 角色 :分为 Leader FE 和 Follower FE。一个集群有且仅有一个 Leader FE,负责写入;多个 Follower FE 用于实现高可用和读负载均衡。
    • 类比 :可以理解为大脑和调度中心。
  2. Backend (BE)

    • 职责 :负责数据存储和查询执行。数据以列式存储,并自动划分 Tablet(数据分片)进行分布式管理。
    • 角色 :通常由多个 BE 节点组成,通过增加 BE 节点可以实现存储和计算能力的水平扩展。
    • 类比 :可以理解为负责干活的肌肉和存储仓库。

Doris 的典型应用场景

  • 实时数据仓库 :对接 Kafka、Flink 等流处理系统,实现数据的实时摄入与查询。
  • 交互式 OLAP 分析 :支持对亿级甚至十亿级数据表的亚秒级多维分析查询。
  • 统一查询入口 :通过 Doris 的联邦查询能力,对存放在 Hive、Iceberg、Hudi 等外部数据源的数据进行统一查询。

将 Doris 部署在 Docker 中,正是为了简化这一强大系统的体验和运维门槛。

2. 环境准备与版本说明

在开始之前,请确保你的操作环境满足以下要求。本文将以 Linux 系统(如 CentOS 7+ 或 Ubuntu 20.04+)为例进行演示,macOS 和 Windows 10/11(使用 WSL2)也可参照类似步骤。

2.1 基础环境要求

  • 操作系统 :Linux (内核版本 3.10+), macOS, Windows 10/11 with WSL2。
  • Docker 引擎 :版本 20.10.0 或更高。这是运行容器的核心。
  • Docker Compose :版本 1.29.0 或更高。用于编排和管理多容器应用(如 Doris 集群)的利器。
  • 硬件资源 :建议至少 4核 CPU,8GB 内存,20GB 可用磁盘空间。生产环境需根据数据量和并发评估。

2.2 软件版本说明

本文演示将使用以下版本,请注意软件生态迭代较快,具体版本号可根据实际情况调整,但核心操作逻辑相通。

  • Docker 镜像 :我们将使用 Apache Doris 官方在 Docker Hub 上提供的镜像 apache/doris:2.0.4 。此镜像包含了构建好的 FE 和 BE 组件。
  • Doris 版本 :2.0.4(镜像标签决定)。这是当前的一个稳定版本。
  • 关键工具
    • mysql-client :用于连接 Doris FE(因为 Doris 兼容 MySQL 协议)。

重要提示 :本文所有步骤均在测试环境中验证。 在生产环境部署前,请务必进行充分测试和评估 ,并考虑使用更健壮的编排工具(如 Kubernetes)和持久化存储方案。

2.3 安装 Docker 与 Docker Compose

如果你的系统尚未安装 Docker,请按照以下步骤进行安装(以 Ubuntu 22.04 为例)。

1. 卸载旧版本(如有)

sudo apt-get remove docker docker-engine docker.io containerd runc

2. 设置 Docker 的 Apt 仓库

# 更新 apt 包索引并安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 添加 Docker 的官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3. 安装 Docker 引擎

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

4. 验证安装

sudo docker run hello-world

如果看到 “Hello from Docker!” 等信息,说明 Docker 安装成功。

5. (可选)免 sudo 执行 Docker 命令 将当前用户加入 docker 用户组,之后运行 Docker 命令就不需要 sudo 了。

sudo groupadd docker # 如果 docker 组已存在,会提示,可忽略
sudo usermod -aG docker $USER
newgrp docker # 刷新用户组,或退出终端重新登录
docker run hello-world # 再次测试,应无需 sudo

6. 安装独立版本的 Docker Compose(如果系统包管理器未提供) 虽然 Docker Desktop 和较新的 Docker Engine 已包含 docker compose 插件,但为了兼容性,也可以安装独立版本。

# 下载最新稳定版的 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version
# 或使用插件版本
docker compose version

环境准备就绪,接下来我们开始部署 Doris 集群。

3. 单机快速体验:使用 Docker Run

对于只是想快速体验 Doris 功能的同学,可以使用 docker run 命令快速启动一个 All-in-One 的容器,其中同时运行了 FE 和 BE。这种方式 仅适用于测试和学习

3.1 启动 Doris 容器

docker run -d \
  --name doris-quickstart \
  -p 9030:9030 \ # FE MySQL 协议端口
  -p 8030:8030 \ # FE HTTP 端口(Web UI)
  -p 8040:8040 \ # BE HTTP 端口
  apache/doris:2.0.4

命令解释:

  • -d :后台运行容器。
  • --name :为容器指定一个名称,方便管理。
  • -p :端口映射,将容器内部端口映射到宿主机。9030用于MySQL客户端连接,8030用于访问FE的Web界面。

3.2 进入容器并初始化

容器启动后,FE 和 BE 服务需要一些时间来完成初始化。我们可以进入容器查看日志或执行初始化命令。

1. 查看容器日志

docker logs -f doris-quickstart

等待日志中出现 fe start success be start success 类似的字样,表示服务启动成功。

2. 进入容器

docker exec -it doris-quickstart bash

3. 连接 FE 并完成初始化 在容器内部,使用 Doris 自带的 MySQL 客户端连接 FE。

mysql -h 127.0.0.1 -P 9030 -uroot

首次连接可能不需要密码。连接成功后,执行以下 SQL 来添加一个 BE 节点到集群中(对于 All-in-One 容器,BE 就在本机)。

-- 在 MySQL 客户端中执行
ALTER SYSTEM ADD BACKEND “127.0.0.1:9050”;

9050 是 BE 的心跳服务端口(在容器内部网络)。

4. 验证集群状态

SHOW PROC ‘/backends’\G

查看结果,如果 Alive 列为 true ,则说明 BE 节点添加成功,集群就绪。

3.3 从宿主机连接 Doris

现在,你可以在宿主机上使用任何 MySQL 客户端(如 mysql , DBeaver , Navicat )连接 Doris 了。

  • 主机 127.0.0.1 或你的宿主机 IP
  • 端口 9030
  • 用户名 root
  • 密码 :初始可能为空
# 在宿主机上执行
mysql -h 127.0.0.1 -P 9030 -uroot

单机模式虽然简单,但无法体验 Doris 集群的真正威力,且数据存储在容器内,容器删除数据即丢失。接下来,我们使用 Docker Compose 部署一个更接近生产形态的集群。

4. 使用 Docker Compose 部署集群

我们将部署一个包含 1个 FE Leader + 1个 FE Follower + 2个 BE 的集群,并使用宿主机的目录进行数据持久化。

4.1 创建项目目录与配置文件

首先,创建一个工作目录来存放所有配置文件。

mkdir -p ~/docker-doris && cd ~/docker-doris

4.2 编写 Docker Compose 文件

创建 docker-compose.yml 文件,这是定义整个集群的核心。

version: ‘3.8’
services:
  doris-fe-01:
    image: apache/doris:2.0.4
    container_name: doris-fe-01
    hostname: doris-fe-01
    environment:
      - FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
      - FE_ID=1
    volumes:
      - ./fe-01/doris-meta:/opt/apache-doris/fe/doris-meta
      - ./fe-01/log:/opt/apache-doris/fe/log
    ports:
      - “8031:8030” # Web UI
      - “9031:9030” # MySQL
    command: [“fe”]
    networks:
      - doris-net

  doris-fe-02:
    image: apache/doris:2.0.4
    container_name: doris-fe-02
    hostname: doris-fe-02
    environment:
      - FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
      - FE_ID=2
    volumes:
      - ./fe-02/doris-meta:/opt/apache-doris/fe/doris-meta
      - ./fe-02/log:/opt/apache-doris/fe/log
    depends_on:
      - doris-fe-01
    command: [“fe”]
    networks:
      - doris-net

  doris-be-01:
    image: apache/doris:2.0.4
    container_name: doris-be-01
    hostname: doris-be-01
    environment:
      - FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
    volumes:
      - ./be-01/storage:/opt/apache-doris/be/storage
      - ./be-01/log:/opt/apache-doris/be/log
    depends_on:
      - doris-fe-01
      - doris-fe-02
    command: [“be”]
    networks:
      - doris-net

  doris-be-02:
    image: apache/doris:2.0.4
    container_name: doris-be-02
    hostname: doris-be-02
    environment:
      - FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
    volumes:
      - ./be-02/storage:/opt/apache-doris/be/storage
      - ./be-02/log:/opt/apache-doris/be/log
    depends_on:
      - doris-fe-01
      - doris-fe-02
    command: [“be”]
    networks:
      - doris-net

networks:
  doris-net:
    driver: bridge

配置文件关键点解析

  1. 服务定义 :定义了四个服务,两个 FE ( doris-fe-01 , doris-fe-02 ) 和两个 BE ( doris-be-01 , doris-be-02 )。
  2. 镜像 :统一使用 apache/doris:2.0.4
  3. 环境变量
    • FE_SERVERS :指定 FE 集群的所有节点,格式为 fe_name:fe_host:edit_log_port edit_log_port 默认为 9010,用于 FE 节点间元数据同步。 注意 :这里 fe_host 127.0.0.1 是因为所有容器共享 doris-net 网络,它们可以通过容器名(hostname)互相解析, 127.0.0.1 在容器内指向自己。更清晰的写法是 fe1:doris-fe-01:9010,fe2:doris-fe-02:9010 ,但官方镜像可能依赖此格式。
    • FE_ID :每个 FE 节点的唯一标识,必须不同。
  4. 数据卷 (Volumes) :将容器内的重要目录挂载到宿主机。这是 数据持久化 的关键,即使容器删除,数据依然保留在 ./fe-xx/doris-meta ./be-xx/storage 中。
    • FE:挂载元数据目录 ( doris-meta ) 和日志目录 ( log )。
    • BE:挂载数据存储目录 ( storage ) 和日志目录 ( log )。
  5. 端口映射 :只将 doris-fe-01 的端口映射到宿主机(8031->8030, 9031->9030),作为集群的访问入口。其他节点的端口仅在 Docker 网络内可访问,更安全。
  6. 依赖 :BE 依赖于 FE,确保 FE 先启动。
  7. 网络 :所有服务加入自定义的 doris-net 桥接网络,使得容器间可以通过容器名直接通信。

4.3 启动 Doris 集群

docker-compose.yml 所在目录执行:

docker-compose up -d

-d 参数表示后台启动。Docker Compose 会自动拉取镜像(如果本地没有),并按依赖顺序创建并启动所有容器。

使用以下命令查看启动状态和日志:

# 查看所有容器状态
docker-compose ps
# 查看 doris-fe-01 的日志
docker-compose logs -f doris-fe-01

等待所有服务启动完成,在 FE 日志中看到 fe start success ,在 BE 日志中看到 be start success

4.4 初始化 Doris 集群

服务启动后,我们需要通过 FE Leader 将 BE 节点加入到集群中。

1. 连接 FE Leader 我们映射了 doris-fe-01 的端口,因此通过它连接。

mysql -h 127.0.0.1 -P 9031 -uroot

2. 添加 BE 节点 在 MySQL 客户端中,执行以下命令,将两个 BE 节点添加到集群。 注意:这里的主机名是容器名,因为它们在同一个 Docker 网络中

ALTER SYSTEM ADD BACKEND “doris-be-01:9050”;
ALTER SYSTEM ADD BACKEND “doris-be-02:9050”;

3. 验证集群状态 分别查看 FE 和 BE 的状态。

-- 查看 FE 节点状态
SHOW PROC ‘/frontends’\G
-- 查看 BE 节点状态
SHOW PROC ‘/backends’\G

在输出中,你需要确认:

  • frontends 结果中, doris-fe-01 doris-fe-02 Alive 字段为 true ,且其中一个是 Leader
  • backends 结果中,两个 BE 的 Alive 字段为 true SystemDecommissioned false

至此,一个基于 Docker Compose 的 Doris 集群就部署完成了!

5. 基本操作与验证

现在,让我们通过几个简单操作来验证集群工作正常。

5.1 创建数据库与表

-- 1. 创建数据库
CREATE DATABASE docker_test_db;
USE docker_test_db;

-- 2. 创建一张表(以明细模型为例)
CREATE TABLE IF NOT EXISTS user_behavior (
    user_id INT,
    item_id INT,
    category_id INT,
    behavior VARCHAR(32),
    ts DATETIME
)
DUPLICATE KEY(user_id, item_id) -- 指定排序列
DISTRIBUTED BY HASH(user_id) BUCKETS 10 -- 分桶
PROPERTIES (
    “replication_num” = “2” -- 副本数,需小于等于 BE 节点数
);

-- 3. 查看表结构
DESC user_behavior;

5.2 插入与查询数据

-- 插入数据
INSERT INTO user_behavior VALUES
(1001, 2001, 101, ‘click’, ‘2024-01-01 10:00:00’),
(1001, 2002, 102, ‘buy’, ‘2024-01-01 10:01:00’),
(1002, 2001, 101, ‘click’, ‘2024-01-01 10:02:00’);

-- 查询数据
SELECT * FROM user_behavior;

-- 进行聚合查询
SELECT user_id, COUNT(*) as action_count, MAX(ts) as last_action
FROM user_behavior
GROUP BY user_id;

5.3 访问 Web UI

在浏览器中打开 http://<你的宿主机IP>:8031 ,使用用户名 root (密码默认为空)登录,即可进入 Doris 的 Web 管理界面。在这里你可以:

  • 查看集群健康状态。
  • 执行 SQL 查询。
  • 监控系统负载。
  • 管理用户和权限。

6. 常见问题与排查思路

在部署和运行过程中,你可能会遇到以下问题。这里提供排查思路。

问题现象 可能原因 排查步骤与解决方案
docker-compose up 失败 端口被占用、镜像拉取失败、权限不足。 1. netstat -tlnp | grep <端口号> 检查端口冲突,修改 docker-compose.yml 中的映射端口。
2. docker pull apache/doris:2.0.4 手动拉取镜像。
3. 使用 sudo 或确保当前用户在 docker 组。
FE 启动失败,日志报错 EditLog 相关 元数据目录 ( doris-meta ) 权限问题或已有旧数据。 1. 检查宿主机挂载目录的权限,确保容器内进程可写。
2. 如果是重新部署,尝试清空 ./fe-0x/doris-meta 目录( 注意:这会丢失所有元数据! )。
BE 启动失败,日志报错 storage_root_path 存储目录 ( storage ) 权限问题。 检查宿主机 ./be-0x/storage 目录的权限,确保容器内进程可读写。
SHOW PROC ‘/backends’ 显示 BE Alive false BE 与 FE 之间网络不通或心跳失败。 1. 在 FE 容器内 ping doris-be-01 ,检查网络连通性。
2. 检查 BE 日志,看是否有启动错误。
3. 确认添加 BE 时使用的 IP 和端口正确(应是容器名和 9050 )。
4. 检查防火墙或安全组是否放行了 9050 端口(在 Docker 网络内部)。
执行 ALTER SYSTEM ADD BACKEND 报错 BE 节点已添加过或端口冲突。 1. 先执行 SHOW PROC ‘/backends’; 查看是否已存在。
2. 如果已存在且是 Dead 状态,尝试 ALTER SYSTEM DROP BACKEND “<be_host>:<be_heartbeat_port>”; 后再重新添加。
插入或查询数据非常慢 资源不足(CPU、内存)、副本未生效。 1. 通过 docker stats 查看容器资源使用情况。
2. 检查表属性 “replication_num” ,如果为 2 但只有一个活跃 BE,数据无法完成复制,会影响可用性。确保活跃 BE 数 >= 副本数。
Web UI 无法访问 端口映射错误、FE 未成功启动、防火墙。 1. docker-compose ps 确认 doris-fe-01 状态为 Up
2. curl -v http://localhost:8031 在宿主机测试。
3. 检查宿主机防火墙规则。

通用排查命令

# 查看所有容器状态
docker-compose ps
# 查看特定容器日志
docker-compose logs -f <service_name>
# 进入容器内部
docker-compose exec <service_name> bash
# 在容器内检查进程
ps aux | grep doris
# 在容器内检查端口监听
netstat -tlnp

7. 最佳实践与工程建议

将 Docker 用于 Doris 部署,在便捷的同时也需要遵循一些最佳实践,以确保稳定性、可维护性和性能。

7.1 数据持久化与备份

  • 必须使用 Volume 挂载 :如本文所示,一定要将 doris-meta (FE) 和 storage (BE) 目录挂载到宿主机或网络存储(如 NFS)。这是数据的生命线。
  • 定期备份
    • FE 元数据 :除了挂载,应定期对 doris-meta 目录进行快照备份。可以使用 cron 任务执行 tar 打包。
    • 数据备份 :利用 Doris 的 BACKUP RESTORE 语句将数据备份到对象存储(如 S3、OSS)或 HDFS。
    • 导出数据 :对于关键表,定期使用 SELECT INTO OUTFILE 导出为文件。

7.2 资源配置与监控

  • 限制容器资源 :在 docker-compose.yml 中为每个服务配置资源限制,防止单个容器耗尽主机资源。
    services:
      doris-fe-01:
        # ... 其他配置 ...
        deploy:
          resources:
            limits:
              cpus: ‘2.0’
              memory: 4G
            reservations:
              cpus: ‘1.0’
              memory: 2G
    
  • 监控
    • Docker 层面 :使用 docker stats cAdvisor Prometheus (配合 node-exporter )监控容器 CPU、内存、网络 IO。
    • Doris 层面 :通过 FE Web UI 的监控模块,或使用 Grafana + Prometheus 抓取 Doris 的 Metrics(FE/BE 都暴露了 HTTP Metrics 接口)。

7.3 网络与安全

  • 使用自定义网络 :正如我们使用的 doris-net ,这提供了良好的隔离性,并且容器间可以通过服务名通信。
  • 最小化端口暴露 :只将 FE 的 MySQL 和 HTTP 端口映射到宿主机。BE 端口、FE 编辑日志端口(9010)等应仅在 Docker 网络内可访问。
  • 修改默认密码 :部署后,第一时间通过 SET PASSWORD FOR ‘root’ = PASSWORD(‘your_strong_password’); 修改 root 密码。
  • 创建业务用户 :避免直接使用 root 用户进行业务操作,应创建具有特定权限的数据库用户。

7.4 生产环境考量

本文的 Docker Compose 方案 非常适合开发、测试和环境验证 。但对于 生产环境 ,需要考虑更复杂的因素:

  1. 高可用 :至少需要 3 个 FE(1 Leader + 2 Follower)以避免脑裂,BE 节点数量根据数据量和查询压力确定。
  2. 编排工具 :考虑使用 Kubernetes (K8s) 进行编排,它能提供更强大的自愈、滚动升级、扩缩容和负载均衡能力。社区已有 Doris 的 K8s Operator 项目。
  3. 存储分离 :对于海量数据,考虑使用云盘或分布式存储(如 Ceph)作为 BE 的持久化卷,并提供更高的 IOPS 和可靠性。
  4. 日志收集 :将容器日志统一收集到 ELK(Elasticsearch, Logstash, Kibana)或 Loki 等日志平台,方便问题追踪。

7.5 日常运维命令

# 优雅停止集群
docker-compose down
# 停止并删除容器、网络(保留Volume数据)
docker-compose down -v
# 重启单个服务(如 BE)
docker-compose restart doris-be-01
# 查看服务日志
docker-compose logs --tail=100 -f doris-fe-01
# 进入容器执行命令
docker-compose exec doris-fe-01 mysql -h127.0.0.1 -P9030 -uroot -p
# 扩容一个 BE 节点(需修改 compose 文件并启动)
# 1. 在 docker-compose.yml 中添加 doris-be-03 服务定义。
# 2. docker-compose up -d doris-be-03
# 3. 进入 FE,执行 ALTER SYSTEM ADD BACKEND “doris-be-03:9050”;

通过以上步骤,你不仅能在本地快速拉起一个功能完整的 Doris 集群,还能掌握其基本的运维操作。这套 Docker 化部署方案极大地降低了学习和试用门槛,让你能更专注于 Doris 核心功能与性能的探索。当需要迁移到生产环境时,基于此方案获得的理解,可以更平滑地过渡到基于 K8s 或物理机的集群部署模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值