Droongaチュートリアル: 実験用の仮想マシンを用意する手順

チュートリアルのゴール

実験用に複数(3台)の仮想マシンを用意する手順を学ぶこと。

なぜ仮想マシンが必要なのか?

Droongaは分散型のデータ処理システムなので、クラスタを構成するには複数の台のコンピュータを用意する必要があります。 安全のためにも(そしてより良い性能を得るためにも)、Droongaノードにはそれ用のコンピュータを用意することが望ましいです。

有効なレプリケーションのためには、2台以上のコンピュータが必要です。 また、クラスタ構成の管理を試してみるには、3台以上のコンピュータが必要となります。

しかしながら、仮に、単に検証や開発をしたい場合でも、複数の仮想マシンのインスタンスをVPSサービスで利用するにはお金がかかります。 そのような用途では、あなたの手持ちのコンピュータ上でプライベートな仮想マシンを使うのがおすすめです。

幸いなことに、Vagrantを使うと仮想マシンを簡単に管理することができます。 このチュートリアルでは、Vagrantを使って3台の仮想マシンを用意する手順を解説します。

ホストマシンを用意する

まず最初に、仮想マシンのホストとなるPCを用意する必要があります。 仮想マシンは多くのRAMを要求する場合があるため、ホストマシンにはできれば8GB以上のメモリがあることが望ましいです。

多くの場合、メジャーなプラットフォーム向けにはビルド済みのバイナリが使われるため、それほど多くのRAMは必要ではありません。 しかしながら、仮想マシン上で動作する環境がマイナーなディストリビューションであったり、そのディストリビューションの最新のバージョンであった場合には、その環境向けのビルド済みバイナリが用意されていないことがあり得ます。そのような場合、バイナリは自動的にコンパイルされますが、その際に2GB程度のメモリが要求されます。 ネイティブ拡張のビルド時に奇妙なエラーに遭遇した場合は、仮想マシンのメモリの割り当て量を増やして再度インストールを行って下さい。 (このチュートリアルの付録も参照して下さい。)

仮想マシンを用意する手順

VirtualBoxをインストールする

Vagrantには、仮想マシンを実行するためのバックエンドが必要です。ここでは推奨環境のVirtualBoxをインストールすることにします。 例えば、ホストマシンがUbuntuで動作するPCなのであれば、VirtualBoxは以下のようにaptコマンドでインストールできます:

$ sudo apt-get install virtualbox

その他の環境では、VirtualBoxのWebサイトにある手順に従ってVirtualBoxをインストールして下さい。

Vagrantをインストールする

次に、Vagrantをインストールします。VagrantのWebサイトにある手順に従って、Vagrantをインストールして下さい。 例えば、ホストマシンがx64のUbuntu PCなのであれば、以下の要領です:

$ wget https://releases.hashicorp.com/vagrant/1.8.1/vagrant_1.8.1_x86_64.deb
$ sudo dpkg -i vagrant_1.8.1_x86_64.deb

注意: Ubuntu 15.10ではapt-get install vagrantでもVagrantをインストールできますが、これは使わないで下さい。この方法でインストールできるVagrantはバージョンが古いため、Vagrant Cloudからboxをインポートできません。

boxの種類を決めて、Vagrantfileを用意する

Vagrant Cloudのサイトから、実験に使うためのboxを選びます。 例えばUbuntu Wily (x64)のboxを使うのであれば、以下のようにします:

$ mkdir droonga-ubuntu-wily
$ cd droonga-ubuntu-wily
$ vagrant init ubuntu/wily64

この操作で、設定ファイルのVagrantfileが自動生成されます。 しかし、このファイルはDroongaクラスタの実験のために、以下のように完全に書き換えてしまいます:

Vagrantfile:

n_machines = 3
box        = "ubuntu/wily64"

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  n_machines.times do |index|
    config.vm.define :"node#{index}" do |node_config|
      node_config.vm.box = box
      node_config.vm.network(:private_network,
                             :ip => "192.168.100.#{50 + index}")
      node_config.vm.hostname = "node#{index}"
      node_config.vm.provider("virtualbox") do |virtual_box|
        virtual_box.memory = 2048
      end
      node_config.vm.provision 'shell', :inline => 'apt-get -y purge chef && apt-get -y autoremove'
    end
  end
end

注:このVagrantfileでは、3つの仮想マシンを2GB(2048MB)のメモリを伴って定義しています。 ですので、ホストマシンは6GB以上のメモリを搭載している必要があります。 もしホストマシンのメモリがそこまで多くないのであれば、この時点では512(512MB)などの適当な値を設定しておいて下さい。

仮想マシンを起動する

仮想マシンは、vagrant upというコマンドで起動できます:

$ vagrant up
Bringing machine 'node0' up with 'virtualbox' provider...
Bringing machine 'node1' up with 'virtualbox' provider...
Bringing machine 'node2' up with 'virtualbox' provider...
...

