マルチテナント — 一戸建てか、巨大マンションの家賃の割り勘か
1つのWebサービスを、たくさんの会社に使ってもらうとします。会社ごとに専用のサーバーを1式ずつ用意するか、全社で同じサーバーを共有するか。後者をマルチテナントと呼びます。テナントは「入居者」のことです。
たとえるなら一戸建てと、巨大マンション。一戸建ては気楽ですが、家1軒ぶんの費用を1社で払います。マンションは建物を分け合うぶん家賃が安い。そのかわり隣の部屋の騒ぎが聞こえてきますし、部屋の鍵をしっかりかける必要があります。図1で、入居する会社の数を変えながら家賃を比べ、1社に大騒ぎさせてみてください。
混む時間がずれているから、分け合うと安い
一戸建てでは、それぞれの会社が自分がいちばん混む時間に合わせた大きさの家を建てます。でも、A社が混むのは朝、C社は夜というように、全社が同時に混むことはまずありません。マンションなら、建物は「全社の合計がいちばん多いとき」に合わせれば足ります。会社の数を増やすほど、1社あたりの家賃は下がっていきます。
さらに、建物の管理人(OSの更新や監視、バックアップ)も1人で済みます。SaaSと呼ばれるサービスの多くが、この分け合う仕組みで安い料金を実現しています。
うるさい隣人と、部屋の鍵
マンションで「🎉 B社が大セール」を押すと、B社のアクセスが建物の限界を超え、何もしていないA社やC社まで遅くなります。これをノイジーネイバー(うるさい隣人)問題と呼びます。1社ごとに使える量の上限を決めておけば、騒いだB社だけが待たされ、ほかの部屋は守られます。
もう1つの注意点がデータの分離です。全社のデータが同じデータベースに入っているので、取り出すたびに「自分の会社の分だけ」と条件をつける必要があります。図2で、その条件を付け忘れるとどうなるか試してください。
条件1行を忘れるだけで、よその会社の注文が丸見えになります。人の注意力に頼らないよう、データベースの機能で「この会社の人には、この会社の行しか見せない」と強制する方法(行レベルセキュリティ)や、会社ごとにスキーマやデータベースを分ける方法があります。分けるほど安全ですが、そのぶん一戸建てに近づき、費用と手間が増えます。
- テナント
- サービスを使う1つの契約者。多くの場合は1つの会社や組織。
- マルチテナント
- 1つのシステムを、複数のテナントで共有する作り方。
- シングルテナント
- テナントごとに専用のシステムを用意する作り方。
- ノイジーネイバー
- 共有している誰か1人の使いすぎで、ほかの全員が遅くなる問題。
- クォータ
- 1テナントが使える量の上限。うるさい隣人から他の部屋を守る。
- 行レベルセキュリティ
- データベースが、利用者ごとに見てよい行だけを返すように強制する機能。
まとめ
マルチテナントは、混む時間がずれていることを利用して、建物を分け合う仕組みです。会社が増えるほど1社あたりは安くなります。そのかわり、隣の騒ぎを上限で抑え、部屋の鍵(データの分離)を仕組みで守る必要があります。家賃の安さと、隣との壁の厚さのつり合いをどこに置くかが、設計のしどころです。