あるサーバーから別のサーバーにredisデータベースを移動するにはどうすればよいですか?


179

現在、クラウドインスタンスで稼働しているライブredisサーバーがあり、このredisサーバーを新しいクラウドインスタンスに移行し、そのインスタンスを新しいredisサーバーとして使用したいと考えています。MySQLの場合、古いサーバーからDBをエクスポートし、新しいサーバーにインポートします。これをredisでどうすればよいですか?

PS:レプリケーションをセットアップするつもりはありません。Redisサーバーを新しいインスタンスに完全に移行したい。


5
数年後...さまざまなredis関連の事柄に対処した後、スレーブインスタンスをセットアップし、マスターと同期させ、スレーブをマスターに昇格させるというトムクラークソンのアプローチを使用することをお勧めします。これにより、特に数GBのredisデータを処理している場合、私が受け入れた回答と比較して、ダウンタイムが大幅に短縮されます。このミックスにredisセンチネルを投入できれば、ほとんどダウンタイムなしの移行を実行できます。
ErJab 2015年

私は、リモートRedisのサーバーを持っているし、私のローカルで実行されているRedisのサーバーにそのデータをコピーしたい...私は、ネットワークを介してそのデータを移動する必要があるためdump.rdbは難しいかもしれません使用して...
アレクサンダー・ミルズ

回答:


110

実行するBGSAVESAVE、コマンドラインから、データベースのスナップショットをdump.rdbに保存します。これにより、redisサーバーと同じフォルダーにdump.rdbという名前のファイルが作成されます。すべてのサーバーコマンドのリストを参照してください。

このdump.rdbを、移行先の他のredisサーバーにコピーします。redisが起動すると、このファイルを探してデータベースを初期化します。


16
これは私にいくつかのことを推測させます:SAVEコマンドはどこにダンプを置きますか?Redisは「dump.rdb」ファイルをどこで検索して起動をロードしますか?私のredis構成では、dbfilenameが/var/db/redis/redis_state.rdbに設定されています...これは、「dump.rdb」の代わりに使用するファイル名ですか?
モジョ

23
また、実行中のサーバーでSHUTDOWNを呼び出すと、メモリの内容がダンプファイルに保存され、そこに配置したコピーが上書きされるため、サーバーの実行中はこのスワップを実行できないことに注意してください。最初にサーバーをシャットダウンします。次に、ダンプファイルを上書きします。その後、サーバーを再起動します。
Houen

9
AOFロギング(redis.conf内appendonly = yes)を使用する場合はno、Redisサーバーを起動する前にAOFロギングを設定します。そうしないと、新しいデータセットは読み込まれません。データセットがメモリに読み込まれたら、メモリ(config set appendonly yes)と構成ファイルの両方でデータセットをオンに戻します。
Matthew Ratzloff 2013年

5
Ubuntuでは、Redis confファイルはに保存されており/etc/redis/redis.conf、ファイルを検索して.rdbファイルの場所を見つけることができますcat /etc/redis/redis.conf | grep "rdb"。私の場合、それは/var/lib/redis
Herman Schaaf

5
redis-cli config get dir.rdbが格納されているディレクトリを提供します。
Kishor Pawar

253

まず、サーバーAにダンプを作成します。

A$ redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis/"
127.0.0.1:6379> SAVE
OK

これdump.rdbは完全に最新であることを保証し、それが保存されている場所を示します(/var/lib/redis/dump.rdbこの場合)。dump.rdbまた、定期的に自動的にディスクに書き込まれます。

次に、それをサーバーBにコピーします。

A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb

BでRedisサーバーを停止し、dump.rdbをコピーして(権限が以前と同じであることを確認して)、起動します。

B$ sudo service redis-server stop
B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
B$ sudo chown redis: /var/lib/redis/dump.rdb
B$ sudo service redis-server start

BのRedisのバージョンはAのバージョン以上である必要があります。そうでない場合、互換性の問題が発生する可能性があります


32
受け入れられた答えよりもはるかに優れており、すべての詳細があります。
btk 2014年

1
これにより、ダンプをredisフォルダーにドロップすることでredisへのインポートが行われることを示すことで、多くの時間を節約できました
RonnyKnoxville

7
Macでは、redisバックアップは/ usr / local / var / db / redis /に保存されます
Donovan Thomson

3
@DonovanThomsonありがとう。(私はMac上でのRedisをインストールするために自作使用)...あなたの道を見つけるためにAより汎用的な方法は、使用RedisのコマンドにあるCONFIG GET dir返され、"/usr/local/var/db/redis"
ジュリアン・ソロ

そして、このプロセス中にAに行われた書き込みについてはどうしますか?
Mike Graf

34

