クラスター機能

警告

クラスター機能は実験的機能のため、正式版では仕様が変更される可能性があります

概要

これは Sora でクラスターを構成し、冗長化を行うための仕組みです。

クライアントがクラスターを構成しているどれかの Sora に接続した際、 その Channel ID で繋ぐべき Sora の Signaling URL を提示する仕組みです。

目的

Sora 複数台で冗長化やロードバランシングを実現する仕組みです。

ポート番号の開放

以下のポート番号を開放して下さい

  • epmd(Erlang Port Mapper Daemon)で利用する TCP/IP ポート番号

    • 4369

  • ノード間通信に利用する TCP/IP ポート番号

    • 49010 - 49020

    • sora.confcluster_listen_(min|max)_port にて指定可能です

注意

ライセンス

クラスターの 1 Sora ノードにつき 1 ライセンスが必要になります。 3 台の Sora ノードでクラスターを組む場合は 3 ライセンス必要になります。

StopRecording API の "redirect": false について

重要

この問題は 2022 年 6 月リリース予定の Sora にて録画状態をクラスターで共有する機能により解決予定です。

クラスター機能を利用した際に録画停止 API を実行しようとした場合、 タイミングが悪い場合に API リダイレクト機能により正常に録画が停止できない場合があります。

その際は API リダイレクト機能を実行しないよう、 API 実行時に "redirect": false を指定して StartRecording API を実行してください。

クラスターの離脱について

クラスターを参加させる場合は JoinCluster API を実行する必要がありますが、 クラスターから離脱させる場合は bin/sora stop を実行することで、離脱します。

設定

cluster

クラスター機能を利用する場合、 sora.conf にて clustertrue を設定する必要があります。

デフォルトでは cluster は有効になっていません。

重要

cluster = true にして Sora を起動した場合、 Sora はすべての接続を受け付けない block_new_connection モードで起動します。 クラスターへ参加した後に必ずモードを normal へ変更してください。

cluster = true

cluster_node_name

クラスター機能を利用する際のノード名を指定して下さい。

ここで指定するノード名は JoinCluster で指定する際に利用するノード名です。 ノード名で利用する @ の後ろはサーバーのドメインや、IP アドレスなどを指定してください。

重要

クラスター同士の通信はプライベートネットワークを利用するようにしてください。

# ドメインを指定する例
cluster_node_name = [email protected]
# IP アドレスを指定する例
cluster_node_name = [email protected]

cluster_signaling_url

sora.conf にてシグナリングの URL を指定して下さい。 この URL はクラスター機能を利用した際に "type": "redirect""location" の値として払い出されます。

cluster_signaling_url = wss://node1.example.com/signaling

上記の設定をした場合は {"type": "redirect", "location": "wss://node1.example.com/signaling"} として払い出されます。

cluster_api_url

sora.conf にて API の URL を指定して下さい。この URL はクラスター機能を利用した際に API を適切なノードに HTTP 307 でリダイレクトする際、 HTTP ヘッダー "location" の値として払い出されます。

cluster_api_url = https://node1.example.com/

cluster_listen_(min|max)_port

sora.conf にてクラスター情報の同期に利用する TCP/IP の受信ポートの範囲を指定してください。

デフォルトでは 49010 - 49020 が指定されています。

cluster_listen_min_port = 49010
cluster_listen_max_port = 49020

仕組み

注釈

これらの仕組みは sora.conf にてクラスター機能を有効にした場合に使用できます

クライアントへの複数シグナリング設定

Sora SDK にシグナリング URL を複数指定することで、どれかの Sora が一つでも正常に動作していれば Sora に繋がります。

ノード選択 / ロードバランス機能

注釈

新規チャネルのノード割り当て方式は改善していきます

クラスターを構築しているノードの中で 現在の同時接続数/最大同時接続数 が一番小さいノードに新規チャネル ID の担当を割り当てます。 値が全て同じ場合は接続しに行ったノードが担当します。

