現在、クラウドインスタンスで稼働しているライブredisサーバーがあり、このredisサーバーを新しいクラウドインスタンスに移行し、そのインスタンスを新しいredisサーバーとして使用したいと考えています。MySQLの場合、古いサーバーからDBをエクスポートし、新しいサーバーにインポートします。これをredisでどうすればよいですか?
PS:レプリケーションをセットアップするつもりはありません。Redisサーバーを新しいインスタンスに完全に移行したい。
現在、クラウドインスタンスで稼働しているライブredisサーバーがあり、このredisサーバーを新しいクラウドインスタンスに移行し、そのインスタンスを新しいredisサーバーとして使用したいと考えています。MySQLの場合、古いサーバーからDBをエクスポートし、新しいサーバーにインポートします。これをredisでどうすればよいですか?
PS:レプリケーションをセットアップするつもりはありません。Redisサーバーを新しいインスタンスに完全に移行したい。
回答:
実行するBGSAVE
かSAVE
、コマンドラインから、データベースのスナップショットをdump.rdbに保存します。これにより、redisサーバーと同じフォルダーにdump.rdbという名前のファイルが作成されます。すべてのサーバーコマンドのリストを参照してください。
このdump.rdbを、移行先の他のredisサーバーにコピーします。redisが起動すると、このファイルを探してデータベースを初期化します。
appendonly = yes
)を使用する場合はno
、Redisサーバーを起動する前にAOFロギングを設定します。そうしないと、新しいデータセットは読み込まれません。データセットがメモリに読み込まれたら、メモリ(config set appendonly yes
)と構成ファイルの両方でデータセットをオンに戻します。
/etc/redis/redis.conf
、ファイルを検索して.rdb
ファイルの場所を見つけることができますcat /etc/redis/redis.conf | grep "rdb"
。私の場合、それは/var/lib/redis
redis-cli config get dir
.rdb
が格納されているディレクトリを提供します。
まず、サーバー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のバージョン以上である必要があります。そうでない場合、互換性の問題が発生する可能性があります。
CONFIG GET dir
返され、"/usr/local/var/db/redis"
サーバー間に接続がある場合は、新しいインスタンスをスレーブノードとして使用してレプリケーションを設定することをお勧めします(SQLとは異なり、これは簡単です)。新しいノードをマスターに切り替えるには、1つのコマンドで次のように移動します。ダウンタイムゼロ。
SLAVEOFコマンドを使用してデータを移行することもできます。
SLAVEOF old_instance_name old_instance_port
でキーを受け取ったことを確認しますKEYS *
。他の方法でも新しいインスタンスをテストできます。完了したら、次のレプリケーションをオンにします。
SLAVEOF NO ONE
現在、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を参照してください。
ダウンタイムなしの移行の主な要素は次のとおりです。
CONFIG SET slave-read-only no
)要するに:
さらに、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
私も同じことをしたいです:スタンドアロンのredisインスタンスから別のredisインスタンスにデータベースを移行します(redis sentinel)。
データは重要ではないため(セッションデータ)、https://github.com/yaauie/redis-copyを試してみます。
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
コマンドラインインターフェイスユーティリティをnpmとgithubに公開しました。これにより、特定のパターン(*でも)に一致するキーをRedisデータベース間でコピーできます。
あなたはここでユーティリティを見つけることができます:
redis-dumpがようやく機能しました。そのドキュメントには、Redisデータベースをダンプして別のデータベースにデータを挿入する方法の例が記載されています。