Redis 데이터를 새 서버에 복사

10559 단어 rubydevopsredis
Redis 데이터를 새 인스턴스에 복사해야 하는 경우가 있습니다.

3가지 간단한 방법을 알고 있습니다.
  • 연속 마이그레이션 도구
  • 데이터를 복사하는 간단한 스크립트
  • redis 마스터-슬레이브 복제

  • 더 복잡한 기타 옵션:
  • Redis HA 및 Sentinel 솔루션 - redis 재구축이 필요함

  • https://github.com/Netflix/dynomite - 복제 및 라우팅

  • redis-migrate-tool



    https://github.com/vipshop/redis-migrate-tool

    원본 서버/클러스터의 변경 사항을 모니터링하고 대상 서버에 적용합니다. 새 redis 인스턴스를 사용하기 위해 redis에 적극적으로 쓰는 앱을 마이그레이션할 때 유용합니다. 다른 유사한 도구가 있지만 이 도구는 작동하고 구성하기 쉽습니다.

    지원되는 유형에 대한 README를 확인하십시오. C로 작성되었으며 docker로 실행하기가 더 쉽습니다.

    docker pull ahmadgh21/redis-migrate-tool
    docker run -it ahmadgh21/redis-migrate-tool bash
    # inside container
    mkdir /tmp
    chmod 777 /tmp
    apt-get update
    apt install nano
    nano /etc/redis-migrate-tool/rmt.conf
    


    구성 예

    [source]
    type: single
    hash: fnv1a_64
    hash_tag: "{}"
    distribution: ketama
    servers :
    - <source IP>:6379 # <--- change this
    
    [target]
    type: single
    servers:
    - <destination IP>:6379 # <--- change this
    
    [common]
    listen: 0.0.0.0:8888
    


    컨테이너 내에서 마이그레이션 도구 실행

    /opt/redis-migrate-tool -c /etc/redis-migrate-tool/rmt.conf
    


    나만의 스크립트 만들기



    이 스크립트는 단순히 서버 A에서 서버 B로 모든 키를 복사합니다(모든 데이터 유형을 지원하지는 않습니다. 코드에서 찾으십시오).

    require 'redis'
    
    puts "Connecting to redis://#{ARGV[0]} and redis://#{ARGV[1]}"
    
    redis_src = Redis.new(url: "redis://#{ARGV[0]}")
    redis_dest = Redis.new(url: "redis://#{ARGV[1]}")
    
    dest_keys = redis_dest.keys("*")
    
    redis_src.keys("*").each do |key|
      next if dest_keys.include?(key)
      type = redis_src.type(key)
    
      if type == "hash"
        value = redis_src.hgetall(key)
        puts "HASH   #{key} : #{value}"
        redis_dest.mapped_hmset(key, value)
      elsif type == "list"
        values = redis_src.lrange(key, 0, -1)
        puts "LIST.  #{key} : #{values}"
        redis_dest.lpush(key, values)
      elsif type == "set"
        values = redis_src.smembers(key)
        puts "SET    #{key} : #{values}"
        redis_dest.sadd(key, values)
      else
        data = redis_src.get(key)
        puts "STRING #{key} : #{data}"
        redis_dest.set(key, data)
      end
    end
    
    puts "Complete"
    


    Ruby redis 라이브러리가 설치되어 있는지 확인하십시오( gem install redis ).

    스크립트 실행

    ruby redis_copy.rb source_IP destination_IP
    


    redis 복제 설정



    이것이 가장 적절한 선택이라고 생각하지만 더 많은 준비가 필요합니다.

    마스터에서 구성을 업데이트해야 합니다.

    protected-mode no
    requirepass 1234abcd
    


    레플리카 서버에서 우리는 설정을 넣어야 합니다:

    replicaof <master ip> 6379
    masterauth 1234abcd
    


    마스터를 다시 시작한 다음 복제본을 다시 시작하고 로그를 확인하십시오.

    redis-cli에서 상태 확인

    INFO replication
    


    더 많은 문서:
  • https://redis.io/docs/manual/replication/
  • https://www.vultr.com/docs/how-to-set-up-a-redis-replication-cluster
  • https://medium.com/dlt-labs-publication/how-to-setup-redis-replication-c9cc89ba6c03

  • 장점과 단점



    간단한 스크립트 - 값을 한 번만 복사하면 캐시, 속도 제한과 같이 중요하지 않은 데이터 및 구성과 같이 거의 업데이트되지 않는 데이터에 사용할 수 있습니다.

    나는 보통 새 서버에 연결하기 위해 앱을 업데이트하기 전에 한 번 실행하고 모든 데이터가 동기화되었는지 확인하기 위해 다시 한 번 실행합니다.

    redis-migrate-tool - 소스에서 대상으로 모든 데이터를 지속적으로 복제합니다. 지속적으로 redis에 업데이트를 작성하는 앱의 경우. 사용자 세션, 임시 중요 값.

    그러나 대상 서버에서 다시 소스로 쓰기를 복제하지 않습니다. 한 프로세스가 새 서버에 쓰기/업데이트하고 다른 프로세스가 이전 서버에서 찾을 수 없는 상황을 방지하려면 업데이트된 구성으로 한 번에 모든 앱을 다시 시작해야 합니다. (마이그레이션하는 동안 보통 앱을 1개의 복제본으로 축소합니다.)

    redis 복제 - 복제본을 쓸 수 없습니다. 마이그레이션에 짧은 가동 중지 시간이 필요하거나 원활하게 처리하기 위해 코드를 수정해야 합니다. 코드에서 데이터를 새 서버에 저장하려고 시도하고 "쓸 수 없음"오류가 발생하면 이전 서버에 저장합니다.


    지금 하고 있는 모든 분들에게 원활한 Redis 마이그레이션을 진행하세요 :)

    좋은 웹페이지 즐겨찾기