当ブログをご覧の皆様こんにちは。さくらインターネット研究所の大久保です。 今回はFlareを例に分散KVSをマルチテナント化する方法について考えてみたいと思います。
マルチテナント化の必要性過去の記事では、1つのユーザが分散KVSのサーバファームを独占して使用する前提で設定を行ってきましたが、分散KVSを利用するユーザが複数居た場合はどのようにしたらよいでしょうか?
下図のように単純にユーザごとにサーバファームを用意してしまうという方法が考えられますが、ユーザ毎に一定台数のサーバが必要であり、コストが掛かってしまいます。
そこで、1つのサーバファームに複数のユーザを収容する、いわゆるマルチテナント構成を実装する方法を考えてみます。
マルチテナント構成を実現するメリットとしては、
ユーザごとに物理サーバを用意する必要がなく、オンデマンドでリソースの確保が可能。 収容効率をアップでき、サーバの台数を削減できる。(特に、利用率の低いユーザが複数居た場合、集約効果が見込める) ユーザ毎に別個のサーバトポロジを管理する必要がなく、全ユーザ共通のトポロジで設計、拡張ができる。という点があげられます。
マルチテナント方式マルチテナントを実装するにあたっては、各ユーザのデータ空間を分離する必要があります。具体的には以下の2点を満たさなければなりません。
あるユーザのデータが別のユーザのデータと混ざることなく分離できる あるユーザが別のユーザのデータにアクセスできないようにする検討した結果、これらを満たす方法として以下の3つの方式を考えました。
各ユーザ毎に仮想サーバを立ち上げ、VLANでネットワークを分割する 仮想化技術を用いた方式で、各ユーザ毎に物理サーバを用意する代わりに仮想サーバを用意します。 インフラレベルで論理的に分離できるため、隔離度は高くセキュアです。ただ、新規ユーザを収容するためにVLAN設定、VMの作成、IPアドレスの割り当てが必要であり、VMの動作にもオーバヘッドが発生します。 ポート番号を分けて複数のデーモンを立ち上げる 上記1とは異なり、OSやネットワークは共有しますが、ポート番号を分けて複数のデーモンを立ち上げることにより複数の分散KVSの面を重ねる方法です。 新規ユーザを収容するためにはポート番号の予約、プロセスの起動を行うだけでよく、IPアドレス割り当てやVLAN作成は必要ありません。比較的軽量ですが、ポート番号を間違えて起動すると正常に動作しないばかりでなく、別のユーザのデータが混ざってしまう可能性もあるため、慎重な操作が必要です。 キーにPrefixを付与して名前空間を分離する プロキシサーバからストレージサーバにデータを格納する際、ユーザリクエストに含まれるキーに特定の文字列(Prefix)を付加します。複数のユーザのデータが1つのKVSの面に格納されますが、名前空間で分離されます。 各ストレージサーバにて起動するデーモンは1個でよいので2.よりもさらに軽量ですが、キーの操作処理のためソフトウェアの改変が必要です。今回はソフトウェアの修正が必要なく、比較的軽量な「2.ポート番号を分けて複数のデーモンを立ち上げる」方式を検討することにしました。
設定方法下図のように、Flareを用いてユーザAとユーザBの2面を一つのサーバファームに重ねる構成で説明します。
インデックスサーバにて ユーザAとユーザB用のディレクトリを作成し、ユーザAは12120番ポート、ユーザBは12130番ポートを使用するように設定ファイル(flarei.conf)を作成し、デーモンを起動します。$ pwd /home/admin $ mkdir user-a $ mkdir user-b $ cat > user-a/flarei.conf data-dir = /home/admin/user-a log-facility = local0 server-name [...]