【PowerJob语雀转载】调度中心(powerjob-server)部署

95 阅读13分钟

PowerJob 的设计目标为企业级的分布式任务调度平台,即成为某个公司的调度中间件,该公司下任意业务线的应用仅需要依赖 powerjob-worker 即可获取任务调度与分布式计算的能力。因此,PowerJob 的理想部署模式为一个公司统一部署 powerjob-server 集群,各业务线应用直接接入使用。

在 Spring Data JPA 和 Docker 技术的加持下,调度中心的部署极其简单,预计耗时5分钟!

环境要求

  • JDK 8+(LTS 版本均支持)
    • 高版本 JDK 需要自行加入 javax.xml.bind等依赖,详细文档可见LINK
  • 任意 Spring Data Jpa 支持的关系型数据库(MySQL/PostgreSQL/Oracle/MS SQLServer...)
    • PostgreSQL 启动报错可见 LINK
    • 达梦等数据库可自行百度“JPA连接达梦数据库”,简单适配即可
  • 【可选】MongoDB、OSS、数据库等存储扩展,主要用于实现在线日志、容器部署等扩展功能。不会影响核心的调度能力,缺失情况下将无法使用完全版的在线日志、容器部署等扩展功能(无法做到容器与日志数据的高可用,如果 server 单实例部署则无任何影响)

STEP1: 初始化数据库

调度服务器(powerjob-server)的持久化层基于Spring Data Jpa实现,对于能够直连数据库的应用,开发者仅需完成数据库的创建,即运行SQL:CREATE DATABASE IF NOT EXISTS `powerjob-product` DEFAULT CHARSET utf8mb4

  • PowerJob支持环境隔离,提供日常(daily)、预发(pre)和线上(product)三套环境,请根据使用的环境分别部署对应的数据库 powerjob-dailypowerjob-prepowerjob-product
    • 部分数据库(如 Oracle)会将 -作为非法字符,因此建议使用 powerjob_daily作为数据库名称
  • 如有手动建立数据库表结构需求,可使用 SQL 文件:下载地址
    • 注意:官方 SQL 仅基于特定版本(MySQL8)导出,不一定兼容其他数据库,也不一定兼容其他版本。由于 SpringDataJPA 自带了建表能力,推荐先在开发环境直连测试库自动建表,然后自行导出相关的 SQL 即可。

STEP2: 部署调度服务器(powerjob-server)

调度服务器(powerjob-server)支持任意的水平扩展,即多实例集群部署仅需要在同一个局域网内启动新的服务器实例,性能强劲无上限!

配置讲解

调度服务器(powerjob-server)为了支持环境隔离,分别采用了日常(application-daily.properties)、预发(application-pre.properties)和线上(application-product.properties)三套配置文件,请根据实际需求进行修改,以下为配置文件详解。

配置项含义可选
server.portSpringBoot配置,HTTP端口号,默认7700否,且不建议更改
oms.transporter.active.protocolsserver 需要激活的通讯协议,建议激活全部支持的协议来支持各种 worker 连接否,且不建议更改
oms.transporter.main.protocol主要通讯协议,用于 server 与 server 之间的通讯,用户必须保证该协议可用(端口开放)!
oms.akka.portPowerJob配置,Akka端口号,默认10086否,且不建议更改
oms.http.portPowerJob配置,多语言客户端HTTP端口号,默认10010否,且不建议更改
oms.mu.portPowerJob配置,MU协议端口号,默认10077
oms.table-prefix自定义数据库表名前缀
spring.datasource.core.xxx关系型数据库连接配置
spring.mail.xxx邮件配置是,未配置情况下将无法使用邮件报警功能
oms.container.retention.local本地容器保留天数,负数代表永久保留
oms.container.retention.remote远程容器保留天数,负数代表永久保留
oms.instanceinfo.retention任务实例和工作流实例信息的保留天数,负数代表永久保留(不建议)是,推荐使用默认配置,生产环境保留7天
oms.auth.initiliaze.admin.password【用户与权限】系统初始化时默认创建的超级管理员密码是,默认值 powerjob_admin,无此配置时,随机生成密码
oms.auth.dingtalk.appkeyoms.auth.dingtalk.appSecretoms.auth.dingtalk.callbackUrl【用户与权限】钉钉用户账号体系相关配置内容。详细配置请见:用户(账号体系)配置否,仅启用钉钉账号登录体系时需要配置

端口说明:

