shiguredo
Published in

shiguredo

スプリットブレインにあらがう

WebRTC のようなリアルタイム通信で求められるのは「一部のノードに問題が起きても利用し続けられる」事だと考えています。

そのため時雨堂では自社製品である WebRTC SFU Sora にクラスター機能を搭載し、一つのノードに障害が起きた場合でも再接続を行えばすぐにまた利用できるような仕組みを実現しています。

2022 年 6 月にリリース予定の次のバージョンでは、クラスター機能を改善し、より障害に強く、さらにクラスターの運用コストを下げる仕組みを入れています。

まとめ

  • 起動したら自動でクラスターを構築し始める
  • スプリットブレインが発生し、クラスターの全ノード数に対して、参加しているノードが半数未満になったサブクラスターはすべての接続を受け入れなくなる
  • 過半数以上のノードが過半数未満のサブクラスターを自動で再参加させる

スプリットブレインについて

こちらがわかりやすいです。
https://docs.oracle.com/cd/E19787-01/820-6910/6ni73qiv8/index.html

クラスター機能

Sora のクラスター機能は「どのノードがどのチャネル(一般的にはルームや部屋)を担当するか」という情報をすべてのノードで共有しています。そのため、どのノードに繋ぎに行っても適切なノードに案内される仕組みが入っています。

またノードがどのチャネルを担当するかは、クラスターに参加しているノードそれぞれの同時接続数を確認し、空いているノードへ新規チャネルの担当を割り当てるため、負荷分散的な機能も含まれています。

クラスターの自動構築

今までのクラスター構築は手動でクラスターへの参加を行う必要がありましたが、次のリリースからはクラスターの構築を自動で行います。

仕組みとしては Sora の設定ファイルである sora.conf に、最初にクラスターの参加を試みるノード一覧を登録するだけです。

contact_node_name_list = sora1@192.0.2.1, sora2@192.0.2.2, sora3@192.0.2.3

あとは Sora を起動させるだけで、これらのノードに自動でコンタクトを取りクラスターを構築します。

クラスターの分断(スプリットブレイン)発生時の挙動

クラスターで一番怖いのはスプリットブレインです。スプリットブレインとはクラスターがネットワーク切断などによりノードそれぞれが分断した状態になり、それぞれのノードが「相手のノードは死んだが自分は大丈夫」という状態になってしまう事です。

この状態が発生するとチャネル情報の共有がされていない状態になるため、複数のノードで同じチャネルが作られてしまい、サービスとしては破綻してしまいます。

これを回避するために Sora ではクラスターの分断が起きた際に「クラスターに参加しているノード数がもともとの半数未満になったサブクラスター」は「すべての接続を切断し、新規の接続を受け付けない」という仕組みを追加しました。

これにより、例えば 3 ノードで組んでいたクラスターが 2 と 1 に分かれてしまった場合、1 ノードの方は一切のリクエストを受け付けなくなります。そのためスプリットブレインが発生しなくなります。

ただ 3 ノードが 1 と 1 と 1 に分かれた時点で、サービス自体がすべて停止しますので、その場合は手動での復旧が必要になります。これを回避するにはクラスターのノード数を増やすことで発生確率を減らすことができます。

クラスター分断からの自動復旧

半数未満になったノードはすべての接続を切断し、すべての接続を受け入れなくしたタイミングから「自動でクラスターの再参加」を試みます。

クラスターに参加していた時に保持していた情報を利用し再度参加をしますが、このときに「過半数のノードが存在しているクラスター」へのみ参加を行います。この仕組みによりネットワークの分断が復旧さえすればクラスターも自動で復旧するようになっています。

WebRTC のような低遅延が重視される場合は同じノードに接続を集めるという処理が一番効果的です。時雨堂では低遅延でありつつ耐障害性を持たせるという仕組みを開発してきました。

今後も耐障害性を向上し、運用コストを減らし、低遅延を維持する製品を提供していきます。

--

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
V

V

Erlang/OTP / 時雨堂 / WebRTC / E2EE

More from Medium

Passwordless Authentication Pt. 1

Decentralized Webpack Configuration

CA Key Management: The Key to Secure IoT Networks

Setup Hide My WP Ghost on Ploi.io Server Management