ベアメタルサーバーを利用したクラウドサービスで発生する課題を Tailscale で解決する

Translated into: English

株式会社時雨堂は WebRTC SFU Sora (以下 Sora) というパッケージソフトウェアとそのクラウドサービスを開発、提供しています。 WebRTC (Real-Time Communication) は音声や映像、データを P2P でリアルタイムにやりとりするための技術です。

Sora は WebRTC SFU (Selective Forwarding Unit) で、P2P での通信とは異なり、音声や映像などを「サーバー経由」で配信する技術です。つまり、Sora が中間サーバーとして、音声や映像、データを配信者に代わって複数の視聴者に配信します。Sora があれば、視聴者の数が増えても配信者自身がすべの視聴者に音声や映像、データを送る必要はなく、Sora を介して一度に多くの視聴者へリアルタイムに配信できます。

時雨堂では 2015 年より Sora の開発を行い、その顧客は Web会議システムのみならず、様々なリモートサービスを実現するために、Sora を利用しています。

私たちの製品に求められること

私たちが提供する製品は何より「つながり続ける」ことを求められます。そのため障害や負荷への対策がとても重要です。

例えば、遠隔操作でブルトーザーを運転している場合や、エアコン取り付け業者への遠隔支援で指示をしている場合に、突然つながらなくなると業務に支障が生じます。また、遠隔診療で医者が患者を診察している場合に突然つながらなくなることは大問題です。

また、私たちは、今や普段の生活に深く浸透しているリアルタイムなコミュニケーション技術は「高価なもの」ではあってはいけないと考えています。

そのため、私たちのクラウドサービスでは、「つながり続ける」という安定性と「安価で利用できる」というコスト面の両方を実現するため、「Tailscale」 と「ベアメタルサーバー」の組み合わせを採用しました。

ベアメタルサーバー利用時の障害対策と負荷対策

Sora のクラウドサービスでは、Sora 自身が持つクラスター機能を採用しました。Sora のクラスター機能は Raft を利用した負荷分散や可用性を実現する仕組みです。このクラスター機能をベアメタルサーバー上に構築してサービスを提供しています。

Sora では音声や映像、その他のデータをサーバー経由でリアルタイムにやりとりするため、ネットワーク帯域や、暗号処理のために CPU を多く消費します。そのため、私たちはネットワーク帯域を定額で提供してくれ、高性能なベアメタルサーバーを安価に提供してくれる DataPacket というサービスを採用することにしました。

ベアメタルサーバーは、クラウドサービスと比較すると、ネットワークやサーバーの利用料金を大きく押さえられます。しかし、障害が発生した場合や負荷が高くなった場合、もしベアメタルサーバーを追加で調達しようとしても時間がかかります。DataPacket の場合は早くても 4 時間以上かかり、遅い場合は 24 時間以上かかることもあります。

私たちはその対策として Tailscale を選択しました。 Tailscale を利用し、短期間で用意が可能なクラウドサービスのサーバーと、DataPacket 上のベアメタルサーバーを、あたかも同じネットワーク上にいるようにし、その上で Sora のクラスターを構築することにしました。

この方法を利用することで、負荷が高まった場合でも、クラウドサービスのサーバーを一時的にクラスターに参加させる選択を取ることができます。もしくは障害が起きたときに、ベアメタルサーバーが復旧するまで代替のサーバーを立てることができます。

Tailscale 上にクラスターを組むことで、複数サービス間のネットワークを意識することなく利用できます。

Tailsacle のおかげで、サービスのコストを抑えられ、さらに可用性も高められています。私たちが運用するサーバーにはすべて Tailscale がインストールされており、サーバーどうしだけでなく、サービスの運用者も Tailscale SSH を利用して安全にアクセスすることができています。もちろんサーバーの監視もすべて Tailscale 上で構築しています。

Tailscale とベアメタルサーバーの組み合わせで、価格を抑えつつも高品質なサービスが提供できるようになりました。

Erlang/OTP と Tailscale

もう一つ、私たちには Tailscale を利用するメリットがあります。

Sora は Erlang/OTP という言語を利用して書かれています。Erlang/OTP はエリクソンが開発した言語で、耐障害性やマルチコアの利用に優れています。有名なところだと WhatsApp LLC や Nintendo Co., Ltd. などで利用されています。

Erlang/OTP には分散機能が標準で備わっており、他の Erlang/OTP ノードとの通信が簡単に利用できます。ただし Erlang/OTP の分散向け通信は、標準では暗号化されていません。暗号化する場合は Erlang/OTP 上での TLS 通信を用意する必要があり、証明書の設定や運用が複雑になってしまいます。

私たちは Erlang/OTP が提供している分散機能の TLS は利用せず、 Tailsacle ネットワーク上で Erlang/OTP の分散機能を利用するにしました。こうすることで Erlang/OTP の分散機能の通信暗号化を Erlang/OTP 側で担保する必要がなくなりました。

以下は私たちが実際に運用しているサーバー間の Ping の値です。これらはすべて Tailscale 上でやりとりされています。

DataPacket (Tokyo) -> Vultr (Tokyo)

パブリックネットワーク経由。

64 bytes from 100.71.97.122: icmp_seq=3 ttl=64 time=0.857 ms
64 bytes from 100.71.97.122: icmp_seq=4 ttl=64 time=0.756 ms
64 bytes from 100.71.97.122: icmp_seq=5 ttl=64 time=1.41 ms
64 bytes from 100.71.97.122: icmp_seq=6 ttl=64 time=0.888 ms
64 bytes from 100.71.97.122: icmp_seq=7 ttl=64 time=0.892 ms

DataPacket (Tokyo) -> Linode (Tokyo)

パブリックネットワーク経由。

64 bytes from 100.120.18.29: icmp_seq=3 ttl=64 time=0.894 ms
64 bytes from 100.120.18.29: icmp_seq=4 ttl=64 time=0.777 ms
64 bytes from 100.120.18.29: icmp_seq=5 ttl=64 time=1.00 ms
64 bytes from 100.120.18.29: icmp_seq=6 ttl=64 time=0.962 ms
64 bytes from 100.120.18.29: icmp_seq=7 ttl=64 time=1.67 ms

DataPacket -> DataPacket

プライベートネットワーク経由。

64 bytes from 100.87.92.1: icmp_seq=3 ttl=64 time=0.698 ms
64 bytes from 100.87.92.1: icmp_seq=4 ttl=64 time=0.731 ms
64 bytes from 100.87.92.1: icmp_seq=5 ttl=64 time=0.633 ms
64 bytes from 100.87.92.1: icmp_seq=6 ttl=64 time=0.724 ms
64 bytes from 100.87.92.1: icmp_seq=7 ttl=64 time=0.598 ms

結論

  • リアルタイム通信のサービスはつながり続けることが求められる
  • コストを下げるためにベアメタルサーバーを利用している
  • Tailscale を利用することでベアメタルサーバーに障害が発生したり負荷が高まったりした際、別のクラウドサーバーをクラスターに参加させられる
  • Tailscale を利用することで Erlang/OTP の分散機能の通信部分の暗号化を担保できる

この記事を読まれた方は、ぜひ Tailscale を利用してベアメタルサーバーの導入を検討してみてください。 Tailscale のおかげで安全に、かつコストを抑えることができ、他社との差別化ができるようになります。

株式会社時雨堂 @voluntas