部署和維護 / 高可用部署
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