コンテンツにスキップ

デプロイとメンテナンス / 高可用性デプロイ

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 サービスはそれぞれの環境で 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