Ubuntu 22.04 安装 Apache Helix 2.0.1 指南

在 Ubuntu 22.04 单台服务器上从零完整安装 Apache Helix 2.0.1 集群控制框架,搭建本地 ZooKeeper + Controller + Participant 伪集群并联调 helix-admin 的过程与真实回显。

Apache HelixApache Helix安装部署JavaApacheUbuntu 22.042026/10/11

Ubuntu 22.04 安装 Apache Helix 2.0.1 指南

目标:在 Ubuntu 22.04.5 服务器上从 0 到 1 完整安装 Apache Helix 2.0.1,配置 JDK 11 环境与 JVM 堆限制,搭建本地单机伪集群(ZooKeeper + Controller + Participant),并实测 helix-admin 管理命令。已在 Ubuntu 22.04 服务器(/opt/helix 部署目录)实测通过,下文中所有命令与回显均来自真实执行结果。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64 / amd64 架构)
  • JDK:OpenJDK 11.0.32.1(Ubuntu 发行版),JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
  • Maven:Apache Maven 3.6.3(源码构建方案备用)
  • Apache Helix:2.0.1(官方发行包 helix-core-2.0.1-pkg.tar,23M)
  • ZooKeeper:3.6.3(随 Helix 发行包自带,zookeeper-3.6.3.jar)
  • 状态模型:MasterSlave / OnlineOffline / LeaderStandby / Task 等内置模型
  • 部署目录:/opt/helix/helix-core-2.0.1(安装根目录 /opt/helix)
  • 监听端口:ZooKeeper 2181、数据节点(Participant)7001
  • 集群名:helix-cluster;演示资源:MyDB(6 个分区)
  • 日志目录:/opt/helix/logs/
  • 测试管理账号:root,密码:q1w2e3r4(用于后续运维演示)

二、前置条件

2.1 更新系统软件源

以 root 登录服务器,先刷新 apt 索引(本方案所有命令均在 root 账号下执行)。

apt-get update

💡 输出省略:apt 会从 Ubuntu 官方源拉取元数据,正常回显以 Reading package lists... Done 结尾即可。

2.2 安装 JDK 11(Helix 推荐 JDK 8/11)

Apache Helix 为 Java 实现,官方推荐 JDK 8 或 JDK 11。本文实测使用 JDK 11:

apt-get install -y openjdk-11-jdk-headless wget tar

查看安装后的 Java 版本:

java -version

实测回显:

openjdk version "11.0.32.1" 2026-08-18
OpenJDK Runtime Environment (build 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu, mixed mode, sharing)

2.3 配置 JAVA_HOME 环境变量

查看 java 实际所在路径,readlink -f 解析软链得到真实 JDK 目录:

readlink -f $(which java)

实测回显:

/usr/lib/jvm/java-11-openjdk-amd64/bin/java

把环境变量写入 /etc/profile.d/helix.sh,登录即生效(该文件同时写入 HELIX_HOME 与 JVM 堆限制,见"八、配置说明"):

cat > /etc/profile.d/helix.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export HELIX_HOME=/opt/helix/helix-core-2.0.1
export PATH=$HELIX_HOME/bin:$PATH
export JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"
EOF

重新加载使其立即生效:

source /etc/profile.d/helix.sh

验证变量(后续工具脚本依赖 JAVA_HOME 与 HELIX_HOME,必须先配置):

echo $JAVA_HOME
echo $HELIX_HOME
which java

实测回显:

/usr/lib/jvm/java-11-openjdk-amd64
/opt/helix/helix-core-2.0.1
/usr/lib/jvm/java-11-openjdk-amd64/bin/java

三、版本选型说明

Helix 官方发行目录位于 Apache 镜像:https://downloads.apache.org/helix/,当前收录的稳定发行版如下(目录列表实测抓取):

版本发行类别说明
2.0.1最新稳定版本文实测版本,含 helix-core / helix-rest / helix-view-aggregator 等 pkg 包
2.0.0较新2026-06 发布
1.4.3旧稳定分支1.x 系收尾版本
1.3.2 / 0.9.10更早生产环境历史版本

💡 版本获取命令(不硬编码后续新版本号):登录后可用 wget -qO- https://downloads.apache.org/helix/ 实时查看发行目录,.md5/.sha512 校验文件与发行包一同发布。

