한 서버에서 다른 서버로 redis 데이터베이스를 어떻게 이동합니까?


179

현재 클라우드 인스턴스에서 실행중인 라이브 redis 서버가 있으며이 redis 서버를 새 클라우드 인스턴스로 마이그레이션하고 해당 인스턴스를 새 redis 서버로 사용하려고합니다. MySQL 인 경우 이전 서버에서 DB를 내보내고 새 서버로 가져옵니다. redis로 어떻게해야합니까?

추신 : 복제를 설정하지 않습니다. redis 서버를 새 인스턴스로 완전히 마이그레이션하고 싶습니다.


5
몇 년 후 ... 다양한 redis 관련 문제를 처리 한 후 Tom Clarkson의 슬레이브 인스턴스 설정 방법 을 사용하여 마스터와 동기화 한 다음 슬레이브를 마스터로 승격시키는 것이 좋습니다. 이것은 특히 몇 GB의 redis 데이터를 처리하는 경우 허용 된 답변과 비교하여 중단 시간이 훨씬 짧아집니다. 이 믹스에 redis 센티넬을 넣을 수 있다면 다운 타임 마이그레이션을 거의 제로화 할 수 있습니다.
ErJab

원격 Redis 서버가 있고 로컬로 실행중인 Redis 서버에 데이터를 복사하려고합니다. dump.rdb를 사용하면 네트워크를 통해 해당 데이터를 이동해야하기 때문에 까다로울 수 있습니다.
Alexander Mills

답변:


110

실행 BGSAVE하거나 SAVE명령 행에서 데이터베이스의 스냅 샷을 dump.rdb에 저장하십시오 . 그러면 redis 서버와 같은 폴더에 dump.rdb라는 파일이 생성됩니다. 모든 서버 명령 목록을 참조하십시오 .

이 dump.rdb를 이주하려는 다른 redis 서버에 복사하십시오. redis가 시작되면 데이터베이스를 초기화 할이 파일을 찾습니다.


16
SAVE 명령은 덤프를 어디에 두나요? Redis는 시작을로드하기 위해 "dump.rdb"파일을 어디에서 찾습니까? 내 redis 구성에 dbfilename이 /var/db/redis/redis_state.rdb로 설정되어 있습니다. 이것이 "dump.rdb"대신 사용하는 파일 이름입니까?
Mojo

23
또한 실행중인 서버에서 SHUTDOWN을 호출하면 메모리 내용이 덤프 파일에 저장되므로 방금 배치 한 사본을 덮어 쓰므로 서버가 실행되는 동안이 스왑을 수행 할 수 없습니다. 먼저 서버를 종료하십시오. 그런 다음 덤프 파일을 덮어 씁니다. 그런 다음 서버를 다시 시작하십시오.
Houen

9
redis.conf에서 AOF 로깅을 사용 하는 경우 Redis 서버를 시작 appendonly = yes하기 no전에로 설정하십시오. 그렇지 않으면 새 데이터 세트가로드되지 않습니다. 데이터 세트가 메모리에로드되면 메모리 ( config set appendonly yes) 및 구성 파일 모두에서 다시 설정하십시오.
Matthew Ratzloff

5
Ubuntu에서 Redis conf 파일은에 저장되며 파일 /etc/redis/redis.conf을 검색하여 .rdb파일 위치를 찾을 수 있습니다 cat /etc/redis/redis.conf | grep "rdb". 내 경우에는/var/lib/redis
허먼 샤프

5
redis-cli config get dir.rdb저장된 디렉토리를 제공합니다 .
Kishor Pawar

253

먼저 서버 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보다 크거나 같아야 합니다 . 그렇지 않으면 호환성 문제가 발생할있습니다 .


32
허용 된 답변보다 나은 방법은 모든 세부 사항이 있습니다.
BTK

1
이것은 redis로 가져 오기가 redis 폴더에 덤프를 놓음으로써 수행되었음을 보여줌으로써 많은 시간을 절약했습니다.
RonnyKnoxville

7
맥에서 레디 스 백업은 / usr / 지방은 / var / DB / 레디 스 /에 저장됩니다
도노반 톰슨