すでにそのチャネル ID がクラスター内部で利用されている場合はそのチャネル ID 担当しているノードへ割り当てられます。

シグナリング・リダイレクト機能

"type": "connect" を送った際、認証に入る前に {"type": "redirect", "location": "wss://sora1.example.com/signaling"} が戻ってくる場合があります。 この場合は送られてきたシグナリング URL に切り替えて再度 type: connect を行ってください。 その際は type: connect, redirect: true のように redirect: true を追加情報として入れてください。

この処理は Sora の SDK を利用している場合は、SDK が行いますので必要はありません。

HTTP API ダイレクト機能

チャネル ID を指定する HTTP API を利用する場合、現時点で指定したチャネル ID を担当しているノードへ HTTP API をリダイレクトします。

クラスター構築

複数の Sora でクラスターを組む機能です。クラスターに参加する場合は JoinCluster API をたたく必要があります。 その際にすでにクラスターを組んでいる Sora のどれかを指定してください。

クラスターを組む最初の Sora の場合は何もする必要はありません。

特定クラスターへの新規 Channel ID の割り当て停止

モード機能新規コネクションブロックモード または 新規セッションブロックモード になっている場合は、そのノードに対して新規チャネル ID の割り当てを行いません。

クラスターを有効にして起動した場合、 Sora は 新規コネクションブロックモード で起動します。

シグナリング

注釈

Sora SDK を利用している場合は、意識する必要はありません。

"type": "connect" で接続した際に type: offer ではなく type: redirect が送られてくる場合があります。 その場合は "type": "redirect" に入ってくる location のシグナリング URL へ再度接続を行ってください。

再接続を行う際に "type": "connect", "redirect": true を必ず含めてください。

API

クラスター参加 API

参加するノードに対してすでにクラスターに参加しているノードを指定してクラスターへ参加をします。

詳細は JoinCluster API をご確認ください。

http POST 127.0.0.1:3000/ x-sora-target:Sora_20211215.JoinCluster \
    [email protected]
HTTP/1.1 200 OK
content-length: 646
content-type: application/json
date: Tue, 16 Nov 2021 08:42:25 GMT
server: Cowboy

{
    "cluster_node_name_list": [
        "[email protected]",
        "[email protected]",
        "[email protected]"
    ]
}

重要

クラスターに参加する Sora ノード同士のバージョンに互換性ない場合、 JoinCluster API をたたいた際、クラスターに参加しようとしている Sora ノードを意図的に終了させます。 この場合 sora.log へログレベル emergencyCLUSTER-JOIN-VALIDATION-FAILURE ログが出力され、 クラスターの再構築が必要になります。

クラスターの離脱は Sora を bin/sora stop で終了させてください。

クラスターノード一覧 API

詳細は ListClusterNodes API をご確認ください。

$ http POST 127.0.0.1:3000/ x-sora-target:Sora_20211215.ListClusterNodes
HTTP/1.1 200 OK
content-length: 1051
content-type: application/json
date: Tue, 16 Nov 2021 08:36:25 GMT
server: Cowboy

[
    {
        "cluster_api_url": "http://192.0.2.8:3000/",
        "epoch": 1,
        "license_max_connections": 600,
        "license_serial_code": "ABCDEF-SRA-E003-203801-500",
        "license_type": "Experimental",
        "member_since": "2021-11-16T08:29:36.972932Z",
        "cluster_node_name": "[email protected]",
        "connected": true,
        "mode": "normal",
        "cluster_signaling_url": "wss://node-03.example.com/signaling",
        "sora_version": "2021.2"
    },
    {
        "cluster_api_url": "http://192.0.2.7:3000/",
        "epoch": 1,
        "license_max_connections": 600,
        "license_serial_code": "ABCDEF-SRA-E002-203801-400",
        "license_type": "Experimental",
        "member_since": "2021-11-16T08:22:46.898730Z",
        "cluster_node_name": "[email protected]",
        "connected": true,
        "mode": "normal",
        "cluster_signaling_url": "wss://node-02.example.com/signaling",
        "sora_version": "2021.2"
    },
    {
        "cluster_api_url": "http://192.0.2.5:3000/",
        "epoch": 1,
        "license_max_connections": 600,
        "license_serial_code": "ABCDEF-SRA-E001-203801-400",
        "license_type": "Experimental",
        "member_since": "2021-11-16T08:23:02.488711Z",
        "cluster_node_name": "[email protected]",
        "connected": true,
        "mode": "normal",
        "cluster_signaling_url": "wss://node-01.example.com/signaling",
        "sora_version": "2021.2"
    }
]

