云计算百科
云计算领域专业知识百科平台

【实操指南】Apache Apollo 从 Windows 迁移至 Linux 服务器全流程(附避坑手册)

背景:作为轻量级消息中间件,Apache Apollo 常被用于 MQTT 协议的消息通信场景。但实际部署中,不少同学会遇到从 Windows 测试环境迁移到 Linux 生产环境的需求 —— 这过程看似简单,却容易踩 “路径兼容”“权限”“数据完整性” 的坑。

本文就带你走完 Apollo 跨系统迁移的全流程,从环境准备到服务验证,一次搞定!

一、迁移前必知:核心背景与环境信息

先明确迁移的基础信息,避免版本 / 环境不兼容:
Apollo 版本:必须保持一致(本文以 1.7.1 为例,这是 Apollo 最后一个稳定版);
JDK 版本:统一用 JDK 1.8(Apollo 对高版本 JDK 兼容性较差);
实例目录:
原 Windows:D:\\apache-apollo-1.7.1\\bin\\mybroker
目标 Linux:/home/apollo/apache-apollo-1.7.1/bin/mybroker

二、迁移前准备:Linux 环境先搭好

迁移前先把 Linux 环境配置到位,避免后续 “卡壳”。
1. 安装 JDK 1.8(以 CentOS 为例)
Apollo 依赖 JDK 1.8,高版本会报类加载错误,所以必须严格匹配:

# 下载 JDK 1.8(或上传本地安装包)
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
# 解压到 /usr/local
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
# 配置环境变量(编辑 /etc/profile)
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_202' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
# 验证
java -version

2. 安装 Apollo 1.7.1(与 Windows 版本一致)

# 下载 Apollo 安装包
wget http://apache.fayea.com/activemq/activemq-apollo/1.7.1/apache-apollo-1.7.1-unix-distro.tar.gz
# 解压
tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz -C /home/apollo/
# 赋予执行权限(Linux 必须!)
chmod -R 755 /home/apollo/apache-apollo-1.7.1

三、核心步骤:迁移关键文件

Apollo 的配置、数据都存在 ** 实例目录(mybroker)** 里,只需把这些文件从 Windows 传到 Linux 即可。
要迁移的文件清单(必传)
用 WinSCP/FileZilla 把 Windows 端 mybroker 目录下的这些内容,传到 Linux 端的 mybroker 目录:

Windows 路径Linux 路径作用
mybroker/etc/ /home/apollo/apache-apollo-1.7.1/bin/mybroker/etc/ 端口、认证等核心配置
mybroker/data/ /home/apollo/apache-apollo-1.7.1/bin/mybroker/data/ 持久化消息数据(重要!)
mybroker/etc/users.properties /home/apollo/apache-apollo-1.7.1/bin/mybroker/etc/users.properties 管理后台账号密码

在这里插入图片描述

在这里插入图片描述

四、Linux 端适配:避坑关键!

Windows 和 Linux 的 “差异” 是迁移的坑点,这一步必须做:
1. 修复文件权限(Linux 特有)
Windows 传过来的文件默认权限可能不足,导致 Apollo 启动失败:

chmod -R 755 /home/apollo/apache-apollo-1.7.1/bin/mybroker

2. 配置文件路径适配
打开 Linux 端的 mybroker/etc/apollo.xml,检查路径配置:
Windows 用 \\ 作为路径分隔符,Linux 用 /;
但 Apollo 支持 ${apollo.base} 变量(自动识别实例目录),所以只要原配置用了相对路径,Linux 会自动适配,无需手动修改。
举个例子:
原 Windows 配置 directory=“D:\\apollo\\data” → Linux 自动变成 ${apollo.base}/data。

