跳转至

部署和维护 / 高可用部署

DataFlux Func 支持多份部署以满足高可用要求。

本文主要介绍如何在服务器上直接安装、部署高可用 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