3
@DonovanThomson 감사합니다. (나는 Mac에 redis를 설치하기 위해 homebrew를 사용했습니다.) ... 경로를 찾는 가장 일반적인 방법은 redis 명령을 사용 CONFIG GET dir하는 것입니다."/usr/local/var/db/redis"
Julian Soro

그리고이 과정에서 A로 옮긴 글에 대해 무엇을합니까?
Mike Graf

34

서버 간 연결이있는 경우 새 인스턴스를 슬레이브 노드로 사용하여 복제 (SQL과 달리 사소한)를 설정하는 것이 좋습니다. 그런 다음 단일 명령으로 새 노드를 마스터로 전환하고 가동 중지 시간이 없습니다.


1
연결되어 있습니다. 새 서버에서 slaveof 구성을 사용하여 이전 서버의 IP 주소로 설정할 수 있습니다. 그러나 마스터와 슬레이브간에 데이터 전송이 완료된 시점을 어떻게 알 수 있습니까? 그 후 노예를 어떻게 장인으로 승격시킬 수 있습니까?
ErJab

INFO 명령이 준비되면 알려줍니다. 그러나 한 번만 복사하는 것이 아니라 복제이기 때문에 이전 노드를 끄기 전에 원하는 시간 동안 두 노드를 그대로 둘 수 있습니다. SLAVEOF NONE은 새 노드를 마스터로 승격시키는 명령입니다.
Tom Clarkson

9
훌륭한 솔루션 인 것 같습니다. 명령 예제를 사용하면 좋을 것입니다!
knutole

16

SLAVEOF 명령을 사용하여 데이터를 마이그레이션 할 수도 있습니다.

SLAVEOF old_instance_name old_instance_port

로 키를 받았는지 확인하십시오 KEYS *. 다른 방법으로도 새 인스턴스를 테스트 할 수 있으며 완료되면 다음을 복제하십시오.

SLAVEOF NO ONE

이것은 가장 고통없는 접근법입니다!
noooooooob

13

요즘에는 2.6 이후로 사용 가능한 MIGRATE도 사용할 수 있습니다.

하나의 데이터베이스에서만 데이터를 옮기고 싶었 기 때문에 이것을 사용해야했습니다. 두 Redis 인스턴스는 서로 다른 두 머신에 있습니다.

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 를 참조하십시오 .


마이그레이션하려는 원격 redis는 무엇입니까?
noooooooob

4

redis 데이터를 가져올 때 dump.rdb를 배치해야하는 위치를 확인하려면

클라이언트를 시작

$redis-cli

그때

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

여기서 / Users / Admin은 서버에서 읽은 dump.rdb의 위치이므로 교체해야 할 파일입니다.


2

당신은 또한 rdd 를 사용할 수 있습니다

실행중인 redis 서버를 덤프 및 복원 할 수 있으며 덤프 키 필터 / 일치 / 이름 바꾸기를 허용합니다


2

다운 타임없는 마이그레이션의 핵심 요소는 다음과 같습니다.

한마디로 :

  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를 위한 대화식 도구도 있습니다.


1

또한 같은 일을하고 싶습니다 : 독립형 redis 인스턴스에서 다른 redis 인스턴스 (redis sentinel)로 DB를 마이그레이션하십시오.

데이터가 중요하지 않기 때문에 (세션 데이터) https://github.com/yaauie/redis-copy 시도해 볼 것입니다.


1

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

리눅스 시스템에서 redis를 실행하고 있는데 액세스 할 수 있습니다. 내 Windows 컴퓨터에 redis가 있습니다. 이러한 조합에 대한 데이터를 복사 할 수 있습니까?
Kamran Shahid

1
모두 같은 버전의 경우 나는 당신이 할 수있는 생각
마 오즈 사독

예, 버전도 확인해야합니다. 그러나 Windows 릴리스 버전은 내가 아는 마지막으로 3.0 이상이 아닙니다
Kamran Shahid


-2

redis-dump가 마침내 나를 위해 일했습니다. 이 문서는 Redis 데이터베이스를 덤프하고 다른 데이터베이스에 데이터를 삽입하는 방법의 예를 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.