Jak przenieść bazę danych redis z jednego serwera na drugi?

179

Obecnie mam działający serwer redis działający na instancji w chmurze i chcę przeprowadzić migrację tego serwera redis do nowej instancji w chmurze i użyć tej instancji jako mojego nowego serwera redis. Gdyby to był MySQL, wyeksportowałbym DB ze starego serwera i zaimportowałem go na nowy serwer. Jak mam to zrobić za pomocą Redis?

PS: Nie chcę konfigurować replikacji. Chcę całkowicie migrować serwer redis do nowej instancji.

ErJab
źródło
5
Wiele lat później ... Po zajęciu się różnymi sprawami związanymi z redis, sugeruję pójście z podejściem Toma Clarksona, zakładając instancję niewolnika, pozwalając mu zsynchronizować się z mistrzem, a następnie promując niewolnika do opanowania. Spowoduje to znacznie krótsze przestoje w porównaniu z odpowiedzią, którą zaakceptowałem, szczególnie jeśli masz do czynienia z kilkoma GB danych redis. Jeśli możesz wrzucić do tego miksu strażnika redis, możesz przeprowadzić migrację prawie zerowego przestoju.
ErJab,
Mam zdalny serwer Redis i chcę skopiować jego dane na lokalnie uruchomiony serwer Redis ... użycie dump.rdb może być trudne, ponieważ musiałbym przenieść te dane przez sieć ..
Alexander Mills

Odpowiedzi:

110

Zapisz migawkę bazy danych w pliku dump.rdb, uruchamiając ją BGSAVElub SAVEz wiersza poleceń. Spowoduje to utworzenie pliku o nazwie dump.rdb w tym samym folderze, co serwer Redis. Zobacz listę wszystkich poleceń serwera .

Skopiuj ten plik dump.rdb na inny serwer redis, na który chcesz przeprowadzić migrację. Po uruchomieniu redis szuka tego pliku, aby zainicjować bazę danych.

Anurag
źródło
16
To pozwala mi zgadnąć kilka rzeczy: gdzie komenda SAVE zapisuje zrzut? Gdzie Redis szuka pliku „dump.rdb”, aby załadować start-up? Moja konfiguracja redis ma parametr dbfilename ustawiony na /var/db/redis/redis_state.rdb ... czy to nazwa pliku, której używam zamiast „dump.rdb”?
Mojo
23
Należy również pamiętać, że nie można wykonać tej wymiany, gdy serwer jest uruchomiony, ponieważ wywołanie polecenia SHUTDOWN na działającym serwerze spowoduje zapisanie zawartości pamięci w pliku zrzutu, zastępując w ten sposób skopiowaną właśnie tam kopię. Najpierw zamknij serwer. Następnie zastąp plik zrzutu. Następnie uruchom serwer ponownie.
Houen
9
Jeśli używasz rejestrowania AOF (w redis.conf, appendonly = yes), ustaw go na noprzed uruchomieniem serwera Redis - w przeciwnym razie nowy zestaw danych nie zostanie załadowany. Po załadowaniu zestawu danych do pamięci włącz go ponownie, zarówno w pamięci ( config set appendonly yes), jak iw pliku konfiguracyjnym.
Matthew Ratzloff
5
Na Ubuntu, plik conf Redis są przechowywane w /etc/redis/redis.conf, można przeglądać go znaleźć gdzie .rdbpliki są: cat /etc/redis/redis.conf | grep "rdb". W moim przypadku jest to/var/lib/redis
Herman Schaaf
5
redis-cli config get dirdałby ci katalog, w którym .rdbjest przechowywany.
Kishor Pawar
253

Najpierw utwórz zrzut na serwerze 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

To gwarantuje, że dump.rdbjest całkowicie aktualne i pokazuje nam, gdzie jest przechowywane ( /var/lib/redis/dump.rdbw tym przypadku). dump.rdbjest również okresowo zapisywany na dysk automatycznie.

Następnie skopiuj go na serwer B:

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

Zatrzymaj serwer Redis na B, skopiuj plik dump.rdb (upewniając się, że uprawnienia są takie same jak wcześniej), a następnie uruchom.

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

Wersja Redis na B musi być większa lub równa wersji A, w przeciwnym razie możesz napotkać problemy ze zgodnością .

Wilfred Hughes
źródło
32
O wiele lepsza niż zaakceptowana odpowiedź, ma wszystkie szczegóły.
btk
1
Zaoszczędziło mi to dużo czasu, pokazując, że importowanie do redis odbywa się poprzez upuszczenie zrzutu do folderu
redis
7
na Macu kopia zapasowa Redis jest przechowywana w / usr / local / var / db / redis /
Donovan Thomson
3
@DonovanThomson Thanks. (Użyłem homebrew, aby zainstalować redis na komputerze Mac) ... Bardziej ogólnym sposobem na znalezienie ścieżki jest użycie polecenia redis CONFIG GET dir, które powróciło"/usr/local/var/db/redis"
Julian Soro,
A co zrobić z zapisami, które trafiły do ​​A podczas tego procesu?
Mike Graf
34

Jeśli masz łączność między serwerami, lepiej jest skonfigurować replikację (co jest trywialne, w przeciwieństwie do SQL) z nową instancją jako węzłem podrzędnym - wtedy możesz zmienić nowy węzeł na master za pomocą jednego polecenia i wykonać ruch za pomocą zero przestojów.

