2

2 つの Redis インスタンス (または 2 つのそれぞれの dump.rdb ファイル) があり、それぞれの初期インスタンスに 1 つずつ、2 つのデータベースを持つ単一のインスタンスにそれらを結合したいと考えています。

MIGRATE を使用してこれを行うこともできますが、現在の Redis サーバーではサポートされていない Redis 2.6.0 でのみ使用できます。

4

3 に答える 3

9

編集

この回答は、新しいバージョンの redis では正確ではなくなりました。歴史的な理由から答えを残します。


バイナリ ファイルを少しいじってみたい場合は、2 つの dump.rdb ファイルを簡単に 1 つに結合できます。

仮定:

  1. 各ダンプには 1 つのデータベース (デフォルト データベース) しかありません。
  2. Redis 2.4.x を使用しているため、ダンプ バージョンは 2 または 3 です。

ファイルを 16 進エディタで開くと、RDB ファイルの形式は次のようになります。

REDIS000x FE 00 <actual data > FF

ここ -

  • 000xrdb のバージョン番号です。あなたの場合は0002または0003である可能性が最も高いです
  • FEはデータベース セレクタ、00はデータベース番号です。
  • <actual data>現在のデータベースのキーと値のペアです。現在の目的では、これをバイナリ BLOB として扱うことができます。
  • FFファイルの最後のバイトであり、rdb ファイルの終わりを示します

したがって、2 つの rdb ファイルをマージするには、次のようにします -

  1. 新しい宛先ファイルを作成する
  2. 最後のファイルを除く最初のファイルからすべてをコピーしますFF
  3. FE 012 番目のデータベースの開始を示すために2 バイトをコピーします
  4. 注 : 2 つのデータベースに重複するキーがないことが確実で、それらを 1 つのデータベースに結合したい場合は、FE 01上記の 2 バイトをスキップしてください。
  5. 2 番目のファイルから、最初の 11 バイトをスキップします。つまり、スキップします。REDIS000x FE 00
  6. 最後のバイトを含む 2 番目のファイルの残りをコピーします。FF

この新しい dump.rdb を redis の適切なディレクトリにコピーして、再起動できます。

興味がある場合は、ここに redis ダンプ ファイル形式の完全なドキュメントがありますが、この単純な使用例についてすべてを理解する必要はありません。

于 2012-04-10T10:18:42.050 に答える
3

これは、4 つの Redis サーバー (2.4.x を実行) を 2 つに統合するために使用した手法です (私は、2 つの個別の Redis インスタンス (それぞれが db0 にデータを持つ) を 2 つの個別のデータベースを含む 1 つに 2 回結合しました)。

  1. 新しいインスタンス Foo をインスタンス A のスレーブにします (つまり、編集redis.confして使用しますslaveof)。
  2. Foo が A からの同期を終了したら、slaveof を削除して master にします。すべてのデータは db0 にあります。
  3. インスタンス B からすべてのデータをエクスポートまたはダンプするには、 redis -dump (Ruby ライブラリですが、コマンド ライン ユーティリティがあります) を使用します。これにより、JSON ファイルが作成されます。
  4. データがインスタンス B の db0 にあった場合は、手順 3 で得られた JSON ファイルを編集する必要があります。これは、B のデータを現在 A のデータを含む Foo の db0 にインポートしたくない b/c です。
    • redis-dump の形式には、各キーのソース データベースが含まれます。したがって、ドキュメントを編集して db を 0 から別のもの (1、2 など) に変更する必要があります。
    • JSON ファイルが大きかったので、sed を使用しました。sed -e 's/\"db\":0/\"db\":3/' orig.json > db_3.json
  5. redis-dump のredis-loadコマンドを使用して、データを含む JSON ファイルをインスタンス B から Foo にインポートします。
    • JSON ファイルを編集してデータベースを 3 などの別のものに変更した場合は、データをそのデータベースにインポートする必要があります。<new.json redis-load -u host:port -d 3
    • 十分なデータがある場合 (私は GB をインポートしていました)、数時間かかる場合があります。このプロセスを対象の Redis インスタンス (Foo) と同じボックスで実行することで、処理を高速化できます。

これで、A のデータが db0 に、B のデータが db1 にある単一の Redis インスタンス (Foo) ができました。

于 2012-06-28T18:33:10.107 に答える
0

結構苦労したので、ダンプと復元を使ったpythonスクリプトを作りました。1 つのデータベースをディクショナリ オブジェクトにシリアル化し、ピクルします。別のスイッチを使用すると、picled ファイルがロードされ、データが他の redis インスタンスにアップロードされます。

https://gist.github.com/romanmah/9664407

于 2014-03-20T14:04:52.253 に答える