デプロイとメンテナンス / 高可用性デプロイ
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 サービスはそれぞれの環境で Cron Job をトリガーします。その結果、Cron Job が重複してトリガーされることになります。
この問題を回避するには、通常時はスタンバイノードの 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