最省事的方法:所有端口(7700 + 10086 + 10010 + 10077)全打开。 如果你想精细化控制端口,那么请遵循以下原则自行设置:

  1. 对于任何用户,7700 为调度服务器(powerjob-server)的 Web 服务端口,必须打开
  2. oms.协议.port 的端口按需打开,考虑 server-server 和 server-worker 通讯的场景
    • 比如 server-server 默认通过 HTTP 协议交互(参数 oms.transporter.main.protocol控制),那必须打开 HTTP 10010 端口

    • 同时 server-worker 部分通过 HTTP,部分通过 AKKA,则仍需要打开 AKKA 的 10086 端口

注: 调度服务器部署完成后可访问 http://ip:${ server.port } 检验是否部署成功!


存储扩展配置

PowerJob 当前支持多套存储(MongoDB、AliyunOSS、MySQL等数据库),接入方可自由选择合适的存储介质。

MongoDB

4.3.4 版本前的主力存储,推荐使用

配置项:

  • oms.storage.dfs.mongodb.uri:mongoDB 连接的 uri,如 mongodb+srv://zqq:No1Bug2Please3!@cluster0.wie54.gcp.mongodb.net/powerjob_daily?retryWrites=true&w=majority
  • spring.data.mongodb.uri:兼容老版本,依旧支持,作用与 oms.storage.dfs.mongodb.uri 一致
AliyunOSS

AliyunOSS 存储支持,海量、安全、低成本、高可靠的云存储服务

配置项:

  • oms.storage.dfs.alioss.endpoint:阿里云 OSS 的 endpoint
  • oms.storage.dfs.alioss.bucket:阿里云 OSS 的存储 bucket
  • oms.storage.dfs.alioss.credential_type:密钥类型,支持以下枚举
    • PWD:账号密码,通过 ak sk 传入密钥
    • SYSTEM_PROPERTY:通过系统参数传入密钥,底层为 com.aliyun.oss.common.auth.SystemPropertiesCredentialsProvider
    • ENV:通过环境变量 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET 读取密钥,底层为 com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider
  • oms.storage.dfs.alioss.ak:密钥类型为 PWD 时需要
  • oms.storage.dfs.alioss.sk:密钥类型为 PWD 时需要
  • oms.storage.dfs.alioss.token:密钥类型为 PWD 时需要,可选,如果你不知道这是啥,就不需要传
MySQL系列数据库

针对简单场景,可直接使用数据库进行日志存储,方便快捷。

如果使用数据库作为生产环境的存储库,至少隔离数据库(即不直接前往创建的数据库,为存储单独创建一个独立库),防止非核心场景异常影响调度主链路。

