TL;DR

  • 场景:在 Ubuntu 云主机上用 Docker Compose 快速起 Kudu 集群(Master×3,TServer×5)
  • 结论:示例可直接跑通,但需注意 KUDU_QUICKSTART_IP、NTP、Hole Punching、端口与副本因子
  • 产出:一套可复制的部署骨架 + 版本矩阵 + 常见错误速查卡(含定位/修复指令)

版本矩阵

状态项目说明
Ubuntu 云服务器三台小规格;h121 运行 Master,h122/h123 运行 TabletServer
Docker Compose v2使用官方 quickstart.yml(Compose file v3),服务/卷定义可直接 up -d
⚠️Kudu 镜像版本KUDU_QUICKSTART_VERSION 未固定;建议 pin 到具体 tag(如 1.x.y)
⚠️时钟同步示例中 --use_hybrid_clock=false 便于演示;生产建议开启 NTP + Hybrid Clock
⚠️文件系统 Hole Punching需 ext4/xfs 支持;云盘/老内核可能缺特性,影响磁盘回收
端口规划7051/8051/7050 等与示例一致;注意宿主机冲突与安全组
⚠️存储介质强烈建议 SSD;机械盘可能导致吞吐下降、尾延时飙升
⚠️副本与容错单 Master 仅演示;生产需 3 Master + ≥3 TServer,表级副本因子≥3

安装准备

硬件准备

  • 一台或者多台跑 kudu-master。建议一个 Master(无容错机制)、三个 Master(允许一个节点出错)、五个 Master(允许两个节点出错)
  • 一台或者多台机器跑 kudu-server。当需要使用副本,至少需要三个节点运行 kudu-server 服务

操作系统

  • Ubuntu 云服务器(环境是三台小云服务器)
  • 内核和文件系统支持 Hole Punching 选项
  • NTP 服务
  • xfs or ext4 formatterd drivers

存储要求

  • 尽量使用固态存储,显著提供 kudu 性能

环境说明

  • 如果你使用的是 CDH,需要 ClouderaManager 5.4.3 及以上的版本
  • 三台云服务器,h121 启动 Master,h122 和 123 启动 TabletServer

Dockerfile

官方配置文件:

  • 3个 Master
  • 4个 TabletServer
version: "3"
services:
  kudu-master-1:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    ports:
      - "7051:7051"
      - "8051:8051"
    command: ["master"]
    volumes:
      - kudu-master-1:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
        --rpc_bind_addresses=0.0.0.0:7051
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP:?Please set KUDU_QUICKSTART_IP environment variable}:7051
        --webserver_port=8051
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8051
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-master-2:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    ports:
      - "7151:7151"
      - "8151:8151"
    command: ["master"]
    volumes:
      - kudu-master-2:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
        --rpc_bind_addresses=0.0.0.0:7151
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7151
        --webserver_port=8151
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8151
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-master-3:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    ports:
      - "7251:7251"
      - "8251:8251"
    command: ["master"]
    volumes:
      - kudu-master-3:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        MASTER_ARGS=--fs_wal_dir=/var/lib/kudu/master
        --rpc_bind_addresses=0.0.0.0:7251
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7251
        --webserver_port=8251
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8251
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-tserver-1:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    depends_on:
      - kudu-master-1
      - kudu-master-2
      - kudu-master-3
    ports:
      - "7050:7050"
      - "8050:8050"
    command: ["tserver"]
    volumes:
      - kudu-tserver-1:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
        --rpc_bind_addresses=0.0.0.0:7050
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7050
        --webserver_port=8050
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8050
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-tserver-2:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    depends_on:
      - kudu-master-1
      - kudu-master-2
      - kudu-master-3
    ports:
      - "7150:7150"
      - "8150:8150"
    command: ["tserver"]
    volumes:
      - kudu-tserver-2:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
        --rpc_bind_addresses=0.0.0.0:7150
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7150
        --webserver_port=8150
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8150
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-tserver-3:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    depends_on:
      - kudu-master-1
      - kudu-master-2
      - kudu-master-3
    ports:
      - "7250:7250"
      - "8250:8250"
    command: ["tserver"]
    volumes:
      - kudu-tserver-3:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
        --rpc_bind_addresses=0.0.0.0:7250
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7250
        --webserver_port=8250
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8250
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-tserver-4:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    depends_on:
      - kudu-master-1
      - kudu-master-2
      - kudu-master-3
    ports:
      - "7350:7350"
      - "8350:8350"
    command: ["tserver"]
    volumes:
      - kudu-tserver-4:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
        --rpc_bind_addresses=0.0.0.0:7350
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7350
        --webserver_port=8350
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8350
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

  kudu-tserver-5:
    image: apache/kudu:${KUDU_QUICKSTART_VERSION:-latest}
    depends_on:
      - kudu-master-1
      - kudu-master-2
      - kudu-master-3
    ports:
      - "7450:7450"
      - "8450:8450"
    command: ["tserver"]
    volumes:
      - kudu-tserver-5:/var/lib/kudu
    environment:
      - KUDU_MASTERS=kudu-master-1:7051,kudu-master-2:7151,kudu-master-3:7251
      - >
        TSERVER_ARGS=--fs_wal_dir=/var/lib/kudu/tserver
        --rpc_bind_addresses=0.0.0.0:7450
        --rpc_advertised_addresses=${KUDU_QUICKSTART_IP}:7450
        --webserver_port=8450
        --webserver_advertised_addresses=${KUDU_QUICKSTART_IP}:8450
        --webserver_doc_root=/opt/kudu/www
        --stderrthreshold=0
        --use_hybrid_clock=false
        --unlock_unsafe_flags=true