选择建议:

  • 新项目选择 2.0.1(本文采用);
  • 已有 1.x 存量可直接升级到 2.0.1,接口保持向后兼容;
  • 对 ZooKeeper 版本有锁定要求时,注意发行包内置 ZooKeeper 3.6.3。

⚠️ 注意:addCluster 在 2.0.1 上存在"集群结构尚未完全就绪"的偶发竞态(详见九、常见问题),初始化集群时建议先 drop 再 create 或做一次重试。

四、部署方案一:官方发行包安装(推荐)

4.1 下载官方发行包与校验文件

创建并进入安装目录:

mkdir -p /opt/helix
cd /opt/helix

从 Apache 官方镜像下载 helix-core 发行包及校验文件(本文实测 2.0.1):

wget https://downloads.apache.org/helix/2.0.1/binaries/helix-core-2.0.1-pkg.tar
wget https://downloads.apache.org/helix/2.0.1/binaries/helix-core-2.0.1-pkg.tar.sha512
wget https://downloads.apache.org/helix/2.0.1/binaries/helix-core-2.0.1-pkg.tar.asc

查看下载结果:

ls -lh /opt/helix/

实测回显:

total 23M
-rw-r--r-- 1 root root  833 Jun 30 03:08 helix-core-2.0.1-pkg.tar.asc
-rw-r--r-- 1 root root  23M Jun 30 03:08 helix-core-2.0.1-pkg.tar
-rw-r--r-- 1 root root  155 Jun 30 03:08 helix-core-2.0.1-pkg.tar.sha512

校验 SHA-512(一致性验证,OK 表示通过):

sha512sum -c helix-core-2.0.1-pkg.tar.sha512

实测回显:

helix-core-2.0.1-pkg.tar: OK

4.2 解压安装

解压到 /opt/helix 并确认目录结构:

cd /opt/helix
tar -xf helix-core-2.0.1-pkg.tar
ls -la /opt/helix/helix-core-2.0.1/

实测回显:

total 40
drwxr-xr-x  5 root root  4096 Jun 30 02:57 .
drwxr-xr-x  5 root root  4096 Oct 11 05:41 ..
-rwxr-xr-x  1 root root 14400 Jun 30 02:57 LICENSE
-rwxr-xr-x  1 root root  1051 Jun 30 02:57 NOTICE
drwxr-xr-x  2 root root  4096 Jun 30 02:57 bin
drwxr-xr-x  2 root root  4096 Jun 30 02:57 conf
drwxr-xr-x 10 root root  4096 Jun 30 02:57 repo

关键子目录说明:

  • bin/:全部启动与运维脚本(run-helix-controller.sh、start-helix-participant.sh、start-standalone-zookeeper.sh、helix-admin.sh、quickstart.sh 等);
  • conf/:日志配置 log4j2.properties;
  • repo/:Helix 与其依赖的本地 jar 仓库(org/apache/helix/helix-core/2.0.1/helix-core-2.0.1.jar、org/apache/zookeeper/zookeeper/3.6.3/ 等)。

清理已使用的发行包(可选):

rm -f /opt/helix/helix-core-2.0.1-pkg.tar /opt/helix/helix-core-2.0.1-pkg.tar.sha512 /opt/helix/helix-core-2.0.1-pkg.tar.asc

验证发行包内置的 ZooKeeper 版本(jar 清单):

unzip -p /opt/helix/helix-core-2.0.1/repo/org/apache/zookeeper/zookeeper/3.6.3/zookeeper-3.6.3.jar META-INF/MANIFEST.MF | grep -i version

实测回显:

Manifest-Version: 1.0
Implementation-Version: 3.6.3
Specification-Version: 3.6

4.3 创建数据与日志目录

ZooKeeper 需要持久化数据目录:

mkdir -p /opt/helix/zk-data
mkdir -p /opt/helix/logs

4.4 启动 ZooKeeper 状态存储

用发行包自带的独立 ZooKeeper 启动脚本拉起单机 ZooKeeper(端口 2181):

nohup /opt/helix/helix-core-2.0.1/bin/start-standalone-zookeeper.sh 2181 /opt/helix/zk-data \
  > /opt/helix/logs/zk-standalone.log 2>&1 &