PS. 官方使用的开发环境为 MySQL8(换句话说,别的 DB 版本没测过,使用前请做好测试哦~

配置项:

  • oms.storage.dfs.mysql_series.driver:驱动名称,如 com.mysql.cj.jdbc.Driver

  • oms.storage.dfs.mysql_series.url:JDBC URL,如 jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

  • oms.storage.dfs.mysql_series.username:数据库用户名,如 root

  • oms.storage.dfs.mysql_series.password:数据库密码

  • oms.storage.dfs.mysql_series.auto_create_table:可选,是否自动建表

  • oms.storage.dfs.mysql_series.table_name:可选,数据库表名称,默认为 powerjob_files

附录:数据库表 schema 要求(以 MySQL8 为例)

CREATE TABLE IF NOT EXISTS powerjob_files (
		`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
		`bucket` VARCHAR ( 255 ) NOT NULL COMMENT '分桶',
		`name` VARCHAR ( 255 ) NOT NULL COMMENT '文件名称',
		`version` VARCHAR ( 255 ) NOT NULL COMMENT '版本',
		`meta` VARCHAR ( 255 ) COMMENT '元数据',
		`length` BIGINT NOT NULL COMMENT '长度',
		`status` INT NOT NULL COMMENT '状态',
		`data` LONGBLOB NOT NULL COMMENT '文件内容',
		`extra` VARCHAR ( 255 ) COMMENT '其他信息',
		`gmt_create` DATETIME NOT NULL COMMENT '创建时间',
		`gmt_modified` DATETIME COMMENT '更新时间',
	PRIMARY KEY ( id ) 
);

方式一:Docker(推荐)

基础版流程:

  1. 下载镜像(最新版本请参考 Docker Hub):docker pull powerjob/powerjob-server:latest
  2. 创建容器并运行(仅需修改行 7,即传入 SpringBoot 相关配置信息),示例如下
docker run -d \
 			 --restart=always \
       --name powerjob-server \
       -p 7700:7700 -p 10086:10086 -p 10010:10010 \
       -e TZ="Asia/Shanghai" \
       -e JVMOPTIONS="" \
       -e PARAMS="--spring.profiles.active=product --spring.datasource.core.jdbc-url=jdbc:mysql://192.168.1.1:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8 --spring.datasource.core.username=root --spring.datasource.core.password=root --spring.data.mongodb.uri=mongodb://192.168.1.1:27017/powerjob-product" \
       -v ~/docker/powerjob-server:/root/powerjob/server -v ~/.m2:/root/.m2 \
       powerjob/powerjob-server:latest

行1: docker run -d :创建 docker 容器,-d 参数指定为后台运行

行2:指定该容器随着 docker 启动而自启

行3:指定容器名称

行4:指定宿主机与容器的端口映射关系(默认使用 Bridge 网络模式)

行5:时区,默认时区为中国标准时区(Asia/Shanghai),国外用户请修改为正确的时区

行6:JVM启动参数,有需求的可以自己添加(-Xmx、-Xms、-Xmn等)

行7:通过-e Params=""传入 SpringBoot 启动参数,详细参数见上表(最小配置为示例参数,需要传入配置文件名称、JDBC_URL、数据库用户名、数据库密码和 mongoDB 的 URI)

行8:映射数据卷,强烈建议映射/roo t/powerjob/s erver和/root/.m2这两个路径,前者存储了 powerjob-server所有的运行时文件(日志),后者可以避免使用 maven 编译容器时重复下载依赖的问题(详见容器章节)。

行9:指定使用的 docker 镜像

特殊需求 (maven 私服) 版流程:****

仅需要使用Git容器功能且搭建了maven私服的场景需要进行此流程。

容器功能需要用到 Maven 来编译代码库,而公司内部往往都会搭建自己的私有仓库,为此,官方 docker 镜像所使用的 maven 无法下载编译所需要的依赖包。对于这种需求的用户,需要您自己构建 docker 镜像,别担心,我们提供了一键构建脚本来简化流程。具体步骤如下:

  1. git clone https://github.com/PowerJob/PowerJob.git,下载本项目源码。

  2. 修改 powerjob- server/docker/settings.xml 文件(加入私服配置参数等等)。

  3. 运行 docker 一键构建脚本 others/script/build_docker.sh,按照提示即可完成自定义 docker 镜像的制作。

方式二:源码部署

  1. 克隆:git clone https://github.com/PowerJob/PowerJob.git,下载本项目源码。

  2. 修改对应环境的配置文件(application-xxx.properties)。

  3. 打包:mvn clean package -U -Pdev -DskipTests,构建调度服务器(powerjob-server)Jar 文件。

  4. 运行:java -jar xxx.jar --spring.profiles.active=product,指定生效的配置文件。注意,宿主机需要打开 7700(HTTP 服务)和 10086(AKKA 服务)端口。

STEP3(可选): 部署前端页面(powerjob-console)

每一个powerjob-server都自带了前端页面,不过 Tomcat(为了完善的 WebSocket支持,现已切换到Undertow )做 Web 服务器的性能就 呵呵了(看评测好像还行,不过对于集群部署调度中心的用户还是建议单独使用源码部署)~

源码部署

  1. 源码克隆:git clone https://github.com/PowerJob/PowerJob-Console.git
  2. 替换地址:修改 .env.product 中的 VUE_APP_BASE_URL 为调度服务器地址
  3. npm install && npm run build
  4. 将构建结果 dist 文件夹拷入 Nginx 静态目录下,修改配置文件,重启 nginx,enjoy~

PS. 开发使用的 node 版本为 v14.20.0

Docker 部署

考虑到前端工程 Docker 化并不流行和实用(静态文件存 CDN 它不香嘛),目前暂未提供 Docker 镜像(有一部分原因是本人不会运行时动态替换容器的实际后端请求地址,如果有能力可以帮忙实现的话非常感谢,附前端项目地址),为此,需要开发者手动构建 Docker 镜像,当然,一键构建脚本奉上~

  1. 项目克隆:git clone https://github.com/PowerJob/PowerJob-Console.git
  2. 替换地址:修改 .env.product 中的 VUE_APP_BASE_URL 为调度服务器地址
  3. chmod 755 script/docker/build.sh && bash script/docker/build.sh

STEP4: 验证 & 注册应用

V5.x

PowerJob 5.x 后正式支持用户权限体系,通过引入用户身份、管理员、namespace 等概念,帮助接入方提升App 管理效率。

注意:如果是首次部署启动,PowerJob 默认会创建一个超级管理员账号,默认密码由配置项 oms.auth.initiliaze.admin.password指定(默认为 powerjob_admin,若无此配置项则随机生成密码)。

初次部署,请您务必查看 powerjob-server 的输出日志,按关键词 SystemInitializeService搜索,便可看到如下日志,获取到超级管理员的账号密码。

[SystemInitializeService] The system has automatically created a super administrator account[username=ADMIN,password=powerjob_admin], please log in and change the password immediately!

自 5.x 版本开始,使用者需要登录后才可进入 PowerJob 控制台。您可选择合适的登录方式进行登录(登录方式的选择、第三方账号体系的支持可见文档

选择对应的账号体系,完成账号的注册和登录。

完成登录后,进入一级管理页面,包括以下 TAB:

  • 应用管理:可在此完成执行器的创建和管理,提供全局视角查看当前所有已注册的应用。
  • 命名空间:namespace,用于对应用进行分类和管理,比如按部门创建 namespace,同一个部门的应用挂载到同一个 namespace 中,方便管理。
  • 个人中心:对本账号进行管理,包括基础信息的查看修改,应用权限的申请等
  • 系统设置:提供全局超级管理员对 powerjob-server 的一些管理能力

以下为各功能的详细介绍:


应用管理:

  • 应用注册:点击右上角“新增”按钮,可拉起应用注册弹窗。每一个业务系统初次接入 PowerJob 时,都需要先完成应用注册, 即将需要接入的应用名称(appName)录入到调度中心。相关参数介绍如下:
    • namespace:【必填】命名空间,该应用归属的 namespace,提供二级概念方便管理。
    • appName:【必填】注册应用的唯一 code,推荐与项目本身的 project name 保持一致,如 powerjob-worker-samples
    • 名称:中文描述,仅用于展示
    • 密码:【必填】用于 OpenAPI 等场景的鉴权
    • 标签:TAG 功能,管理域功能,方便用户进行归类和管理
    • 额外信息:扩展属性,powerjob 本身不消费该字段,方便开发者二次开发预留
    • 权限管理:授予其他用户该 APP 对应的角色,使其拥有相关的权限进行操作。


命名空间:

  • 创建命名空间:点击右上角“新增”按钮,即可创建新的命名空间:
    • code:【必填】命名空间唯一标识,推荐纯英文,要求全局唯一
    • 名称:中文描述,仅用于展示
    • token:服务端自动生成的访问密钥,用于后续的 OpenAPI 场景
    • 标签:TAG 功能,管理域功能,方便用户进行归类和管理
    • 额外信息:扩展属性,powerjob 本身不消费该字段,方便开发者二次开发预留
    • 权限管理:授予其他用户该 namespace 对应的角色,使其拥有相关的权限进行操作。注意:namespace 下的角色会传递到旗下所有的 APP,比如 namespace 的管理员会应用旗下全部 APP 的管理员权限。


个人中心:

  • 个人信息:查看并管理个人信息,可进行修改 nick、密码等操作
  • 应用管理员:通过验证某个 APP 的账号密码,使当前账号获取到某个 APP 的管理员权限。


系统设置:

  • 全局管理员:授予其他账号全局管理员。针对使用其他账户体系的用户,建议部署完成后,使用 PowerJob 自动生成的 ADMIN 账户将其他账户追授为全局管理员,然后禁用 PowerJob 账号登录,可保证绝对安全性(登录鉴权完全托管在自己的系统上)。

V4.x 及前序版本

每一个业务系统初次接入 PowerJob 时,都需要先完成应用注册, 即将需要接入的应用名称(appName)录入到调度中心。

点击 执行应用注册 按钮,填入应用名称(appName,重要,需要保证唯一,推荐与真实应用名称保持一致)密码(进入控制台的密码) ,如果顺利完成注册,说明调度服务器和前端页面部署成功!

注册成功后,输入应用名称和密码,即可进入控制台,享受分布式调度与计算的快感~


报警用户录入 按钮用于录入用户信息(姓名、手机号、邮箱地址),收集报警信息,用户注册录入个人信息后,即可通过报警配置进行通知。