Redis veritabanını bir sunucudan diğerine nasıl taşırım?


179

Şu anda bir bulut örneğinde çalışan bir canlı redis sunucum var ve bu redis sunucusunu yeni bir bulut örneğine geçirmek ve bu örneği yeni redis sunucum olarak kullanmak istiyorum. MySQL olsaydı, DB'yi eski sunucudan dışa aktarır ve yeni sunucuya alırdım. Bunu redis ile nasıl yapmalıyım?

PS: Çoğaltma kurmak istemiyorum. Redis sunucusunu tamamen yeni bir örneğe geçirmek istiyorum.


5
Yıllar sonra ... Redis ile ilgili çeşitli şeylerle uğraştıktan sonra, Tom Clarkson'un bir köle örneği kurma , onun efendiyle senkronize olmasına ve sonra köleyi ustalaşmaya teşvik etmesine yaklaşmasını öneriyorum . Bu, özellikle birkaç GB'lık redis verileriyle uğraşıyorsanız, kabul ettiğim yanıta göre çok daha kısa bir kesinti süresine neden olacaktır. Bu karışıma bir redis sentinel atmak, neredeyse sıfır kesinti göç yapabilirsiniz.
ErJab

Uzak bir Redis sunucum var ve verilerini yerel olarak çalışan Redis sunucuma kopyalamak istiyorum ... dump.rdb kullanarak zor olabilir çünkü bu verileri ağ üzerinden taşımak zorunda kalacağım ..
Alexander Mills

Yanıtlar:


110

Veritabanının anlık görüntüsünü çalıştırarak BGSAVEveya SAVEkomut satırından bir dump.rdb dosyasına kaydedin . Bu, redis sunucunuzla aynı klasörde dump.rdb adlı bir dosya oluşturur. Tüm sunucu komutlarının listesine bakın .

Bu dump.rdb dosyasını, taşımak istediğiniz diğer redis sunucusuna kopyalayın. Yeniden başlatma başladığında, bu dosyanın veritabanını başlatacağı yeri arar.


16
Bu bana birkaç şeyi tahmin etmemi sağlıyor: SAVE komutu nereye dökülüyor? Redis, başlangıç ​​başlatmak için bir "dump.rdb" dosyasını nerede arar? Redis yapılandırmamda dbfilename /var/db/redis/redis_state.rdb olarak ayarlandı ... bu "dump.rdb" yerine kullandığım dosya adı mı?
Mojo

23
Ayrıca, sunucunuzu çalışırken bu değiştirmeyi yapamayacağınızı da unutmayın; çalışan sunucuda SHUTDOWN çağrısı bellek içeriğini döküm dosyasına kaydeder, böylece yeni yerleştirdiğiniz kopyanın üzerine yazar. Önce sunucuyu kapatın. Sonra döküm dosyasının üzerine yazın. Ardından sunucuyu yeniden başlatın.
Houen

9
AOF günlüğü kullanıyorsanız (redis.conf dosyasında appendonly = yes), noRedis sunucusunu başlatmadan önce bunu ayarlayın - aksi takdirde yeni veri kümesini yüklemez. Veri kümesi belleğe yüklendikten sonra, hem bellekte ( config set appendonly yes) hem de yapılandırma dosyasında yeniden açın.
Matthew Ratzloff

5
Ubuntu günü, Redis conf dosyası saklanır /etc/redis/redis.confve siz nerede bulacağını içinden arama yapabilirsiniz .rdbdosyalar şunlardır: cat /etc/redis/redis.conf | grep "rdb". Benim durumumda/var/lib/redis
Herman Schaaf

5
redis-cli config get dirsize .rdbdepolanan dizini verir .
Kishor Pawar

253

İlk olarak, A sunucusunda bir döküm oluşturun.

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

Bu dump.rdb, tamamen güncel olmasını sağlar ve nerede depolandığını gösterir ( /var/lib/redis/dump.rdbbu durumda). dump.rdbayrıca düzenli olarak diske otomatik olarak yazılır.

Ardından, sunucu B'ye kopyalayın:

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

B'deki Redis sunucusunu durdurun, dump.rdb'yi kopyalayın (izinlerin öncekiyle aynı olduğundan emin olun), sonra başlayın.

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

Redis'in B sürümü, A'nınkinden daha büyük veya ona eşit olmalıdır, aksi takdirde uyumluluk sorunlarıyla karşılaşabilirsiniz .


32
Kabul edilen cevaptan çok daha iyi, tüm detayları var.
btk

1
Bu, redis'e aktarmanın redis klasörüne dökümü bırakarak yapıldığını göstererek bana çok zaman kazandırdı
RonnyKnoxville

7
mac üzerinde redis yedekleme / usr / local / var / db / redis / adresinde saklanır.
Donovan Thomson