五、启动 + 验证:确保服务正常

  • 启动 Linux 端 Apollo
    用之前写好的 apollo.sh 脚本启动(没脚本的话,直接用实例的启动命令):
  • cd /home/apollo/apache-apollo-1.7.1/bin
    # 启动服务
    ./apollo.sh start
    # 查看状态(显示“运行中”则成功)
    ./apollo.sh status

    此处为启动脚本

    #!/bin/bash
    # Apache Apollo Linux 启动脚本
    # 功能:替代Windows的apollo.cmd,支持启动/停止/重启/状态查询

    # ======================== 配置区(根据你的实际路径修改)========================
    # Apollo安装根目录(替换为你的apollo解压路径)
    APOLLO_HOME="/home/你的用户名/Downloads/apache-apollo-1.7.1"
    # Broker实例目录(创建的mybroker路径)
    APOLLO_BASE="${APOLLO_HOME}/bin/mybroker"
    # Java安装目录(如果已配置JAVA_HOME环境变量,可留空)
    JAVA_HOME="/usr/lib/jvm/jdk1.8.0_381"
    # JVM参数配置(和Windows版保持一致)
    JVM_FLAGS="-server -Xmx1G -XX:-UseBiasedLocking"
    # 日志输出目录
    LOG_DIR="${APOLLO_BASE}/logs"
    # 进程PID文件路径
    PID_FILE="${LOG_DIR}/apollo.pid"
    # ==============================================================================

    # 确保日志目录存在
    mkdir -p ${LOG_DIR}
    # 日志文件
    LOG_FILE="${LOG_DIR}/apollo.out"

    # 颜色输出函数(可选,提升可读性)
    red_echo() { echo -e "\\033[31m$1\\033[0m"; }
    green_echo() { echo -e "\\033[32m$1\\033[0m"; }
    yellow_echo() { echo -e "\\033[33m$1\\033[0m"; }

    # 检查Java环境
    check_java() {
    if [ -n "${JAVA_HOME}" ] && [ -x "${JAVA_HOME}/bin/java" ]; then
    JAVACMD="${JAVA_HOME}/bin/java"
    else
    JAVACMD=$(which java 2>/dev/null)
    if [ -z "${JAVACMD}" ]; then
    red_echo "错误:未找到Java环境,请配置JAVA_HOME或确保java命令在PATH中!"
    exit 1
    fi
    yellow_echo "警告:未配置JAVA_HOME,使用系统默认java: ${JAVACMD}"
    fi
    }

    # 检查Apollo目录
    check_apollo() {
    if [ ! -d "${APOLLO_HOME}" ]; then
    red_echo "错误:APOLLO_HOME路径不存在:${APOLLO_HOME}"
    exit 1
    fi
    if [ ! -d "${APOLLO_BASE}" ]; then
    red_echo "错误:Broker实例目录不存在,请先执行 ./apollo create mybroker 创建实例!"
    exit 1
    fi
    }

    # 启动函数(前台/后台)
    start() {
    # 先检查环境
    check_java
    check_apollo

    # 检查是否已运行
    if [ -f "${PID_FILE}" ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
    yellow_echo "Apollo已在运行中(PID: $(cat ${PID_FILE}))"
    return 0
    fi

    # 组装完整JVM参数(和Windows版apollo.cmd逻辑一致)
    FULL_JVM_FLAGS="${JVM_FLAGS}"
    # 开启JMX远程管理(可选)
    FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -Dcom.sun.management.jmxremote"
    # 绑定Apollo路径
    FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -Dapollo.home=${APOLLO_HOME}"
    FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -Dapollo.base=${APOLLO_BASE}"
    # 类路径
    FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -classpath ${APOLLO_HOME}/lib/apollo-boot.jar"

    # 核心启动命令(和Windows版的Java调用逻辑完全对应)
    BOOT_CMD="${JAVACMD} ${FULL_JVM_FLAGS} org.apache.activemq.apollo.boot.Apollo ${APOLLO_HOME}/lib org.apache.activemq.apollo.cli.Apollo run"

    green_echo "开始启动Apollo…"
    if [ "$1" = "foreground" ]; then
    # 前台启动(调试用,日志输出到终端)
    ${BOOT_CMD}
    else
    # 后台启动(生产用,日志输出到文件)
    nohup ${BOOT_CMD} > ${LOG_FILE} 2>&1 &
    echo $! > ${PID_FILE}
    sleep 3
    # 检查启动结果
    if ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
    green_echo "Apollo启动成功!PID: $(cat ${PID_FILE}),日志文件:${LOG_FILE}"
    else
    red_echo "Apollo启动失败!请查看日志:${LOG_FILE}"
    rm -f ${PID_FILE}
    exit 1
    fi
    fi
    }

    # 停止函数
    stop() {
    if [ ! -f "${PID_FILE}" ]; then
    yellow_echo "Apollo未运行(PID文件不存在)"
    return 0
    fi

    PID=$(cat ${PID_FILE})
    if ps -p ${PID} >/dev/null 2>&1; then
    green_echo "正在停止Apollo(PID: ${PID})…"
    kill ${PID}
    # 等待进程退出
    sleep 5
    if ps -p ${PID} >/dev/null 2>&1; then
    red_echo "优雅停止失败,强制杀死进程…"
    kill -9 ${PID}
    fi
    rm -f ${PID_FILE}
    green_echo "Apollo已停止"
    else
    yellow_echo "Apollo未运行(PID: ${PID} 不存在)"
    rm -f ${PID_FILE}
    fi
    }

    # 状态查询
    status() {
    if [ -f "${PID_FILE}" ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
    green_echo "Apollo正在运行中!PID: $(cat ${PID_FILE})"
    else
    red_echo "Apollo未运行"
    fi
    }

    # 帮助信息
    usage() {
    echo "用法:$0 [命令]"
    echo "支持的命令:"
    echo " start – 后台启动Apollo(生产环境推荐)"
    echo " start-fg – 前台启动Apollo(调试用,日志输出到终端)"
    echo " stop – 停止Apollo"
    echo " restart – 重启Apollo"
    echo " status – 查看Apollo运行状态"
    echo " help – 显示帮助信息"
    exit 1
    }

    # 主逻辑
    case "$1" in
    start)
    start
    ;;
    start-fg)
    start foreground
    ;;
    stop)
    stop
    ;;
    restart)
    stop
    sleep 2
    start
    ;;
    status)
    status
    ;;
    help|*)
    usage
    ;;
    esac

    exit 0

    三步验证服务可用性

  • 管理后台:浏览器访问 http://Linux服务器IP:61680,用默认账号 admin/password 登录(和 Windows 端一致);
  • MQTT 连接:用 MQTTX 等工具,连接 tcp://Linux服务器IP:61613,发一条测试消息,能收到则正常;
  • 数据完整性:在管理后台查看 “队列 / 主题”,和 Windows 端的数量、名称一致,说明数据迁移成功。
  • 六、收尾:生产环境优化

  • 设置开机自启
    避免服务器重启后服务挂掉,把 Apollo 注册为系统服务:
  • sudo ln -s /home/apollo/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service /etc/init.d/
    sudo update-rc.d apollo-broker-service defaults

  • 关闭 Windows 端服务
    确认 Linux 端完全正常后,彻底关掉 Windows 端的 Apollo,避免端口冲突。
  • 七、避坑手册:常见问题解决

    问题现象原因 + 解决方法
    启动失败,日志报 “权限不足” Linux 权限问题 → 执行 chmod -R 755 mybroker
    管理后台打不开 防火墙没开 61680 端口 → sudo firewall-cmd –add-port=61680/tcp –permanent
    MQTT 连不上 61613 端口没开放 → 开放端口,或检查 apollo.xml 端口配置

    总结
    Apollo 跨系统迁移的核心逻辑是 “复制实例文件 + 适配 Linux 环境”,只要注意 “权限”“路径” 这两个坑,基本能一次成功。
    如果你也在做消息中间件的跨系统迁移,欢迎在评论区交流踩过的坑~

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【实操指南】Apache Apollo 从 Windows 迁移至 Linux 服务器全流程(附避坑手册)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!