Bagaimana cara memindahkan database redis dari satu server ke server lain?

179

Saat ini saya memiliki server redis hidup yang berjalan pada instance cloud dan saya ingin memigrasi server redis ini ke instance cloud baru dan menggunakan instance itu sebagai server redis baru saya. Jika itu MySQL, saya akan mengekspor DB dari server lama dan mengimpornya ke server baru. Bagaimana saya harus melakukan ini dengan redis?

PS: Saya tidak ingin membuat replikasi. Saya ingin sepenuhnya memigrasi server redis ke instance baru.

ErJab
sumber
5
Bertahun-tahun kemudian ... Setelah berurusan dengan berbagai hal terkait redis, saya sarankan untuk pergi dengan pendekatan Tom Clarkson untuk membuat contoh budak, membiarkannya disinkronkan dengan master dan kemudian mempromosikan budak untuk dikuasai. Ini akan menyebabkan waktu henti yang jauh lebih singkat dibandingkan dengan jawaban yang saya terima, terutama jika Anda berurusan dengan beberapa GB data redis. Jika Anda dapat memasukkan redis sentinel ke dalam campuran ini, Anda dapat melakukan migrasi downtime yang hampir nol.
ErJab
Saya memiliki server Redis jarak jauh dan ingin menyalin datanya ke server Redis yang saya jalankan secara lokal ... menggunakan dump.rdb mungkin rumit karena saya harus memindahkan data itu melalui jaringan ..
Alexander Mills

Jawaban:

110

Menyimpan snapshot dari database ke dump.rdb dengan menjalankan BGSAVEatau SAVEdari baris perintah. Ini akan membuat file bernama dump.rdb di folder yang sama dengan server redis Anda. Lihat daftar semua perintah server .

Salin dump.rdb ini ke server redis lain yang ingin Anda migrasikan. Ketika redis dimulai, ia mencari file ini untuk menginisialisasi database.

Anurag
sumber
16
Ini membuat saya menebak beberapa hal: Di mana perintah SAVE meletakkannya? Di mana Redis mencari file "dump.rdb" untuk memuat permulaan? Konfigurasi redis saya telah menetapkan dbfilename ke /var/db/redis/redis_state.rdb ... apakah ini nama file yang saya gunakan sebagai ganti "dump.rdb"?
Mojo
23
Perlu diketahui juga bahwa Anda tidak dapat melakukan swap ini saat server Anda sedang berjalan, karena memanggil SHUTDOWN di server yang sedang berjalan akan menyimpan konten memorinya ke file dump-nya, sehingga menimpa salinan yang baru saja Anda tempatkan di sana. Pertama mematikan server. Kemudian timpa file dump. Kemudian mulai server lagi.
Houen
9
Jika Anda menggunakan pencatatan AOF (dalam redis.conf, appendonly = yes), atur nosebelum memulai server Redis - jika tidak, ia tidak akan memuat kumpulan data baru. Setelah kumpulan data dimuat ke dalam memori, hidupkan kembali, baik di memori ( config set appendonly yes) dan di file konfigurasi.
Matius Ratzloff
5
Pada Ubuntu, yang Redis file conf disimpan dalam /etc/redis/redis.conf, dan Anda dapat mencari melalui itu untuk menemukan di mana Anda .rdbfile: cat /etc/redis/redis.conf | grep "rdb". Dalam kasus saya ini/var/lib/redis
Herman Schaaf
5
redis-cli config get dirakan memberi Anda direktori di mana .rdbdisimpan.
Kishor Pawar
253

Pertama, buat dump di server 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

Ini memastikan dump.rdbbenar-benar mutakhir, dan menunjukkan kepada kami di mana ia disimpan ( /var/lib/redis/dump.rdbdalam hal ini). dump.rdbjuga secara berkala ditulis ke disk secara otomatis.

Selanjutnya, salin ke server B:

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

Hentikan server Redis di B, salin dump.rdb (memastikan izin sama seperti sebelumnya), lalu mulai.

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

Versi Redis pada B harus lebih besar atau sama dengan versi A, atau Anda mungkin mengalami masalah kompatibilitas .

Wilfred Hughes
sumber
32
Jauh lebih baik daripada jawaban yang diterima, memiliki semua detail.
btk
1
Ini menghemat banyak waktu saya dengan menunjukkan bahwa mengimpor ke redis dilakukan dengan menjatuhkan dump ke folder
redis
7
pada mac cadangan redis disimpan di / usr / local / var / db / redis /
Donovan Thomson
3
@DonovanThomson Terima kasih. (Saya menggunakan homebrew untuk menginstal redis di mac) ... Cara yang lebih umum untuk menemukan jalan Anda adalah dengan menggunakan perintah redis CONFIG GET dir, yang dikembalikan"/usr/local/var/db/redis"
Julian Soro
Dan apa yang dilakukan seseorang tentang penulisan yang masuk ke A selama proses ini?
Mike Graf
34

Jika Anda memiliki konektivitas antara server, lebih baik untuk mengatur replikasi (yang sepele, tidak seperti dengan SQL) dengan contoh baru sebagai slave node - maka Anda dapat mengganti node baru untuk dikuasai dengan satu perintah dan melakukan perpindahan dengan nol downtime.

