web-dev-qa-db-ja.com

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

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

追伸:レプリケーションのセットアップを検討していません。 Redisサーバーを新しいインスタンスに完全に移行したい。

170
ErJab

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

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

104
Anurag

まず、サーバー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のバージョン以上である必要があります。そうでない場合、 互換性の問題 がヒットします。

223
Wilfred Hughes

サーバー間の接続がある場合は、新しいインスタンスをスレーブノードとしてレプリケーション(SQLとは異なり、簡単です)をセットアップすることをお勧めします-単一のコマンドで新しいノードをマスターに切り替え、移動を実行できますゼロダウンタイム。

33
Tom Clarkson

信じられないかもしれませんが、私はそれのために記事を作りました:

http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another

しかし、マスターとスレーブ間でデータ転送が完了したことをどのように知ることができますか? INFOコマンドを使用できます。

17
nick

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

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

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

 ssh [email protected] -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 を参照してください。

14
Øyvind Skaar

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

SLAVEOF old_instance_name old_instance_port

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

SLAVEOF NO ONE
13
estani

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

クライアントを開始

$redis-cli

そして

それから

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

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

4
Vinay Vemula

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

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

2
r043v

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

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

1
tangxinfa

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
1
Maoz Zadok

コマンドラインインターフェイスユーティリティをnpmとgithubに公開しました。これを使用すると、特定のパターン(*でも)に一致するキーを1つのRedisデータベースから別のデータベースにコピーできます。

このユーティリティは次の場所にあります。

https://www.npmjs.com/package/redis-utils-cli

0
Gabriel McAdams

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

  • レプリケーション( 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

0
x'ES