Droongaチュートリアル: データベースのバックアップと復元

チュートリアルのゴール

データのバックアップと復元を手動で行う際の手順を学ぶこと。

前提条件

Droongaクラスタのデータをバックアップする

drndump のインストール

最初に、Rubygems経由で drndump と名付けられたコマンドラインツールをインストールします:

# gem install droonga-engine

その後、drndump コマンドが正しくインストールできたかどうかを確認します:

# drndump --version
drndump 1.0.0

Droongaクラスタ内のデータをダンプする

drndump コマンドはすべてのスキ−マ定義とデータをJSONs形式で取り出します。既存のDroongaクラスタのすべての内容をダンプ出力してみましょう。

例えば、クラスタが 192.168.0.10192.168.0.11 の2つのノードから構成されていて、別のホスト 192.168.0.12 にログインしている場合、コマンドラインは以下の要領です。

# drndump --host=192.168.0.10 \
           --receiver-host=192.168.0.12
{
  "type": "table_create",
  "dataset": "Default",
  "body": {
    "name": "Location",
    "flags": "TABLE_PAT_KEY",
    "key_type": "WGS84GeoPoint"
  }
}
...
{
  "dataset": "Default",
  "body": {
    "table": "Store",
    "key": "store9",
    "values": {
      "location": "146702531x-266363233",
      "name": "Macy's 6th Floor - Herald Square - New York NY  (W)"
    }
  },
  "type": "add"
}
{
  "type": "column_create",
  "dataset": "Default",
  "body": {
    "table": "Location",
    "name": "store",
    "type": "Store",
    "flags": "COLUMN_INDEX",
    "source": "location"
  }
}
{
  "type": "column_create",
  "dataset": "Default",
  "body": {
    "table": "Term",
    "name": "store_name",
    "type": "Store",
    "flags": "COLUMN_INDEX|WITH_POSITION",
    "source": "name"
  }
}

以下の点に注意して下さい:

実行結果は標準出力に出力されます。 結果をJSONs形式のファイルに保存する場合は、リダイレクトを使って以下のようにして下さい:

# drndump --host=192.168.0.10 \
          --receiver-host=192.168.0.12 \
    > dump.jsons

Droongaクラスタのデータを復元する

droonga-clientのインストール

drndump コマンドの実行結果は、Droonga用のメッセージの一覧です。

Droongaクラスタにそれらのメッセージを送信するには、droonga-request コマンドを使います。 このコマンドを含んでいるGemパッケージ droonga-client をインストールして下さい:

# gem install droonga-client

droonga-request コマンドが正しくインストールされた事を確認しましょう:

# droonga-request --version
droonga-request 0.1.7

空のDroongaクラスタを用意する

2つのノード 192.168.0.10192.168.0.11 からなる空のクラスタがあり、今 192.168.0.12 にログインして操作を行っていて、ダンプファイルが dump.jsons という名前で手元にあると仮定します。

もし順番にこのチュートリアルを読み進めているのであれば、クラスタとダンプファイルが既に手元にあるはずです。以下の操作でクラスタを空にしましょう:

(on 192.168.0.10)
# cd ~/droonga
# kill $(cat $PWD/droonga-engine.pid)
# rm -r 000
# host=192.168.0.10
# droonga-engine --host=$host \
                 --log-file=$PWD/droonga-engine.log \
                 --daemon \
                 --pid-file=$PWD/droonga-engine.pid

(on 192.168.0.11)
# cd ~/droonga
# kill $(cat $PWD/droonga-engine.pid)
# rm -r 000
# host=192.168.0.11
# droonga-engine --host=$host \
                 --log-file=$PWD/droonga-engine.log \
                 --daemon \
                 --pid-file=$PWD/droonga-engine.pid

これでクラスタは空になりました。確かめてみましょう:

# endpoint="http://192.168.0.10:10041/d"
# curl "${endpoint}/select?table=Store&output_columns=name&limit=10"
[[0,1401363465.610241,0],[[[null],[]]]]

ダンプ結果から空のDroongaクラスタへデータを復元する

drndump の実行結果はダンプ出力元と同じ内容のデータセットを作るために必要な情報をすべて含んでいます。そのため、クラスタが壊れた場合でも、ダンプファイルからクラスタを再構築する事ができます。 やり方は単純で、単にダンプファイルを droonga-request コマンドを使ってからのクラスタに流し込むだけです。

ダンプファイルからクラスタの内容を復元するには、以下のようなコマンドを実行します:

# droonga-request --host=192.168.0.10 \
                    --receiver-host=192.168.0.12 \
                    dump.jsons
Elapsed time: 0.027541763
{
  "inReplyTo": "1401099940.5548894",
  "statusCode": 200,
  "type": "table_create.result",
  "body": [
    [
      0,
      1401099940.591563,
      0.00031876564025878906
    ],
    true
  ]
}
...
Elapsed time: 0.008678467
{
  "inReplyTo": "1401099941.0794394",
  "statusCode": 200,
  "type": "column_create.result",
  "body": [
    [
      0,
      1401099941.1154332,
      0.00027871131896972656
    ],
    true
  ]
}

以下の点に注意して下さい:

これで、データが完全に復元されました。確かめてみましょう:

# curl "${endpoint}/select?table=Store&output_columns=name&limit=10"
[[0,1401363556.0294158,0.0000762939453125],[[[40],[["name","ShortText"]],["1st Avenue & 75th St. - New York NY  (W)"],["76th & Second - New York NY  (W)"],["Herald Square- Macy's - New York NY"],["Macy's 5th Floor - Herald Square - New York NY  (W)"],["80th & York - New York NY  (W)"],["Columbus @ 67th - New York NY  (W)"],["45th & Broadway - New York NY  (W)"],["Marriott Marquis - Lobby - New York NY"],["Second @ 81st - New York NY  (W)"],["52nd & Seventh - New York NY  (W)"]]]]