Tom Clarkson
sumber
1
Saya punya konektivitas. Jadi saya bisa menggunakan konfigurasi slaveof di server baru dan mengaturnya ke alamat IP server lama. Tapi bagaimana saya tahu kapan transfer data selesai antara master dan slave? Dan setelah itu, bagaimana saya mempromosikan budak untuk dikuasai?
ErJab
Saya pikir perintah INFO akan memberi tahu Anda ketika sudah siap. Namun, itu tidak terlalu menjadi masalah - karena ini merupakan replikasi daripada salinan sekali pakai, Anda dapat membiarkan kedua node tetap di tempatnya selama yang Anda inginkan sebelum mematikan node yang lama. SLAVEOF NONE adalah perintah untuk mempromosikan node baru ke master.
Tom Clarkson
9
Kedengarannya seperti solusi hebat - akan menyenangkan dengan beberapa contoh perintah!
knutole
16

Dimungkinkan juga untuk memigrasi data menggunakan perintah SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Pastikan Anda telah menerima kunci dengan KEYS *. Anda bisa menguji contoh baru dengan cara lain juga, dan ketika Anda selesai hanya mengubah replikasi:

SLAVEOF NO ONE
estani
sumber
Ini adalah pendekatan yang paling tidak menyakitkan!
noooooooob
13

Saat ini Anda juga dapat menggunakan MIGRATE, tersedia sejak 2.6.

Saya harus menggunakan ini karena saya hanya ingin memindahkan data dalam satu database dan tidak semuanya. Dua instance Redis hidup pada dua mesin yang berbeda.

Jika Anda tidak dapat terhubung langsung ke Redis-2 dari Redis-1, gunakan ssh port binding:

 ssh [email protected] -L 1234:127.0.0.1:6379

Sebuah skrip kecil untuk mengulang semua kunci menggunakan tombol dan MIGRATE setiap tombol. Ini Perl, tapi mudah-mudahan Anda mendapatkan ide:

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

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

Lihat http://redis.io/commands/migrate untuk info lebih lanjut.

Øyvind Skaar
sumber
redis jarak jauh yang ingin Anda migrasikan ke PASSWORD?
noooooooob
4

Untuk memeriksa di mana dump.rdb harus ditempatkan ketika mengimpor data redis,

mulai klien

$redis-cli

dan

kemudian

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

Di sini / Pengguna / Admin adalah lokasi dump.rdb yang dibaca dari server dan karenanya ini adalah file yang harus diganti.

Vinay Vemula
sumber
2

Anda juga dapat menggunakan rdd

itu dapat membuang & mengembalikan server redis yang sedang berjalan dan memungkinkan kunci filter / match / rename dump

r043v
sumber
2

Elemen kunci dari migrasi tanpa downtime adalah:

Pendeknya:

  1. siapkan redis target (kosong) sebagai budak redis sumber (dengan data Anda)
  2. tunggu sampai replikasi selesai
  3. izinkan menulis ke redis target (yang saat ini menjadi budak)
  4. alihkan aplikasi Anda ke target redis
  5. tunggu datastream selesai dari master ke slave
  6. mengubah target redis dari master ke slave

Selain itu redis memiliki opsi yang memungkinkan untuk menonaktifkan redis sumber untuk menerima penulisan tepat setelah melepaskan target:

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

Topik ini dibahas oleh

Penjelasan yang sangat bagus dari tim RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

Dan bahkan alat interaktif mereka untuk bermigrasi: https://github.com/RedisLabs/redis-migrate

x'es
sumber
1

Saya juga ingin melakukan hal yang sama: memigrasikan db dari instance redis mandiri ke instance redis lainnya (redis sentinel).

Karena data tidak kritis (data sesi), saya akan mencoba https://github.com/yaauie/redis-copy mencoba.

tangxinfa
sumber
1

Cara sederhana yang saya temukan untuk mengekspor / mencadangkan data Redis (membuat file dump) adalah memulai server melalui baris perintah dengan flag slaveof dan membuat replika langsung sebagai berikut (dengan asumsi sumber Redis adalah 1.2.3.4 pada port 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
Maoz Zadok
sumber
Saya memiliki redis yang berjalan di mesin linux yang saya punya akses. saya punya redis di mesin windows saya. apakah mungkin untuk menyalin data untuk kombinasi seperti itu?
Kamran Shahid
1
Saya percaya Anda bisa jika keduanya dengan versi yang sama
Maoz Zadok
Ya saya perlu memeriksa versi juga. Tapi versi rilis windows tidak di atas 3.0 seperti yang saya tahu terakhir
Kamran Shahid
0

Saya baru saja menerbitkan utilitas antarmuka baris perintah ke npm dan github yang memungkinkan Anda untuk menyalin kunci yang cocok dengan pola yang diberikan (datar *) dari satu basis data Redis ke yang lain.

Anda dapat menemukan utilitas di sini:

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

Gabriel McAdams
sumber
-2

redis-dump akhirnya bekerja untukku. Dokumentasinya memberikan contoh cara membuang basis data Redis dan memasukkan data ke yang lain.

JustAC0der
sumber