echo $!

等待其完成初始化后检查监听端口:

netstat -ltnp | grep 2181

实测回显:

tcp6       0      0 :::2181                 :::*                    LISTEN      488/java

4.5 创建管理集群 helix-cluster

先创建集群骨架。由于 2.0.1 偶发"结构未就绪"竞态,推荐先 drop 再 create(首次 drop 对不存在的集群会给出提示,属正常):

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export HELIX_HOME=/opt/helix/helix-core-2.0.1
export PATH=$HELIX_HOME/bin:$PATH

helix-admin.sh --zkSvr localhost:2181 --dropCluster helix-cluster
helix-admin.sh --zkSvr localhost:2181 --addCluster helix-cluster

addCluster 成功回显关键行(会依次写入 MasterSlave、LeaderStandby、OnlineOffline、Task 等内置状态模型):

[INFO ] [main] [org.apache.helix.manager.zk.ZKHelixAdmin:1400] - Created cluster:helix-cluster
[INFO ] [main] [org.apache.helix.manager.zk.ZKHelixAdmin:1699] - Add StateModelDef MasterSlave in cluster helix-cluster with StateModel ZnRecord=...

查看已存在的集群:

helix-admin.sh --zkSvr localhost:2181 --listClusters

实测回显:

Existing clusters:
helix-cluster

4.6 注册数据节点(Instance)

Participant 以 host_port 命名,必须先注册该节点,Participant 进程才能加入:

helix-admin.sh --zkSvr localhost:2181 --addNode helix-cluster localhost_7001

查看节点:

helix-admin.sh --zkSvr localhost:2181 --listInstances helix-cluster

实测回显:

Instances in cluster helix-cluster:
localhost_7001

4.7 添加资源并 rebalance

添加资源 MyDB(6 分区,状态模型 MasterSlave):

helix-admin.sh --zkSvr localhost:2181 --addResource helix-cluster MyDB 6 MasterSlave

执行 rebalance(单节点副本数取 1,表示仅保留主副本):

helix-admin.sh --zkSvr localhost:2181 --rebalance helix-cluster MyDB 1

⚠️ 若副本数设置超过节点承载能力,会报 Number of instances must not be less than replicas + 1(详见九、常见问题)。单节点演示副本取 1 即可。

4.8 启动 Controller(集群控制器)

nohup /opt/helix/helix-core-2.0.1/bin/run-helix-controller.sh \
  --zkSvr localhost:2181 --cluster helix-cluster \
  > /opt/helix/logs/controller.log 2>&1 &
echo $!

查看控制器日志(确认成功连接集群并进入 STANDALONE 模式):

head -3 /opt/helix/logs/controller.log

实测回显:

[INFO ] [main] [org.apache.helix.controller.HelixControllerMain:208] - Cluster manager started, zkServer: localhost:2181, clusterName:helix-cluster, controllerName:null, mode:STANDALONE
[INFO ] [main] [org.apache.zookeeper.ZooKeeper:98] - Client environment:zookeeper.version=3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT
[INFO ] [main] [org.apache.zookeeper.ZooKeeper:98] - Client environment:java.version=11.0.32.1

4.9 启动 Participant(数据节点)

nohup /opt/helix/helix-core-2.0.1/bin/start-helix-participant.sh \
  --zkSvr localhost:2181 --cluster helix-cluster \
  --host localhost --port 7001 --stateModelType MasterSlave \
  > /opt/helix/logs/participant-7001.log 2>&1 &
echo $!

💡 host/port 组合构成实例名 localhost_7001,必须与 4.6 注册的节点一致,否则报 fail to connect <实例名>。

4.10 验证伪集群构建成功

先用 jps -l 查看本机 Java 进程(应能看到 ZooKeeper、Controller、Participant 三个进程及其完整类名):

jps -l

实测回显:

488 org.apache.zookeeper.server.quorum.QuorumPeerMain
2901 org.apache.helix.controller.HelixControllerMain
3014 org.apache.helix.examples.ExampleProcess

💡 其中 QuorumPeerMain 为 ZooKeeper 守护进程,HelixControllerMain 为 Controller,ExampleProcess 为 Participant 示例程序。

查看各进程的 JVM 参数(确认 256MB 堆限制生效,见"八、配置说明"):

