Home > a++ My RSS

a++ My RSS

  • 2008-11-29 (土)
  • Amazon SimpleDB のパフォーマンス測定メモ

    Amazon EC2 を本格的に使おうかと考えて、いろいろ調べている中で Amazon SimpleDB のパフォーマンス測定などをしてみました。


    Amazon SimpleDB とは、スキーマ定義が不要な Web データベースです。
    アイテム名とその属性名・属性値のペアでデータベースに情報を格納するだけでインデックス化され、いろいろな Query により格納したアイテムを検索することができます。

    Amazon のページにある例だと、次のテーブルのようなイメージですね。SimpleDB ではテーブルに該当するものをドメインと呼びます。

    105385110._V1309942_.gif


    属性の型も一定である必要はなく(あるアイテムは数値、あるアイテムは文字列とかもOK)、またあるアイテムのある属性に複数の値を格納することもできます(それぞれ独立した属性値として検索できる)


    この SimpleDB は REST API や SOAP から制御します。
    そのため、Amazon S3 と同じく EC2 から利用する必要はありません。
    が、Amazon EC2 から使うと「高速に」アクセスできる、という噂もあり、EC2 とセットで試してみました。

    EC2 は一番小さな Small Instance を利用し、アイテムの追加、アイテムの取得、アイテムの検索、アイテムの削除を行ってみました。


    結果は以下の通り。1000リクエストあたりの処理時間(秒・平均値)です。
    アイテムは、属性を 3 つ持たせた合計 100バイトほどの小さなものを利用しました。
    また検索は、[属性値 > 数値] という単純なものを用いています。


    ・アイテムの追加 - 116 sec
    ・アイテムの取得 - 23 sec
    ・アイテムの検索 - 29 sec
    ・アイテムの削除 - 107 sec


    この数値を見ると、リアルタイムなアプリケーションでガリガリ(たとえばセッション情報の管理とか)というほど速くはないですね。
    ただ、REST API なので、ソケットを非ブロックモードで開いて並列にクエリを投げるなどの工夫をすることで、もう少しクリティカルな用途にも使える可能性があると思います。


    なお、REST API は単純に file_get_contents() で実施したのですが、https://sdb.amazonaws.com/ への https 接続のオーバーヘッドだけを測定してみると、1000リクエストあたり 15 秒かかっていることがわかりました。EC2以外のサーバーからより速いことは確かです。

    データ量が少ないので微妙ではありますが、このパフォーマンスを念頭において設計するといろいろと使い道があると思います。

    永続ストレージサービスである Amazon EBS も同時にはひとつのインスタンスにしか接続できないので、複数インスタンスからガンガン使える SimpleDB はそれはそれとして便利ではあると思うので。


    ということで参考になれば。


    あと、テストで使ったPHPのサンプルコードも晒しておきます。
    Amazon が配布しているサンプルコードから必要なところだけを抜き取っただけの適当なものですが、簡単にアクセスできるのが分かるかと思いますので。


    まず、こんな関数を用意しておいて・・・

    function send_sdb_request($params){

        $access_key = "<< AWS Access ID >>";
        $secret_key = "<< AWS Secret Key >>";
        
        $params["AWSAccessKeyId"] = $access_key;
        $params["SignatureVersion"] = 1;
        $params["Timestamp"] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
        $params["Version"] = "2007-11-07";
        
        uksort($params, 'strcasecmp');
        $data = "";
        $query = "";
        foreach ($params as $parameterName => $parameterValue) {
            $data .= $parameterName . $parameterValue;
            if ($query) $query .= "&";
            $query .= $parameterName . "=" . urlencode($parameterValue);
        }
        $signature = base64_encode(hash_hmac('sha1', $data, $secret_key, true));
        $url = "https://sdb.amazonaws.com/?" . $query . "&Signature=" . urlencode($signature);
        return file_get_contents($url);
    }


    ドメイン(テーブルみたいなもの)を作成するにはこんな感じ。

    function createDomain($domain){

        $params = array(
            "Action" => "CreateDomain",
            "DomainName" => $domain
        );
        return send_sdb_request($params);
    }
    $result = createDomain("MyDomain");


    検索するにはこんな感じ。

    function query($domain, $expression){

        $params = array(
            "Action" => "Query",
            "DomainName" => $domain,
            "QueryExpression" => $expression
        );
        return send_sdb_request($params);
    }
    $result = query("MyDomain", "['price' > '800']");


    その他のリクエストについては Amazon のマニュアル を見てください。


[Powered by nuwaa-jyuku.com]

Home > a++ My RSS

Search
Feeds

Page Top