既存のクラスタを別の空のクラスタに複製する

複数のDroongaクラスタが存在する時に、drndumpdroonga-request の2つのコマンドを併用すると、片方のクラスタの内容をもう片方に複製する事ができます。

drndump コマンドは結果を標準出力に出力します。 その一方で、droonga-request コマンドは標準入力からメッセージを受け取る事ができます。 ですので、これらをパイプで繋げるだけで、片方のクラスタの内容をもう片方に複製できます。

複数のDroongaクラスタを用意する

ノード 192.168.0.10 を含む複製元クラスタと、ノード 192.168.0.11 を含む複製先クラスタの2つのクラスタがあり、今 192.168.0.12 にログインして操作を行っていると仮定します。

もし順番にこのチュートリアルを読み進めているのであれば、2つのノードを含むクラスタが手元にあるはずです。以下の操作で2つのクラスタを作り、1つを空にしましょう:

(on 192.168.0.10)
# host=192.168.0.10
# droonga-engine-catalog-generate --hosts=$host \
                                  --output=~/droonga/catalog.json

(on 192.168.0.11)
# cd ~/droonga
# kill $(cat $PWD/droonga-engine.pid)
# rm -r 000
# host=192.168.0.11
# droonga-engine-catalog-generate --hosts=$host \
                                  --output=$PWD/catalog.json
# droonga-engine --host=$host \
                 --log-file=$PWD/droonga-engine.log \
                 --daemon \
                 --pid-file=$PWD/droonga-engine.pid

これで、ノード 192.168.0.10 を含む複製元クラスタと、ノード 192.168.0.11 を含む複製先の空のクラスタの、2つのクラスタができました。確かめてみましょう:

# curl "http://192.168.0.10:10041/d/select?table=Store&output_columns=name&limit=10"
[[0,1401363556.0294158,0.0000762939453125],[[[40],[["name","ShortText"]],["1st Avenue & 75th St. - New York NY  (W)"],["76th & Second - New York NY  (W)"],["Herald Square- Macy's - New York NY"],["Macy's 5th Floor - Herald Square - New York NY  (W)"],["80th & York - New York NY  (W)"],["Columbus @ 67th - New York NY  (W)"],["45th & Broadway - New York NY  (W)"],["Marriott Marquis - Lobby - New York NY"],["Second @ 81st - New York NY  (W)"],["52nd & Seventh - New York NY  (W)"]]]]
# curl "http://192.168.0.11:10041/d/select?table=Store&output_columns=name&limit=10"
[[0,1401363465.610241,0],[[[null],[]]]]

2つのDroongaクラスタの間でデータを複製する

複製元クラスタから複製先クラスタへデータを複製するには、以下のようなコマンドを実行します:

# drndump --host=192.168.0.10 \
           --receiver-host=192.168.0.12 | \
    droonga-request --host=192.168.0.11 \
                    --receiver-host=192.168.0.12
Elapsed time: 0.027541763
{
  "inReplyTo": "1401099940.5548894",
  "statusCode": 200,
  "type": "table_create.result",
  "body": [
    [
      0,
      1401099940.591563,
      0.00031876564025878906
    ],
    true
  ]
}
...
Elapsed time: 0.008678467
{
  "inReplyTo": "1401099941.0794394",
  "statusCode": 200,
  "type": "column_create.result",
  "body": [
    [
      0,
      1401099941.1154332,
      0.00027871131896972656
    ],
    true
  ]
}

以上の操作で、2つのクラスタの内容が完全に同期されました。確かめてみましょう:

# curl "http://192.168.0.10:10041/d/select?table=Store&output_columns=name&limit=10"
[[0,1401363556.0294158,0.0000762939453125],[[[40],[["name","ShortText"]],["1st Avenue & 75th St. - New York NY  (W)"],["76th & Second - New York NY  (W)"],["Herald Square- Macy's - New York NY"],["Macy's 5th Floor - Herald Square - New York NY  (W)"],["80th & York - New York NY  (W)"],["Columbus @ 67th - New York NY  (W)"],["45th & Broadway - New York NY  (W)"],["Marriott Marquis - Lobby - New York NY"],["Second @ 81st - New York NY  (W)"],["52nd & Seventh - New York NY  (W)"]]]]
# curl "http://192.168.0.11:10041/d/select?table=Store&output_columns=name&limit=10"
[[0,1401363556.0294158,0.0000762939453125],[[[40],[["name","ShortText"]],["1st Avenue & 75th St. - New York NY  (W)"],["76th & Second - New York NY  (W)"],["Herald Square- Macy's - New York NY"],["Macy's 5th Floor - Herald Square - New York NY  (W)"],["80th & York - New York NY  (W)"],["Columbus @ 67th - New York NY  (W)"],["45th & Broadway - New York NY  (W)"],["Marriott Marquis - Lobby - New York NY"],["Second @ 81st - New York NY  (W)"],["52nd & Seventh - New York NY  (W)"]]]]

2つのDroongaクラスタを結合する

これらの2つのクラスタを結合するために、以下のコマンド列を実行しましょう:

(on 192.168.0.10, 192.168.0.11)
# droonga-engine-catalog-generate --hosts=192.168.0.10,192.168.0.11 \
                                  --output=~/droonga/catalog.json

これで、1つだけクラスタがある状態になりました。最初の状態に戻ったという事になります。

まとめ

このチュートリアルでは、Droongaクラスタのバックアップとデータの復元の方法を実践しました。 また、既存のDroongaクラスタの内容を別の空のクラスタへ複製する方法も実践しました。

続いて、既存のDroongaクラスタに新しいreplicaを追加する手順を学びましょう。