3
@DonovanThomson Teşekkürler. (Mac'te redis yüklemek için homebrew kullandım) ... Yolunuzu bulmanın daha genel bir yolu CONFIG GET dir, dönen redis komutunu kullanmaktır"/usr/local/var/db/redis"
Julian Soro

Ve bu süreçte A'ya giden yazılar hakkında ne yapar?
Mike Graf

34

Sunucular arasında bağlantınız varsa, slave düğümü olarak yeni örnekle çoğaltmayı (önemsiz olan, SQL'den farklı olarak) ayarlamak daha iyidir - o zaman yeni düğümü tek bir komutla master olarak değiştirebilir ve sıfır kesinti süresi.


1
Bağlantım var. Böylece yeni sunucudaki slaveof yapılandırmasını kullanabilir ve eski sunucunun IP adresine ayarlayabilirim. Ancak master ve slave arasındaki veri aktarımının ne zaman tamamlandığını nasıl bilebilirim? Ve bundan sonra, köleyi ustalaşmaya nasıl teşvik ederim?
ErJab

Bence INFO komutu hazır olduğunda size söyleyecektir. Ancak, bu çok fazla önemli değil - bir kerelik bir kopyadan çok çoğaltma olduğundan, eski düğümü kapatmadan önce her iki düğümü de istediğiniz kadar yerinde bırakabilirsiniz. SLAVEOF NONE, yeni düğümü master hale getirmek için kullanılan komuttur.
Tom Clarkson

9
Harika bir çözüm gibi geliyor - bazı komut örnekleri ile iyi olurdu!
knutole

16

SLAVEOF komutunu kullanarak veri taşımak da mümkündür:

SLAVEOF old_instance_name old_instance_port

Anahtarları alıp almadığınızı kontrol edin KEYS *. Yeni örneği başka bir yolla da test edebilirsiniz ve işiniz bittiğinde aşağıdakilerin çoğaltmasını çevirin:

SLAVEOF NO ONE

Bu en acısız yaklaşım!
noooooooob

13

Günümüzde 2.6'dan beri mevcut olan MIGRATE'i de kullanabilirsiniz.

Verileri sadece bir veritabanında taşımak istedim, hepsini değil. İki Redis örneği iki farklı makinede yaşar.

Redis-1'den doğrudan Redis-2'ye bağlanamıyorsanız, ssh port bağlaması kullanın:

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

KEYS ve MIGRATE tuşlarını kullanarak tüm tuşları döngüye sokan küçük bir betik. Bu Perl, ama umarım bu fikri anlarsınız:

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

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

Daha fazla bilgi için http://redis.io/commands/migrate adresine bakın .


PASSWORD'e geçirmek istediğiniz uzaktan redis nedir?
noooooooob

4

Redis verilerini içe aktarırken dump.rdb dosyasının nereye yerleştirilmesi gerektiğini kontrol etmek için,

müşteriyi başlat

$redis-cli

ve

sonra

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

Burada / Users / Admin, sunucudan okunan dump.rdb dosyasının konumudur ve bu nedenle değiştirilmesi gereken dosya budur.


2

ayrıca rdd kullanabilirsiniz

çalışan bir redis sunucusunu dökebilir ve geri yükleyebilir ve döküm anahtarlarını filtreleyebilir / eşleştirebilir / yeniden adlandırabilir


2

Sıfır kesinti süresi taşıma işleminin temel öğeleri şunlardır:

Kısacası:

  1. kaynak redisin kölesi olarak bir hedef redis (boş) ayarlayın (verilerinizle)
  2. çoğaltma bitmesini bekle
  3. hedef redis'e yazma izni (şu anda köle olan)
  4. uygulamalarınızı hedef redise geçirme
  5. master'dan slave'e veri akışının bitmesini bekleyin
  6. hedef redis'i master'dan slave'e çevir

Ayrıca redis'lerde, bir hedefi ayırdıktan hemen sonra yazma kabul etmek için kaynak redis'i devre dışı bırakan seçenekler bulunur:

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

Bu konuyu kapsadığı

RedisLabs ekibinden çok iyi bir açıklama https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

Ve göç için etkileşimli araçları bile: https://github.com/RedisLabs/redis-migrate



1

Redis verilerini dışa aktarmak / Yedeklemek için bulduğum basit bir yol (döküm dosyası oluştur), slaveof bayrağıyla komut satırı aracılığıyla bir sunucu başlatmak ve aşağıdaki gibi canlı çoğaltma oluşturmaktır (kaynak Redis'in bağlantı noktası 6379'da 1.2.3.4 olduğu varsayılarak):

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

Erişime sahip olan linux makinesinde çalışan bir redis var. Windows makinemde bir redis var. böyle bir kombinasyon için veri kopyalamak mümkün mü?
Kamran Shahid

1
Her ikisinin de aynı sürümde olup olmadığına inanıyorum
Maoz Zadok

Evet ben de sürümünü kontrol etmek gerekir. Ama son sürümü bildiğim gibi windows sürüm 3.0 üzerinde değil
Kamran Shahid


-2

redis-dump sonunda benim için çalıştı. Belgeleri bir Redis veritabanının dökümünün nasıl yapılacağına ve verilerin başka bir veritabanına nasıl ekleneceğine dair bir örnek sunmaktadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.