Tom Clarkson
źródło
1
Mam łączność. Mogę więc użyć konfiguracji slaveof na nowym serwerze i ustawić go na adres IP starego serwera. Ale skąd mam wiedzieć, kiedy transfer danych jest zakończony między urządzeniem głównym a urządzeniem podrzędnym? A potem, jak mam promować niewolnika do opanowania?
ErJab,
Myślę, że polecenie INFO powie ci, kiedy będzie gotowe. Nie ma to jednak większego znaczenia - ponieważ jest to replikacja, a nie jednorazowa kopia, możesz pozostawić oba węzły na tak długo, jak chcesz, zanim wyłączysz stary węzeł. SLAVEOF NONE to polecenie promowania nowego węzła do opanowania.
Tom Clarkson
9
Brzmi jak świetne rozwiązanie - przydałoby się kilka przykładów poleceń!
knutole
16

Możliwe jest również migrowanie danych za pomocą polecenia SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Sprawdź, czy otrzymałeś klucze KEYS *. Możesz przetestować nową instancję w inny sposób, a kiedy skończysz, po prostu włącz replikację:

SLAVEOF NO ONE
estani
źródło
To najbardziej bezbolesne podejście!
noooooooob
13

Obecnie możesz także korzystać z MIGRATE, dostępnego od wersji 2.6.

Musiałem z tego skorzystać, ponieważ chciałem przenieść dane tylko do jednej bazy danych, a nie do wszystkich. Dwie instancje Redis działają na dwóch różnych maszynach.

Jeśli nie możesz połączyć się bezpośrednio z Redis-2 z Redis-1, użyj powiązania portu ssh:

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

Mały skrypt do zapętlania wszystkich kluczy za pomocą KLUCZY i PRZESYŁAJ każdy klucz. To jest Perl, ale mam nadzieję, że masz pomysł:

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

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

Więcej informacji można znaleźć na stronie http://redis.io/commands/migrate .

Øyvind Skaar
źródło
do jakiego zdalnego redis, do którego chcesz przeprowadzić migrację, ma HASŁO?
noooooooob,
4

Aby sprawdzić, gdzie należy umieścić plik dump.rdb podczas importowania danych redis,

uruchom klienta

$redis-cli

i

następnie

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

Tutaj / Users / Admin to lokalizacja pliku dump.rdb, który jest odczytywany z serwera, a zatem jest to plik, który należy wymienić.

Vinay Vemula
źródło
2

możesz także użyć rdd

może zrzucić i przywrócić działający serwer redis i pozwolić filtrom / dopasować / zmienić nazwę zrzutów kluczy

r043v
źródło
2

Kluczowe elementy migracji bez przestojów to:

  • replikacja ( http://redis.io/commands/SLAVEOF )
  • możliwość zapisu do urządzenia podrzędnego podczas przełączania aplikacji ( CONFIG SET slave-read-only no)

W skrócie:

  1. ustaw docelową redis (pustą) jako slave źródłowej redis (z twoimi danymi)
  2. poczekaj na zakończenie replikacji
  3. Pozwól zapisuje do docelowego redis (który jest obecnie slave)
  4. zmień swoje aplikacje na docelowe redis
  5. poczekaj na zakończenie strumienia danych z mastera na slave
  6. zamień cel redis z master na slave

Dodatkowo redis ma opcje, które pozwalają wyłączyć redis źródłowe, aby akceptować zapisy zaraz po odłączeniu celu:

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

Ten temat obejmuje

Bardzo dobre wyjaśnienie od zespołu RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

A nawet ich interaktywne narzędzie do migracji: https://github.com/RedisLabs/redis-migrate

x'ES
źródło
1

Chcę również zrobić to samo: migrować bazę danych z autonomicznej instancji redis do innej instancji redis (redis sentinel).

Ponieważ dane nie są krytyczne (dane sesji), dam https://github.com/yaauie/redis-copy próbę.

tangxinfa
źródło
1

Najprostszym sposobem, w jaki znalazłem eksport / kopię zapasową danych Redis (utworzenie pliku zrzutu) jest uruchomienie serwera za pomocą wiersza polecenia z flagą slaveof i utworzenie repliki na żywo w następujący sposób (zakładając, że źródłowa wersja Redis to 1.2.3.4 na porcie 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
Maoz Zadok
źródło
Mam redis działający na maszynie z Linuksem, do której mam dostęp. mam redis na moim komputerze z systemem Windows. czy można skopiować dane dla takiej kombinacji?
Kamran Shahid
1
Wierzę, że możesz, jeśli oba są w tej samej wersji
Maoz Zadok
Tak, muszę również sprawdzić wersję. Ale wersja systemu Windows nie jest wyższa niż 3.0 jak ostatnio wiem
Kamran Shahid
0

Właśnie opublikowałem narzędzie interfejsu wiersza poleceń do npm i github, które pozwala kopiować klucze pasujące do danego wzorca (nawet *) z jednej bazy danych Redis do drugiej.

Narzędzie znajdziesz tutaj:

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

Gabriel McAdams
źródło
-2

redis-dump w końcu dla mnie zadziałało. Jego dokumentacja zawiera przykład, jak zrzucić bazę danych Redis i wstawić dane do innej.

JustAC0der
źródło