2010年02月24日

Makuosanデーモンと通信する PHP Extensionを作りました

はてなブックマークに登録

Makuosanは複数のサーバ間でファイルやディレクトリの同期をするソフトウエアです。 似たようなソフトウェアにrsyncがありますが、rsyncでは同期する対象のサーバ台数に比例し転送時間が増加してしまいます。
Makuosanはファイルの転送にマルチキャストを利用するため、転送先のサーバ台数が増えても転送時間が変わらないという特徴があります。

Makuosanを利用してファイルの転送を行うためにはMakuosanデーモンと通信して命令を送る必要があります。 これまでは Makuosan に付属する msync というコマンドラインを利用しデーモンと通信する事が必要でした。しかし、この PHP Extension を利用することで PHP で書かれたプログラムからでも直接 Makuosan デーモンと通信する事が可能となります。
用途としては、複数台のサーバにまたがる Web アプリケーションのサービスを提供している時に、リクエストに応じてサーバ間でデータの同期をとる場合等に向いています。

  ---------------------------------------------
  | PHP Program (with MAKUOSAN PHP Extension) |
  ---------------------------------------------
       |
       |
       | "send a.txt"                   ---------------------
       |                           +--->| Makuosan (Host B) |
       |                           |    ---------------------
       v                           |
  ---------------------            |    ---------------------
  | Makuosan (Host A) |---a.txt----+--->| Makuosan (Host C) |
  ---------------------            |    ---------------------
                                   |
                                   |    ---------------------
                                   +--->| Makuosan (Host D) |
                                        ---------------------
 図:Makuosan PHP Extensionを利用しHost Aにある a.txt を
    Host B, C, Dに送信する例

動作環境

PHP 5.3.1とPHP 5.2.12での動作を確認しています。

インストール

Makuosan PHP Extension(makuo_php_ext.zip)のビルドにはPHPの開発環境が必要です。 PHPの開発環境をインストールし以下のコマンドを実行します。
$ wget http://log.blog.klab.org/support/makuo_php_ext/makuo_php_ext.zip
$ unzip makuo_php_ext.zip
$ cd makuo_php_ext
$ phpize
$ ./configure
$ make

成功すると modules 以下に「makuo.so」が生成されます。 正しく動作する事を確認するためには Makuosan デーモンをlocalhost:5000で立ち上げてから以下のコマンドを実行してください。 全てのテストが成功するようでしたら正しくビルドされています。

$ make test

インストールには以下のコマンドを実行します。

$ sudo make install

これで「makuo.so」がPHPの拡張モジュールディレクトリに置かれます。 インストール後は php.ini にextension=makuo.soと追加する、もしくはPHPを起動する際のコマンドラインオプションに「-d extension=makuo.so」と追加することでPHPから使用可能となります。以下のコマンドが実行可能となっている事を確認して下さい。

$ cat conn.php
<?php
$makuosan = new Makuosan();
$makuosan->connect_tcp("127.0.0.1", 5000);
print_r($makuosan->status());
$makuosan->close();
?>
$ php -d extension_dir=modules -d extension=makuo.so conn.php
Array
(
   [process] => 11145
   [version] => 1.2.1
   [basedir] => /home/hoge/makuo-base/
   [mfalloc] => 2
   [command] => 0
   [send op] => 0
   [recv op] => 0
)

使用例

二つのホスト間でファイルを送信する例を書きます。
送信元をホストA・送信先をホストBとし、ホストAにあるfoo.txtをホストBに送信したいとします。 それぞれのホストのディレクトリ構成は次のようになっているとします。

HostA:/home/hoge/
     .
     |-base/
     |---foo.txt
     |-send.php
HostB:/home/hoge/
     .
     |-base/

まず両ホストで Makuosan デーモンを立ち上げます。

HostA $ makuosan -b ./base
HostB $ makuosan -b ./base
次にホストAでPHPプログラムから Makuosan デーモンにsend命令を送ります。
HostA$ cat send.php
<?php
$makuosan = new Makuosan();
$makuosan->connect_tcp("127.0.0.1", 5000);
$makuosan->send("foo.txt");
$makuosan->close();
?>
HostA$ php -d extension=makuo.so send.php
ホストBにfoo.txtが送信されている事が確認できます。
HostB$ ls base
foo.txt

実例

Makuosan PHP Extensionの実例を紹介します。
次のコードではgetMyPageTravelImage関数で指定された条件に対応する画像が既に存在するかをチェックし存在するならその画像を返します。 存在しなかった場合は新しく画像を生成して返しますが、その際 Makuosan を利用して他のサーバへ新しく生成された画像データを転送します。

    public static function getMyPageTravelImage($travelId, $pet)
    {
        $img = self::getCacheData($pet, $travelId);
        if(empty($img)) {
            // 画像生成
            $image = new Imagick();
            // ... 生成処理 ...
            $image->writeImage($path);
            // 同期
            self::send($path);
            $img = file_get_contents($path);
        }
        return $img;
    }
    private static function send($path)
    {
        $makuo = new Makuosan();
        if (!$makuo->connect_unix(Config::get("makuo_unix_domain_socket")) {
            // エラーハンドリング
        }
        if (!$makuo->send($path)) {
            // エラーハンドリング
        } 
        $makuo->close();
    }

まとめ

Makuosan PHP Extensionを利用すると、Webアプリケーションから Makuosan をよりシームレスに利用する事が可能になります。本記事で紹介した以外に、Makuosan PHP Extension は msync に含まれるほぼ全ての操作に対応しています。個々のメソッドの詳しい説明については同梱されているREADMEファイルを参照して下さい。

klab_gijutsu2 at 23:34│Comments(0)TrackBack(0)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント