DRbQS で処理を分散させる(1. 概要)
ruby で行う処理を複数台の PC に分散させて計算をさせるために書いていたプログラムが ある程度の大きさになってしまったので DRbQS という gem にした。 似たようなことに使用するライブラリはいくつかあるのだが、 私の用途には使い勝手が悪かったので、自分で書くことになってしまった。 忘れないうちに以下にいろいろとメモをしておく。
Requirements
- Fiber を利用しているので ruby 1.8 では動かない。
- fork を使っている部分があるので、今のままでは windows では動かない。
主に ubuntu 上の ruby 1.9.3 でテストをしている。 他の gem への依存関係があるが、gem を使ってインストールすれば 自動でインストールされるはず。 他のマシンにサーバーやノードを起動させるために SSH を使うので、 SSH がインストールされた Linux が主要な対象。
機能
あらかじめ分割しておいた処理を druby を使って (ローカルホストか SSH サーバー上の)別のプロセスに送信して 実行させる。実行結果はサーバーに集められ、 指定の後処理を実行される。 別プロセスとの送受信はオブジェクトを marshal してバイト列に変換して行い、 計算ノードで指定したメソッドを実行しているだけなので、 大したことはしていない。 そのため、marshal できないオブジェクトはサーバーと計算ノード間でやりとりできない。
処理を分散させる部分は機能が充実しているわけではないけれど、 SSH で別のマシンにプロセスを起動させるたことは容易にできるようになっている。 コマンドで SSH サーバーに接続してプロセスを実行することや DSL に記述したサーバーや計算ノードの設定から各 SSH サーバー上で プロセスを実行することもできる。
計算ノードのマシンは10台くらいならば問題なく動いているが、 あまりに台数が多い場合は何か不都合が出るかもしれないので注意。
TODO
- 実行中のサーバーにキューを登録するのはあまり得意ではない。
- 登録されている処理はファイルや何らかのデータベースに書きだされるわけではないので サーバーが異常終了した場合は実行されていない処理は失われてしまう。
- druby を使っているけれど、単にバイト列の送信に使っているだけなので eventmachine あたりで実装したほうが効率は良さそう。
- 今のところ SSH を使うところでパスワードや鍵は指定できない。鍵を指定できるようにしたい。
これらは、私自身があまり使わない機能なので、実装するかどうかはわからないです。 もし、実装してみようという方がいらっしゃりましたら
で連絡をいただければ、喜んで協力いたします。
コマンド
drbqs-server
サーバーを起動させる。
drbqs-node
計算ノードを起動させる。
drbqs-manage
サーバーから状態を取得したり、サーバーにシグナルを送信したりする。
drbqs-ssh
SSH で接続したマシンにサーバーや計算ノードを起動するために使う。
drbqs-execute
サーバーや計算ノードの設定を書いた DSL を読み込んで 計算に必要なプロセスを各マシン上で実行するために使う。