배포 및 유지보수 / 고가용성 배포
DataFlux Func는 고가용성 요구 사항을 충족하기 위해 다중 배포를 지원합니다.
이 문서에서는 서버에 고가용성 DataFlux Func를 직접 설치하고 배포하는 방법을 주로 설명합니다.
- k8s에서 Helm을 사용하여 DataFlux Func를 설치하는 방법은 배포 및 유지보수 / 설치 및 배포 / Helm 배포를 참조하세요.
- DataFlux Func 시스템 확장에 대한 정보는 배포 및 유지보수 / 아키텍처, 확장 및 리소스 제한을 참조하세요.
- 함수의 구체적인 실행 과정은 스크립트 개발 / 함수 실행 과정을 참조하세요.
Redis의 고가용성 방안을 선택할 때 '클러스터형 Redis'를 사용하지 말고, '마스터-슬레이브형 Redis'를 사용할 수 있습니다.
이전에 단일 서버 방식으로 DataFlux Func를 설치한 적이 있다면, 고가용성 배포로 전환할 때 배포 및 유지보수 / 백업 및 마이그레이션 / 데이터베이스 마이그레이션을 참조하여 마이그레이션하세요.
1. 다중 복제본 배포
DataFlux Func의 Server와 Worker 서비스는 모두 고가용성, 확장 등의 요구 사항을 충족하기 위해 다중 배포를 지원합니다.
일반적으로 함수 실행 효율의 병목은 Worker 서비스(즉 Python 코드)에 있으므로, Server 서비스는 단일 장애점(SPOF)만 피하면 되지만, 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. 완전히 독립적인 마스터/백업 배포
이 배포 방식이 실제로 '고가용성'에 해당하는지는 일단 고려하지 않고, 이러한 배포 요구 사항이 실제로 존재한다고 가정합니다.
완전히 독립적인 마스터/백업 배포는 실제로 각각 독립된 DataFlux Func 2세트를 별도로 배포하는 방식입니다 (구성 파일 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