これにより、Vagrantは自動的に仮想マシンのイメージをVagrant CloudのWebサイトからダウンロードし、それが終わり次第仮想マシンを起動します。 用意が完了すると、仮想ネットワーク上のIPアドレスとして192.168.100.50192.168.100.51192.168.100.52をそれぞれ持つ3台の仮想マシンが動作している状態になります。

仮想マシンが正しく動いていることを確認しましょう。 仮想マシンにはvagrant sshコマンドを使って以下のようにログインできます:

$ vagrant ssh node0
Welcome to Ubuntu 15.10 (GNU/Linux 4.2.0-23-generic x86_64)
...
vagrant@node0:~$ exit

仮想マシンをSSHクライアントに登録する

仮想マシンにログインするためには、通常のsshコマンドではなく、vagrant sshコマンドを使わなくてはなりません。 また、その前にはVagrantfileがあるディレクトリにcdする必要もあります。 これは少々面倒です。

ですので、SSHクライアントのローカル設定ファイルに、以下のようにして仮想マシンのための設定を追加しておきましょう:

$ vagrant ssh-config node0 >> ~/.ssh/config
$ vagrant ssh-config node1 >> ~/.ssh/config
$ vagrant ssh-config node2 >> ~/.ssh/config

これで、vagrant sshコマンドを使わずとも、仮想マシンの名前を指定してログインできるようになります:

$ ssh node0

仮想マシン同士で互いのホスト名を名前解決できるように設定する

ネームサーバがないので、各仮想マシンはお互いのホスト名を名前解決する事ができません。 そのため、現時点ではそれぞれのIPアドレスを直接書く必要があります。 これは非常に面倒です。

なので、各仮想マシンのhostsファイルを以下のように編集しておきましょう:

/etc/hosts:

127.0.0.1 localhost
192.168.100.50 node0
192.168.100.51 node1
192.168.100.52 node2

これで、各マシンはお互いにホスト名を指定して通信できるようになります。

仮想マシンの終了

仮想マシンは、vagrant haltコマンドでまとめて終了できます:

$ vagrant halt

これで、Vagrantがすべての仮想マシンを完全に終了させてくれます。

仮想マシンで行った変更を取り消す

仮想マシンの中で行ったすべての変更を取り消したい場合は、単純にvagrant destroy -fというコマンドを実行すればOKです:

$ vagrant destroy -f
$ vagrant up

これで、すべての変更を取り消して、仮想マシンをまっさらの状態で起動し直すことができます。 この方法はインストールスクリプトの改修などの作業をする時に便利でしょう。

付録: ホストマシンのRAMがそれほど多くない場合

手持ちのコンピュータが十分なサイズのメモリを搭載していないとしても、諦める必要はありません。

各仮想マシンに2GBのメモリが必要になるのは、Rroongaのネイティブ拡張をビルドする必要があるからです。 言い換えると、既にビルド済みのバイナリがあるのであれば、Droongaノードはそこまでのメモリがなくても動作します。

ですので、以下のようにすると、各仮想マシンに順番にDroongaのサービスをインストールしていくことができます:

  1. vagrant haltですべての仮想マシンを終了する。
  2. virtualboxでVirtualBoxのコンソールを開く。
  3. 1台の仮想マシンのプロパティを開き、メモリの大きさを2GB(2048MB)に設定し直す。
  4. VirtualBoxのコンソールからその仮想マシンを起動する。
  5. 仮想マシンにログインし、Droongaのサービスをインストールする。
  6. 仮想マシンを終了する。
  7. 仮想マシンのプロパティを開き、メモリの大きさを元に戻す。
  8. 3から7の手順を他の仮想マシンにも繰り返す。

付録: 他のコンピュータから仮想マシン上のサービスに直接アクセスする

ホストマシンが(リモートにある)サーバで、あなたが主に手元の別のPCを操作している状況において、仮想マシン内で動作しているHTTPサーバに手元のPCから直接接続したいと思うことがあるかもしれません。 例えば、Google Chrome、Mozilla FirefoxのようなWebブラウザを使って管理ページを操作してみたい場合などです。

このような場面では、OpenSSHのポートフォワーディング機能を使うと良いでしょう。 以下のコマンドをホストマシン上で実行してください。

% ssh vagrant@192.168.100.50 \
      -i ~/.vagrant.d/insecure_private_key \
      -g \
      -L 20041:localhost:10041

これにより、仮想マシンnode0192.168.100.50)上のdroonga-http-serverが提供している管理ページに、http://(ホストマシンのIPアドレスまたはホスト名):20041/というURLで実際にアクセスする事ができます。 この時、ホストマシン上で動作しているOpenSSHのクライアントによって、20041番ポートに流れ込んできたパケットはすべて仮想マシン内の10041番ポートに転送されます。

まとめ

このチュートリアルでは、Droongaノード用に3台の仮想マシンを用意する手順を学びました。

これで、「使ってみる」のチュートリアルを複数ノードで実践できます。