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