跳轉至

部署和維護 / 高可用部署

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