部署和维护 / 高可用部署
DataFlux Func 支持多份部署以满足高可用要求。
本文主要介绍如何在服务器上直接安装、部署高可用 DataFlux Func。
- 有关在 k8s 中使用 Helm 安装 DataFlux Func,请参考 部署和维护 / 安装部署 / Helm 部署
- 有关 DataFlux Func 系统扩容的信息,请参考 部署和维护 / 架构、扩容与限制资源
- 有关函数具体执行的过程,请参考 脚本开发 / 函数执行过程
选择 Redis 的高可用方案时,请勿使用「集群版 Redis」,可以使用「主从版 Redis」
如之前已经使用单机方式安装过 DataFlux Func,在切换为高可用部署时,请参考 部署和维护 / 日常维护 / 迁移数据库 进行迁移
1. 多副本部署
DataFlux Func 的 Server 和 Worker 服务都支持多份部署以实现高可用、扩容等需求。
一般来说,函数的执行效率瓶颈在 Worker 服务上(即 Python 代码),因此 Server 服务只需要避免单点即可,而 Worker 服务则需要根据实际业务量增加副本数量。
多副本部署时,需要保证所有的服务 user-config.yaml 文件内容完全一致,且都连接到同一套 MySQL 和 Redis,资源目录挂在了同一个存储。
同时,Beat 服务作为定时任务的触发器,能且只能运行 1 个副本,否则可能会产生重复的定期任务。
flowchart TB
USER[用户]
SERVER_1[Server 1]
SERVER_2[Server 2]
WORKER_1[Worker 1]
WORKER_2[Worker 2]
WORKER_3[Worker 3]
BEAT[Beat]
REDIS[Redis]
USER --HTTP 请求--> SLB
SLB --HTTP 转发--> SERVER_1
SLB --HTTP 转发--> SERVER_2
SERVER_1 --函数执行任务入队--> REDIS
SERVER_2 --> REDIS
REDIS --函数执行任务出队--> WORKER_1
REDIS --函数执行任务出队--> WORKER_2
REDIS --函数执行任务出队--> WORKER_3
BEAT --"函数执行任务入队\n(定时)"--> REDIS
2. 完全独立的主备部署
暂且先不考虑这种部署方式到底算不算「高可用」,假设确实存在这种部署需求
完全独立的主备部署实际上就是分别部署 2 套各自独立的 DataFlux Func(配置文件 user-config.yaml 中有关 Secret、 MySQL、Redis 完全相同)的部署方式。
由于主备 DataFlux Func 各自独立运行,因此主备服务器上的 Beat 服务都会在各自环境触发定期任务,这会导致定期任务重复触发。
为避免此问题,可以在平时将备用节点的 DataFlux Func 关闭,或在脚本中自行编写避免任务重复执行的处理。
flowchart TB
USER[用户]
MAIN_NODE_SERVER[主节点 Server]
MAIN_NODE_WORKER[主节点 Worker]
MAIN_NODE_BEAT[主节点 Beat]
MAIN_NODE_REDIS_QUEUE[主节点 Redis 队列]
BACKUP_NODE_SERVER[备用节点 Server]
BACKUP_NODE_WORKER[备用节点 Worker]
BACKUP_NODE_BEAT[备用节点 Beat]
BACKUP_NODE_REDIS_QUEUE[备用节点 Redis 队列]
USER --HTTP 请求--> SLB
SLB --HTTP 转发--> MAIN_NODE_SERVER
SLB -.-> BACKUP_NODE_SERVER
subgraph "备用节点 - 关闭"
direction TB
BACKUP_NODE_SERVER --函数执行任务入队--> BACKUP_NODE_REDIS_QUEUE
BACKUP_NODE_REDIS_QUEUE --函数执行任务出队--> BACKUP_NODE_WORKER
BACKUP_NODE_BEAT --"函数执行任务入队\n(定时)"--> BACKUP_NODE_REDIS_QUEUE
end
subgraph 主节点
direction TB
MAIN_NODE_SERVER --函数执行任务入队--> MAIN_NODE_REDIS_QUEUE
MAIN_NODE_REDIS_QUEUE --函数执行任务出队--> MAIN_NODE_WORKER
MAIN_NODE_BEAT --"函数执行任务入队\n(定时)"--> MAIN_NODE_REDIS_QUEUE
end