サーバー間に接続がある場合は、新しいインスタンスをスレーブノードとして使用してレプリケーションを設定することをお勧めします(SQLとは異なり、これは簡単です)。新しいノードをマスターに切り替えるには、1つのコマンドで次のように移動します。ダウンタイムゼロ。


1
私は接続性を持っています。新しいサーバーでslaveof設定を使用して、古いサーバーのIPアドレスに設定できます。しかし、マスターとスレーブの間でデータ転送が完了したことをどのように知ることができますか?その後、スレーブをマスターに昇格するにはどうすればよいですか?
ErJab、2011年

INFOコマンドは準備ができたときに通知すると思います。ただし、それはそれほど重要ではありません。これは1回限りのコピーではなく複製であるため、古いノードをオフにする前に、必要なだけ両方のノードをそのままにしておくことができます。SLAVEOF NONEは、新しいノードをマスターに昇格させるコマンドです。
トムクラークソン、

9
素晴らしいソリューションのように聞こえます—いくつかのコマンドの例でいいでしょう!
knutole 2014

16

SLAVEOFコマンドを使用してデータを移行することもできます。

SLAVEOF old_instance_name old_instance_port

でキーを受け取ったことを確認しますKEYS *。他の方法でも新しいインスタンスをテストできます。完了したら、次のレプリケーションをオンにします。

SLAVEOF NO ONE

これが最も簡単なアプローチです。
noooooooob

13

現在、2.6以降で使用可能なMIGRATEを使用することもできます。

データをすべてではなく1つのデータベースに移動したいだけなので、これを使用する必要がありました。2つのRedisインスタンスは、2つの異なるマシン上にあります。

Redis-1からRedis-2に直接接続できない場合は、sshポートバインディングを使用します。

 ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379

KEYSを使用してすべてのキーをループし、各キーを移行する小さなスクリプト。これはPerlですが、うまくいけば次のようになります。

 foreach ( $redis_from->keys('*') ) {

    $redis_from->migrate(
        $destination{host},    # localhost in my example
        $destination{port},    # 1234
        $_,                    # The key
        $destination{db},
        $destination{timeout} 
    );
 }

詳細については、http://redis.io/commands/migrateを参照してください。


移行先のリモートredisにはパスワードがありますか?
-noooooooob

4

redisデータをインポートするときにdump.rdbを配置する必要がある場所を確認するには、

クライアントを起動

$redis-cli

そして

その後

redis 127.0.0.1:6379> CONFIG GET *
 1) "dir"
 2) "/Users/Admin"

ここで、/ Users / Adminは、サーバーから読み取られるdump.rdbの場所です。したがって、これは置き換える必要があるファイルです。


2

rddを使用することもできます

実行中のredisサーバーをダンプして復元し、フィルター/一致/名前変更ダンプキーを許可します


2

ダウンタイムなしの移行の主な要素は次のとおりです。

  • レプリケーション(http://redis.io/commands/SLAVEOF
  • アプリケーションの切り替え中にスレーブに書き込む可能性(CONFIG SET slave-read-only no

要するに:

  1. ターゲットredis(空)をソースredisのスレーブとして設定します(データを使用)
  2. 複製が完了するのを待つ
  3. ターゲットredis(現在はスレーブ)への書き込みを許可する
  4. アプリをターゲットredisに切り替える
  5. マスターからスレーブへのデータストリームの終了を待つ
  6. ターゲットのredisをマスターからスレーブに変更する

さらに、redisには、ターゲットをデタッチした直後にソースredisを無効にして書き込みを許可するオプションがあります。

  • min-slaves-to-write
  • min-slaves-max-lag

このトピックは

RedisLabsチームからの非常に良い説明https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

そして、移行のためのインタラクティブなツールでさえ:https : //github.com/RedisLabs/redis-migrate


1

私も同じことをしたいです:スタンドアロンのredisインスタンスから別のredisインスタンスにデータベースを移行します(redis sentinel)。

データは重要ではないため(セッションデータ)、https://github.com/yaauie/redis-copyを試してみます。


1

Redisデータをエクスポート/バックアップ(ダンプファイルを作成)するために見つけた簡単な方法は、slaveofフラグを指定してコマンドラインからサーバーを起動し、次のようにライブレプリカを作成することです(ソースRedisがポート6379で1.2.3.4であると想定)。

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379

アクセス権のあるLinuxマシンでredisを実行しています。Windowsマシンにredisがあります。そのような組み合わせでデータをコピーすることは可能ですか?
カムラン

1
両方が同じバージョンであれば、できると思います
Maoz Zadok

はい、バージョンも確認する必要があります。しかし、Windowsのリリースバージョンではありません最後として、3.0を超える私が知っている
カムラン・シャヒード


-2

redis-dumpがようやく機能しました。そのドキュメントには、Redisデータベースをダンプして別のデータベースにデータを挿入する方法の例が記載されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.