圧縮

概要

圧縮 (compaction) とは、データベース・ファイルを書き直し、古いドキュメント・リビジョンや削除されたドキュメントを除去する操作です。圧縮は、2008/04/07 以降の SVN からビルドされた CouchDB、およびバージョン 0.8-incubating 以降の公式リリースの CouchDB で利用できます。

圧縮は、データベースごとに手動でトリガします。今後は、複数のデータベースをキューに入れて圧縮できるようにする予定です。

圧縮は、目的のデータベースの _compact サブリソースに対して HTTP POST リクエストを実行することでトリガされます。成功すると、HTTP ステータス 202 が返されます。

    # POST http://localhost/my_db/_compact via curl
    curl -X POST http://localhost/my_db/_compact
    #=> {"ok":true}

データベース URL ( [WWW] http://localhost/my_db ) に対して GET リクエストを実行すると、次のようなステータスのハッシュが返されます。

    curl http://localhost/my_db
    #=> {"db_name":"my_db","doc_count":0,"doc_del_count":1,"update_seq":3,"compact_running":false,"disk_size":14341}

圧縮中は compact_running キーが true に設定されます。

書き込みの多いデータベースの圧縮について

書き込みの負荷がほぼ限界に達しているデータベース・ノードに対して圧縮を行うのは避けるべきです。なぜなら、もし書き込みがいつまでも終わらなければ、圧縮プロセスは書き込みに追い付くことができず、最後はディスクスペースを使い切ってしまうからです。

圧縮は、書き込み負荷が限界に達していないときに行う必要があります。なお、読み込み負荷は圧縮プロセスには影響しません。CouchDB のこのような動作はクライアントへの影響を最小限に抑えるためで、データベースをオンライン状態に保って読み取りと書き込みに対して完全に機能するようになっています。書き込み負荷が限界に達しているときにデータベースの圧縮を完了できないのは、設計上の制約です。したがって、オフピーク時に圧縮をスケジュールするのが妥当な解決策です。

クラスタ環境では、任意のノードで書き込み負荷を下げてから圧縮を実行し、レプリケーションが完了したら書き込み負荷を元どおりに戻すといった対応が可能です。

将来的には、書き込み負荷があまりに重過ぎて一定時間内に完了しない場合、ほかの更新を停止するか失敗させる形で単一の CouchDB ノードの動作を変更できるようする予定です。

last edited 2008-06-29 08:50:13 by BenoitC