======================
分散実行による負荷分散
======================
ここでは,RaSCを使って複数の計算機で分散処理を行うサンプルを動作させる手順を説明します.
仮想マシンを用いて分散処理を行うため,以下を前もってインストールしてください.
- `VirtualBox `_ 仮想マシンを作成・実行するためのソフトウェアです.
- `Vagrant `_ VirtualBoxをコマンドラインから操作するツールです.
また,仮想マシン群へのRaSCサービスのセットアップを行うため,以下をインストールしてください.
- `Fabric `_ Pythonによる,デプロイメントツールです.
仮想マシンによるテスト環境の用意
================================
ここでは,下図に示す分散処理を構成します.
"ワーカ" と呼ばれるノードは,ある処理を行うRaSCサービスに相当します. "集約サーバ" は,複数のワーカを並列で実行し,その結果を集約します.
また,負荷分散サーバは,複数の集約サーバに対してラウンドロビンなどの負荷分散を行います.
.. figure:: img/rasc_parallel.png
:width: 50%
:align: center
図1: 分散処理の構成
ここではワーカに,配備された計算機の環境変数を取得するRaSCサービス (SampleSearchWorker) を用います.また集約サーバには,複数の SampleSearchWorker の結果を集約して返す SampleSearchServer を用います.
これらのサービスは共通のインターフェース SampleSearchService を持ちます.[#f1]_
VirtualBox, Vagrantを用いて仮想マシンを準備します.下記のように,仮想マシンのイメージ(Box)をダウンロードし,仮想マシンを起動します.
.. code-block:: bash
$ mkdir rasc_parallel && cd rasc_parallel
$ wget https://alaginrc.nict.go.jp/rasc/resources/Vagrantfile
$ vagrant box add RaSC_Ready https://alaginrc.nict.go.jp/rasc/resources/rasc_ready.box
$ vagrant up
これによって,192.168.33.11〜17 の仮想マシンが起動します.
RaSCサービスの配備
==================
次に,RaSCのレポジトリをクローンします.
.. code-block:: bash
$ git clone https://github.com/nict-wisdom/rasc.git
分散処理のためのセットアップを行う機構は, rasc_deployer にあります.
tutorial_parallel.properties という設定ファイルを使用します.services, workers, servers, proxyserver というセクションに重要な設定があります.
以下ではそれぞれを簡単に紹介します.
servicesセクションには,配備するサービスを記述します.以下では,集約サーバの実装が SampleSearchServer (レポジトリ内jp.go.nict.isp.webapps.samplesearch.server),
ワーカの実装が SampleSearchWorker (レポジトリ内jp.go.nict.isp.webapps.samplesearch.worker), サービスのインターフェースが jp.go.nict.isp.wisdom2013.api.samplesearch.SampleSearchService であることが記述されています.
.. code-block:: python
[services]
servicesdef={
"samplesearch" : { "server" : {"path" : 'jp.go.nict.isp.webapps.samplesearch.server' , "name" : "SampleSearchServer" } ,
"worker" : {"path":'jp.go.nict.isp.webapps.samplesearch.worker' , "name" : "SampleSearchWorker" } , "timeout" : 60000 , "rewriteEndpoint" : True ,
"interface" : "jp.go.nict.isp.wisdom2013.api.samplesearch.SampleSearchService" , "msgpackPort" : 9011 } }
workersセクションには,ワーカを配備するノード,ポート,起動スクリプト,通信プロトコルが記述されています.
.. code-block:: python
[workers]
workers={ "workers1" : { "host" : [("192.168.33.", 11, 12)] , "port" : 8080 , "services" : "all" } ,
"workers2" : { "host" : [("192.168.33.", 13, 14)] , "port" : 8080 , "services" : "all" } }
scripts.start=jp.go.nict.langrid.webapps.jetty.embedded/scripts/RunAllWorker/start_runallworkers.sh
scripts.stop=jp.go.nict.langrid.webapps.jetty.embedded/scripts/RunAllWorker/stop_runallworkers.sh
worker.servicetype=msgpackRPC
同様にserversセクションには,集約サーバを配備するノード,ポート,起動スクリプト,通信プロトコルが記述されています.
.. code-block:: python
[servers]
servers={ "server1" : { "host" : [("192.168.33.", 15, 15)] , "port" : 8080 , "workers" : ["workers1","workers2"] , "services" : "all" } ,
"server2" : { "host" : [("192.168.33.", 16, 16)] , "port" : 8080 , "workers" : ["workers2","workers1"] , "services" : "all" }}
scripts.start=jp.go.nict.langrid.webapps.jetty.embedded/scripts/RunAllServers/start_runallserver.sh
scripts.stop=jp.go.nict.langrid.webapps.jetty.embedded/scripts/RunAllServers/stop_runallserver.sh
server.servicetype=jsonRPC
proxyserverセクションには,負荷分散サーバを配備するノード,ポート,起動スクリプト,通信プロトコルが記述されています.
.. code-block:: python
[proxyserver]
proxy={ "host": [("192.168.33.", 17, 17)] ,"port" : 8080 }
scripts.start=jp.go.nict.langrid.webapps.jetty.embedded/scripts/start_proxy.sh
scripts.stop=jp.go.nict.langrid.webapps.jetty.embedded/scripts/stop_proxy.sh
target.project=jp.go.nict.ial.webapps.wisdom.proxy
proxy.servicetype=msgpackRPC
これらの設定は,すでに起動済みの仮想マシンと合致していますので,下記のようにFabricによる配備スクリプトを実行します.
deployAllservers, deployAllworkers, deployproxyタスクにより,ワーカ,集約サーバ,負荷分散サーバがビルドされ,
それぞれの仮想マシンに配備されます.また,続いてstartAllservers, startAllworkers, startproxyタスクにより,
仮想マシンで起動されます.
.. code-block:: bash
$ cd rasc/rasc_deployer
$ eval `ssh-agent` && ssh-add ~/.vagrant.d/insecure_private_key # 仮想マシンへの認証
$ fab config:'tutorial_parallel.properties' deployAllservers -u vagrant # 仮想マシンのユーザ名を指定
$ fab config:'tutorial_parallel.properties' deployAllworkers -u vagrant
$ fab config:'tutorial_parallel.properties' deployproxy -u vagrant
$ fab config:'tutorial_parallel.properties' startAllservers -u vagrant
$ fab config:'tutorial_parallel.properties' startAllworkers -u vagrant
$ fab config:'tutorial_parallel.properties' startproxy -u vagrant
RaSCサービスの実行
==================
ブラウザで以下のアドレスにアクセスしてみましょう.
- 集約サーバ1 http://192.168.33.15:8080/jp.go.nict.isp.webapps.samplesearch.server/jsonServices
- 集約サーバ2 http://192.168.33.16:8080/jp.go.nict.isp.webapps.samplesearch.server/jsonServices
- 負荷分散サーバ http://192.168.33.17:8080/jp.go.nict.ial.webapps.wisdom.proxyservice/jsonServices
いずれでも,ブラウザからRaSCサービスを呼び出すための画面が開きます.
getValuesというメソッドの右端にある "+" をクリックします.パラメータの入力エリアが開きますので,下記のように入力してください...
.. code-block:: json
[{"envName":"HOSTNAME"}]
実行すると,各仮想マシンで環境変数 HOSTNAME が取得されます.
集約サーバでは,接続されたワーカのノードのホスト名が返されます.
負荷分散サーバでは,実行の度に使用する集約サーバが変わるため,返されるホスト名も変わります.
.. [#f1] ここで用いている集約サーバ・ワーカの実装は,GitHub に登録されたプロジェクトjp.go.nict.isp.wrapper.samplesearch.server, jp.go.nict.isp.wrapper.samplesearch.worker, jp.go.nict.isp.webapps.samplesearch.server, jp.go.nict.isp.webapps.samplesearch.worker にあります.