volumes:
  kudu-master-1:
  kudu-master-2:
  kudu-master-3:
  kudu-tserver-1:
  kudu-tserver-2:
  kudu-tserver-3:
  kudu-tserver-4:
  kudu-tserver-5:

内容解释

  • version: “3”:指定使用 Docker Compose 文件的版本。版本 3 是当前常用的版本,支持多种高级功能,适用于 Docker 1.13.0 及更高版本
  • services:定义了多个服务,每个服务对应一个 Docker 容器。在本配置中,定义了多个 Kudu Master 和 Kudu Tablet Server(简称 TServer)
  • volumes:定义了持久化存储卷,用于存储各个服务的数据,确保即使容器重新创建或删除,数据仍然保留

3 个 Kudu Master 节点

  • kudu-master-1
  • kudu-master-2
  • kudu-master-3

5 个 Kudu Tablet Server 节点

  • kudu-tserver-1
  • kudu-tserver-2
  • kudu-tserver-3
  • kudu-tserver-4
  • kudu-tserver-5

Master 配置说明

以 kudu-master-1 为例:

  • image: apache/kudu:指定使用的 Docker 镜像,apache/kudu 是官方 Kudu 镜像
  • ${KUDU_QUICKSTART_VERSION:-latest}:使用环境变量指定版本,如果未设置,则默认使用 latest
  • ports:将主机的端口映射到容器的端口,用于 Kudu Master 的 RPC 通信和 Web 界面
  • command: ["master"]:指定容器启动时运行的命令,启动 Kudu Master 进程
  • volumes:将 Docker 卷挂载到容器内的 /var/lib/kudu 目录,用于持久化存储数据
  • KUDU_MASTERS:定义了集群中所有 Master 节点的地址,格式为 hostname:port,以逗号分隔

启动服务

export KUDU_QUICKSTART_IP=$(ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}' | tail -1)
docker-compose up -d

访问服务

http://localhost:8051/

错误速查

症状根因定位修复
kudu-master 容器反复重启/无法加入集群未设置或设置了错误的 KUDU_QUICKSTART_IP,广告地址不可达docker logs kudu-master-1 查看绑定与 Advertised 地址;ip addr/hostname -i 对比;export KUDU_QUICKSTART_IP=$(hostname -I)
访问 http://localhost:8051 打不开端口未映射/被占用或安全组未放通docker ps 看端口;ss -lntp 查冲突;云厂商安全组修改 Compose 映射或释放端口;放通 8051
tserver 日志报”Could not resolve master addresses”KUDU_MASTERS 主机名不可解析/写错端口docker logs kudu-tserver-1getent hosts kudu-master-1;在 Compose 网络内使用服务名与正确端口;保持三项一致
创建表报副本不足或健康度红灯TServer 数量 < 副本因子kudu cluster ksck 或 Web UI 看副本布局;演示将表副本因子设为 1;生产扩容至 ≥3 TServer
吞吐低/磁盘膨胀明显FS 不支持 Hole Punching/机械盘dmesgxfs_info/tune2fs -lfallocate -punch 自检;切换到 xfs/ext4(支持 punch);优先 SSD
偶发时钟相关告警/事务异常未启用 NTP/时间漂移timedatectlchronyc sources -v;启用 chrony/systemd-timesyncd;生产启用 Hybrid Clock
容器重启后数据丢失卷未持久化或被清理docker volume ls/inspect;使用命名卷或绑定宿主目录;避免 docker system prune -a
Bind 报错或端口冲突宿主机已有服务占用ss -lntp;调整宿主机端口映射(如 7051→17051/8051→18051)