クラスターチャネル割り当て一覧 API

詳細は ListClusterChannels API をご確認ください。

$ http POST 127.0.0.1:3000/ x-sora-target:Sora_20211215.ListClusterChannels
HTTP/1.1 200 OK
content-length: 646
content-type: application/json
date: Tue, 16 Nov 2021 08:42:25 GMT
server: Cowboy

[
    {
        "channel_id": "sora",
        "node_in_charge": "[email protected]",
        "node_in_charge_epoch": 1,
        "node_in_charge_epoch_stale": false,
        "node_in_charge_connected": true
    },
    {
        "channel_id": "lemon",
        "node_in_charge": "[email protected]",
        "node_in_charge_epoch": 1,
        "node_in_charge_epoch_stale": false,
        "node_in_charge_connected": true
    },
    {
        "channel_id": "hisui",
        "node_in_charge": "[email protected]",
        "node_in_charge_epoch": 2,
        "node_in_charge_epoch_stale": false,
        "node_in_charge_connected": true
    },
    {
        "channel_id": "zakuro",
        "node_in_charge": "[email protected]",
        "node_in_charge_epoch": 2,
        "node_in_charge_epoch_stale": false,
        "node_in_charge_connected": true
    }
]

クラスター構築

重要

cluster_node_name はクラスター内のすべてのノードでユニークである必要があります

ライセンス

Sora ノード数分のライセンスが必要になります。 Sora 3 台でクラスターを組む場合は Sora が 3 ライセンス必要です。

2 台での構築

クラスターを構築する際、クラスターを同期するネットワークは可能な限りプライベートネットワークを利用してください。

  1. 必要なすべてのサーバーのポート開放

    • TCP/IP 4369

      • ポート番号の変更はできません、必ずこのポートを開放してください

    • TCP/IP 49010-49020

      • sora.conf にて変更可能ですがデフォルトをお勧めします

  2. sora.conf の設定を cluster 対応にする

    • cluster = true

    • cluster_node_name = sora1@192.0.2.101

      • 可能な限りプライベートネットワークを指定してください

    • cluster_signaling_url = wss://sora-node1.example.com/signlaing

    • cluster_api_url = https://sora-node1.example.com/api

  3. Sora を起動する

  4. sora.conf の設定を cluster 対応にする

    • cluster = true

    • cluster_node_name = sora2@192.168.0.102

      • 可能な限りプライベートネットワークを指定してください

    • cluster_signaling_url = wss://sora-node2.example.com/signlaing

    • cluster_api_url = https://sora-node2.example.com/api

  5. Sora を起動する

  6. 参加するノードの JoinCluster API を叩く

これでクラスター構築は完了です。

シーケンス図

type: redirect

blockdiag クライアント Sora1 Sora2 アプリケーションサ ーバー sora2 のシグナリング URL を返す "type": "connect" "type": "redirect" "type": "connect" 認証ウェブフック 200 OK {"allowed": true} "type": "offer" "type": "answer" "type": "candidate" イベントウェブフック "type": "connection.creat ed" 200 OK WebRTC 確立
© Copyright 2021, Shiguredo Inc Created using Sphinx 4.4.0