jps -v | grep -i -E "HelixController|ExampleProcess|QuorumPeer"

💡 输出较长,可见 -Xms256m -Xmx256m -Xmn128m 等参数已注入到每个 Helix 相关 JVM 进程。

等待约 10 秒让 Controller 完成重平衡,随后通过 helix-admin 查看资源 ExternalView(分区副本归属):

helix-admin.sh --zkSvr localhost:2181 --getResourceInfo helix-cluster MyDB

实测回显(ExternalView 显示 6 个分区均为主副本 localhost_7001):

INFO: ResourceId:MyDB
INFO: StateModelDefRef:MasterSlave, partition numbers: 6, RebalanceMode:FULL_AUTO
BUCKET_SIZE: 0, rebalance strategy: org.apache.helix.controller.rebalancer.DelayedAutoRebalancer
ExternalView:
    MyDB_0  MASTER localhost_7001
    MyDB_1  MASTER localhost_7001
    MyDB_2  MASTER localhost_7001
    MyDB_3  MASTER localhost_7001
    MyDB_4  MASTER localhost_7001
    MyDB_5  MASTER localhost_7001

查看集群状态模型定义,确认内置模型已就绪:

helix-admin.sh --zkSvr localhost:2181 --listStateModel helix-cluster

实测回显:

StateModels in cluster helix-cluster:
MasterSlave
LeaderStandby
OnlineOffline
OnlineOfflineWithBootstrap
SchedulerTaskQueue
STORAGE_DEFAULT_SM_SCHEMATA
Task

至此,本地单机伪集群(1 个 ZooKeeper + 1 个 Controller + 1 个 Participant)构建成功,MyDB 6 个分区全部由 localhost_7001 承载 MASTER。其余 CLI 管理命令的实测回显参见第四篇《Apache Helix 常用 CLI 命令与工具详解》。

五、部署方案二:Maven 源码构建(可选)

当需要定制源码、打补丁或无法访问官方发行包时,可从源码构建。仅在此场景使用;正常情况下直接采用第四【四】章官方发行包方案即可,二选一,避免重复安装。

5.1 前置:安装 Maven 与 Git

apt-get install -y maven git
mvn -version

实测回显(节选):

Apache Maven 3.6.3
Java version: 11.0.32.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64

5.2 克隆源码并 checkout 版本标签

cd /opt/helix
git clone https://github.com/apache/helix.git
cd helix
git checkout tags/helix-2.0.1

💡 源码仓库较大,首次克隆耗时取决于网络;若 GitHub 直连受限,可配置 Git 代理或使用 Apache 官方 source 发行包 helix-2.0.1-source-release.tar。

5.3 编译 helix-core 子模块

mvn -pl helix-core -am clean install -DskipTests -Dspotbugs.skip=true -Dcheckstyle.skip=true

💡 -DskipTests 跳过测试、-Dspotbugs.skip=true -Dcheckstyle.skip=true 关闭静态检查以加速本地构建。构建产物输出到各子模块 target/ 目录,最终 helix-core/target/*.jar 即为可用的 core 构件,替代方案一解压目录下的 repo/.../helix-core-2.0.1.jar。

六、部署方案对比与选择建议

对比项方案一:官方发行包方案二:Maven 源码构建
适用场景常规部署、快速上手定制源码、存量补丁、离线构建
获取方式直接 wget 官方 pkg.targit clone + mvn 编译
部署耗时分钟级(解压即用)取决于硬件,通常 10 分钟以上
内置依赖自带 zookeeper-3.6.3.jar需自行管理依赖
运维复杂度低中(需维护 mvn/JDK)
建议推荐仅特殊定制时使用

选择建议:生产与教学场景优先选择方案一。若需二次开发 Helix 源码或验证未发布补丁,再切换到方案二,两者部署目录不同,互不影响。

七、启动与停止运维

7.1 以 systemd 管理 ZooKeeper

为便于开机自启与管理,可将 ZooKeeper 用 systemd 托管(文件 /etc/systemd/system/helix-zk.service):

[Unit]
Description=Helix ZooKeeper
After=network.target

[Service]
Type=simple
User=root
EnvironmentFile=/etc/profile.d/helix.sh
ExecStart=/opt/helix/helix-core-2.0.1/bin/start-standalone-zookeeper.sh 2181 /opt/helix/zk-data
Restart=on-failure

[Install]
WantedBy=multi-user.target

加载并启动:

systemctl daemon-reload
systemctl enable --now helix-zk
systemctl status helix-zk --no-pager

7.2 手动停止测试进程

若直接用 nohup 后台启动(第四【四】章),停止对应进程:

pkill -f ExampleProcess
pkill -f HelixControllerMain
pkill -f QuorumPeerMain

随后确认端口已释放:

netstat -ltnp | grep -E "2181|7001" || echo "all ports released"

八、配置说明(含 JVM 堆限制)

8.1 全局环境与 JVM 堆限制

在"二、前置条件"中写入的 /etc/profile.d/helix.sh 统一集中了环境变量并定义了 JVM 堆限制:

cat /etc/profile.d/helix.sh

内容说明:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export HELIX_HOME=/opt/helix/helix-core-2.0.1
export PATH=$HELIX_HOME/bin:$PATH
export JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"
  • JAVA_HOME:JDK 11 根目录,Helix 脚本用它定位 java;
  • HELIX_HOME:Helix 安装根目录,工具脚本据此定位 repo/conf;
  • JAVA_OPTS:JVM 堆限制。-Xms256m(初始堆 256MB)、-Xmx256m(最大堆 256MB)、-Xmn128m(新生代 128MB),整体限制在 256MB 档位,属于规范的 256–512MB 区间。需要更大内存时改这两处即可。

8.2 验证 JVM 堆限制生效

修改 /etc/profile.d/helix.sh 后,新启动的进程才会带上新参数。重启伪集群后验证(jps -l 找到 PID,再 jps -v 查看该 PID 参数):

jps -v | grep ExampleProcess

实测回显:

3014 ExampleProcess -Xms256m -Xmx256m -Xmn128m ...

若未看到 -Xms256m -Xmx256m,说明 JAVA_OPTS 未注入,需确认 source /etc/profile.d/helix.sh 已执行且进程为 source 之后启动。

8.3 日志配置

默认日志由 conf/log4j2.properties 控制,输出到 stdout(nohup 重定向文件)或自定义路径。修改日志级别/路径后重启相关进程生效。

九、常见问题

9.1 报错 HelixException: cluster helix-cluster is not setup yet

原因:ZooKeeper 仍初始化中或者集群异步创建尚未完成即执行后续命令,属 2.0.1 的偶发竞态。

处理:先 drop 再 create,必要时循环重试。

helix-admin.sh --zkSvr localhost:2181 --dropCluster helix-cluster
helix-admin.sh --zkSvr localhost:2181 --addCluster helix-cluster

9.2 报错 Number of instances must not be less than replicas + 1

原因:rebalance 时指定副本数超过了当前已注册节点的承载能力。

处理:单节点演示把副本数设为 1;多副本需先注册足够多的 Instance(--addNode),再执行 rebalance。

9.3 Participant 报错 fail to connect <host>_<port>

原因:Participant 启动参数 --host/--port 组合出的实例名与 --addNode 注册的节点名不一致。

处理:保持两端一致。例如注册 localhost_7001,则启动参数为 --host localhost --port 7001。

9.4 修改 JVM 堆后进程未生效

原因:JAVA_OPTS 为进程启动时读取,未重启的旧进程仍沿用旧值。

处理:停止旧进程后重新启动,并用 jps -v 确认新参数(见八、配置说明)。

9.5 卸载 Helix

停止所有相关进程后删除部署目录与配置即可:

pkill -f ExampleProcess; pkill -f HelixControllerMain; pkill -f QuorumPeerMain
rm -rf /opt/helix
rm -f /etc/profile.d/helix.sh
rm -f /etc/systemd/system/helix-zk.service

💡 示例管理账号为 root / q1w2e3r4(体验环境演示用,生产请改为强口令)。

参考链接

  • Apache Helix 官方文档:https://helix.apache.org/
  • Apache Helix 发行目录:https://downloads.apache.org/helix/
  • Apache Helix 源码仓库:https://github.com/apache/helix
  • 官方 Quick Start(单机伪集群示例):https://helix.apache.org/0.9.0-docs/quick_start.html