Memorystore for Memcached에서 Memorystore for Valkey로 마이그레이션

Memcached용 Memorystore 워크로드를 Memorystore for Valkey로 마이그레이션하는 것이 좋습니다. Memorystore for Memcached는 키-값 데이터 스토어이지만 Memorystore for Valkey는 기능이 더 풍부한 데이터 구조 서버입니다.

Memorystore for Valkey는 Memorystore for Memcached와 유사한 기능을 제공합니다. 또한 Memorystore for Valkey에는 다음과 같은 이점이 있습니다.

  • Redis 호환 오픈소스 프로젝트인 Valkey를 위한 완전 관리형 고성능 인메모리 데이터 스토어를 제공합니다.
  • Google Cloud를 위한 완전 관리형 Valkey 서비스로, 클러스터 모드 사용 설정 인스턴스와 클러스터 모드 사용 중지 인스턴스를 모두 지원합니다.
  • Google Cloud 에서 실행되는 애플리케이션은 복잡한 Valkey 배포를 관리할 필요 없이 확장성, 가용성, 안전성이 뛰어난 Valkey 서비스를 활용하여 성능을 극대화할 수 있습니다.

Memorystore for Valkey 기능

Memorystore for Valkey로 마이그레이션하면 Memorystore for Memcached에서는 사용할 수 없는 기능에 액세스할 수 있습니다. 이러한 기능을 통해 애플리케이션 개발, 안정성, 성능을 개선할 수 있습니다.

다음 표에는 Memorystore for Valkey에서 사용할 수 있는 기능이 나열되어 있으며 이러한 기능을 사용할 때의 이점이 설명되어 있습니다.

기능 설명 장점
다중 데이터베이스 Memorystore for Memcached는 단일 플랫 키 스페이스입니다. 하지만 기본적으로 Memorystore for Valkey의 클러스터 모드 사용 중지됨 모드는 인스턴스당 최대 16개의 데이터베이스를 지원합니다. 인스턴스에 최대 100개의 데이터베이스를 사용할 수 있도록 환경을 구성할 수 있습니다. 인스턴스에 데이터베이스가 여러 개 있으면 인스턴스의 단일 장애점을 방지하고, 다른 데이터베이스의 가용성이나 일관성에 영향을 주지 않고 단일 데이터베이스를 백업하거나 복원할 수 있으며, 데이터베이스를 더 효율적으로 확장하거나 이전할 수 있습니다.
리치 데이터 구조 문자열 외에도 Memorystore for Valkey는 목록, 집합, 정렬된 집합, 해시, 비트맵을 지원합니다. Valkey용 Memorystore는 Bloom 필터, 벡터 검색, JSON도 지원합니다. 애플리케이션 직렬화 없이 리더보드, 작업 대기열, 객체 캐싱과 같은 복잡한 사용 사례에 Memorystore for Valkey를 사용할 수 있습니다. 벡터 검색을 사용하여 1밀리초 미만의 지연 시간으로 시맨틱 쿼리를 실행할 수도 있습니다.
거래 MULTIEXEC 명령어를 사용하여 명령어 그룹을 원자적으로 분할할 수 없는 단일 단위로 실행할 수 있습니다. 키 수준에서 낙관적 잠금에 Memorystore for Memcached의 비교 후 교환 (CAS) 기능을 사용할 수 있지만 Memorystore for Valkey를 사용하면 명령 그룹을 원자적으로 실행할 수 있습니다.
Pub/Sub 메시지 Memorystore for Valkey와 함께 Pub/Sub를 사용하면 클라이언트 애플리케이션이 채널을 구독하고 실시간 메시지를 수신할 수 있습니다. Valkey용 Memorystore를 사용하면 캐시를 실시간 업데이트 및 서비스 간 통신을 위한 경량 메시지 브로커로 변환할 수 있습니다.
Lua 스크립트 Lua를 사용하여 EVAL 명령어를 통해 서버에서 복잡한 애플리케이션 논리를 원자적으로 실행할 수 있습니다. 서버 측 스크립트를 사용하면 네트워크 왕복이 줄어들고 Memorystore for Valkey가 중단 없이 복잡한 작업을 실행할 수 있습니다. 이렇게 하면 애플리케이션의 성능이 향상됩니다.
고가용성, 복제, 샤드 지원 Memorystore for Valkey의 아키텍처는 고가용성 (HA)을 지원하고 제공합니다. 클라이언트 애플리케이션은 개별 엔드포인트 (또는 샤드)에 연결하여 Memorystore for Valkey 노드에 직접 액세스할 수 있습니다. HA 및 복제를 사용하면 시스템의 안정성이 향상되고 중요한 업데이트 중에 발생하는 중단이 최소화됩니다. 샤드를 사용하면 클라이언트 애플리케이션과 관련된 높은 트래픽 부하를 효과적으로 분산할 수 있습니다.
지속성

Memorystore for Valkey는 다음과 같은 유형의 영속성을 지원합니다.

  • Append-only file (AOF): 데이터 내구성에 사용됩니다. 모든 쓰기 명령어를 AOF 파일이라는 로그 파일에 기록하여 데이터를 내구성 있게 저장합니다. 시스템 장애나 재시작이 발생하면 서버가 AOF 파일 명령어를 순차적으로 재생하여 데이터를 복원합니다.
  • Redis 데이터베이스 (RDB): 데이터 보호에 사용됩니다. 내구성 있는 스토리지에 데이터 스냅샷을 저장하여 데이터를 보호합니다. 노드 장애가 발생하면 데이터를 복구할 수 있습니다.
AOF 및 RDB 지속성을 사용하면 중요한 데이터를 Memorystore for Valkey에 내구적으로 저장할 수 있습니다. 언제든지 데이터를 복구할 수 있습니다. Memorystore for Valkey는 기본 지속성 메커니즘을 처리하므로 지속성을 사용하는 데 필요한 준비가 거의 없습니다.

워크로드 마이그레이션

Memorystore for Memcached 워크로드를 Memorystore for Valkey로 마이그레이션하려면 다음 작업을 완료해야 합니다.

  1. 클라이언트 라이브러리 수정: 애플리케이션의 클라이언트 라이브러리를 Memcached 라이브러리에서 Valkey 라이브러리로 변경합니다.
  2. 명령어 수정: 클라이언트 애플리케이션의 Memcached API에 대한 모든 명령어를 Valkey API에 해당하는 명령어로 바꿉니다.
  3. 마이그레이션 배포 및 확인: 마이그레이션을 설정하고 이를 사용하여 워크로드를 Memorystore for Valkey로 마이그레이션할 수 있는지 확인합니다.

클라이언트 라이브러리 수정

이 섹션에서는 애플리케이션의 클라이언트 라이브러리를 Memcached 라이브러리에서 Valkey 라이브러리로 변경합니다.

다음 표에는 Python, Java, Go, Node.js용 Memcached 클라이언트 라이브러리와 Valkey의 해당 라이브러리의 예가 나와 있습니다.

언어 Memcached 클라이언트 라이브러리 Valkey 클라이언트 라이브러리
Python python-memcached, pymemcache valkey-py
자바 spymemcached Valkey GLIDE, valkey-java
Go gomemcache Valkey GLIDE, valkey-go
Node.js memjs Valkey GLIDE, ioredis

명령어 수정

이 섹션에서는 클라이언트 애플리케이션의 Memcached API에 대한 모든 명령어를 Valkey API의 해당 명령어로 바꿉니다.

명령어를 수정하려면 다음 작업을 완료해야 합니다.

  1. 연결 설정 수정: 클라이언트 애플리케이션의 연결을 Memcached 서버에서 Valkey 서버로 변경합니다.
  2. 명령어 수정: 모든 Memcached API 명령어를 Valkey API의 해당 명령어로 바꿉니다.

연결 설정 수정

이 섹션에서는 클라이언트 애플리케이션의 연결을 Memcached 서버에서 Valkey 서버로 변경합니다.

  1. 클라이언트 애플리케이션을 Memcached 서버에 연결하는 데 사용하는 코드를 찾습니다. 다음 코드와 유사할 수 있습니다.

    import memcache;
    mc = memcache.Client(['MEMCACHED_IP_ADDRESS:11211'])
    

    MEMCACHED_IP_ADDRESS을 Memorystore for Memcached 인스턴스의 IP 주소로 바꿉니다.

  2. 클라이언트 애플리케이션이 Valkey 서버에 연결할 수 있도록 이 코드를 수정합니다. 다음 코드와 유사할 수 있습니다.

    import valkey;
    v = valkey.Valkey(host=VALKEY_IP_ADDRESS, port=6379, db=0)
    

    마이그레이션을 배포하고 확인할 때 만드는 Memorystore for Valkey 인스턴스의 IP 주소로 VALKEY_IP_ADDRESS를 바꿉니다.

명령어 수정

이 섹션에서는 클라이언트 애플리케이션의 모든 Memcached API 명령어를 Valkey API의 해당 명령어로 바꿉니다.

DECR

DECR 명령어를 사용하면 키에 저장된 값을 지정된 양만큼 감소시킬 수 있습니다.

  1. Memcached에서 DECR 명령어에 사용하는 코드를 찾습니다. 다음 코드와 비슷할 수 있습니다.

    mc.DECR('KEY_NAME', AMOUNT)
    

    다음을 바꿉니다.

    • KEY_NAME: 키의 이름입니다.
    • AMOUNT: 키에 저장된 숫자를 감소시킬 값입니다. 이 값은 정수여야 합니다.
  2. Valkey와 함께 사용할 수 있도록 이 코드를 수정합니다. 수정사항은 다음 코드와 비슷할 수 있습니다.

    v.DECR('KEY_NAME', AMOUNT)
    
삭제

DELETE 명령어를 사용하면 키를 삭제할 수 있습니다. 예를 들어 사용자를 삭제할 수 있습니다.

  1. Memcached에서 DELETE 명령어에 사용하는 코드를 찾습니다. 다음 코드와 비슷할 수 있습니다.

    mc.DELETE('USERNAME')
    

    USERNAME을 삭제할 사용자의 이름으로 바꿉니다.

  2. Valkey와 함께 사용할 수 있도록 이 코드를 수정합니다. 수정사항은 다음 코드와 비슷할 수 있습니다.

    v.DELETE('USERNAME')
    
GET

GET 명령어를 사용하면 키와 연결된 값을 검색할 수 있습니다. 예를 들어 사용자에 관한 정보를 가져올 수 있습니다.

  1. Memcached에서 GET 명령어에 사용하는 코드를 찾습니다. 다음 코드와 비슷할 수 있습니다.

    data = mc.GET('USERNAME')
    

    USERNAME을 정보를 가져오려는 사용자의 이름으로 바꿉니다.

  2. Valkey와 함께 사용할 수 있도록 이 코드를 수정합니다. 수정사항은 다음 코드와 비슷할 수 있습니다.

    data = v.GET('USERNAME')
    
INCR

INCR 명령어를 사용하면 키에 저장된 값을 지정된 양만큼 증분할 수 있습니다.

  1. Memcached에서 INCR 명령어에 사용하는 코드를 찾습니다. 다음 코드와 비슷할 수 있습니다.

    mc.INCR('KEY_NAME', AMOUNT)
    

    다음을 바꿉니다.

    • KEY_NAME: 키의 이름입니다.
    • AMOUNT: 키에 저장된 숫자를 증분할 값입니다. 이 값은 정수여야 합니다.
  2. Valkey와 함께 사용할 수 있도록 이 코드를 수정합니다. 수정사항은 다음 코드와 비슷할 수 있습니다.

    v.INCR('KEY_NAME', AMOUNT)
    
MGET

MGET 명령어를 사용하면 단일 명령어에서 여러 키의 값을 가져올 수 있습니다. MGET를 사용하면 환경의 성능이 향상됩니다.

  1. Memcached에서 MGET 명령어에 사용하는 코드를 찾습니다. 다음 코드와 비슷할 수 있습니다.

    data_map = mc.get_multi(['KEY_NAME_1', 'KEY_NAME_2'])
    

    KEY_NAME_1KEY_NAME_2을 정보를 가져오려는 키의 이름으로 바꿉니다.

  2. Valkey와 함께 사용할 수 있도록 이 코드를 수정합니다. 수정사항은 다음 코드와 비슷할 수 있습니다.

    data_list = v.MGET(['KEY_NAME_1', 'KEY_NAME_2'])
    
SET

SET 명령어를 사용하면 키의 값을 지정할 수 있습니다. 예를 들어 시스템에 액세스하는 사용자의 만료 시간을 초 단위로 설정할 수 있습니다.

  1. Memcached에서 SET 명령어에 사용하는 코드를 찾습니다. 다음 코드와 비슷할 수 있습니다.

    mc.SET('USERNAME', 'data', time=EXPIRATION_TIME)
    

    다음을 바꿉니다.

    • USERNAME: 시스템에 액세스하는 사용자의 이름
    • EXPIRATION_TIME: 사용자가 시스템에 더 이상 액세스할 수 없게 될 때까지 남은 시간(초)
  2. Valkey와 함께 사용할 수 있도록 이 코드를 수정합니다. 수정사항은 다음 코드와 비슷할 수 있습니다.

    v.SET('USERNAME', 'data', ex=EXPIRATION_TIME)
    

마이그레이션 배포 및 확인

이 섹션에서는 마이그레이션을 설정하고 이를 사용하여 워크로드를 Memorystore for Valkey로 마이그레이션할 수 있는지 확인합니다.

이전을 배포하고 확인하려면 다음 단계를 완료하세요.

  1. Memorystore for Valkey 인스턴스 만들기: 만드는 인스턴스의 크기가 Memorystore for Memcached 인스턴스와 유사해야 합니다. 또한 Cloud Monitoring을 사용하여 Memorystore for Valkey 인스턴스의 사용량을 모니터링합니다.
  2. 두 인스턴스 모두에 쓰기: 무중단 마이그레이션을 위해 두 인스턴스 모두에 쓰도록 애플리케이션을 수정합니다. 이렇게 하면 Valkey 캐시가 채워지고 주요 모니터링 측정항목을 벤치마킹할 수 있습니다.
  3. Memorystore for Memcached 인스턴스로의 트래픽 중지: 읽기 작업이 Memorystore for Valkey 인스턴스의 IP 주소와 포트 번호 (6379)를 가리키도록 애플리케이션의 구성을 변경합니다.
  4. 애플리케이션 모니터링: 애플리케이션의 오류율과 지연 시간을 모니터링합니다.
  5. Memorystore for Memcached 인스턴스 삭제: Memorystore for Memcached 인스턴스에 쓰기를 중지한 다음 인스턴스를 삭제합니다.

FAQ

이 섹션에는 Memorystore for Memcached 워크로드를 Memorystore for Valkey로 마이그레이션하는 데 대해 자주 묻는 질문 (FAQ)이 포함되어 있습니다.

Memorystore for Valkey로 마이그레이션하는 이유는 무엇인가요?

Valkey는 Redis 코드베이스의 고성능 오픈소스 프로젝트 포크입니다. Valkey용 Memorystore는 Redis 프로토콜과 호환되는 관리형 서비스를 제공합니다. 이를 통해 기존의 모든 Redis 클라이언트 라이브러리와 명령어가 원활하게 작동합니다. Memorystore for Valkey로 이전하는 것은 표준, Redis 호환 서버로 이전하는 것과 기능적으로 동일합니다.

네트워크 방화벽 규칙을 재구성해야 하나요?

Memorystore for Memcached 인스턴스는 일반적으로 포트 11211을 사용하는 반면 Memorystore for Valkey 인스턴스는 포트 6379를 사용합니다. Virtual Private Cloud (VPC) 방화벽 규칙이 애플리케이션에서 올바른 포트의 Memorystore for Valkey 인스턴스로 이그레스 트래픽을 허용하는지 확인해야 합니다.

Valkey는 복잡한 객체의 직렬화를 어떻게 처리하나요?

Memcached는 Python 객체나 Java 객체와 같은 복잡한 객체의 구조를 알지 못하므로 모든 객체를 불투명한 Blob으로 취급합니다.

따라서 데이터가 네트워크에 도달하기 전에 직렬화가 클라이언트 애플리케이션 측에서 완전히 이루어집니다. 서버에는 바이트 배열만 표시됩니다. 예를 들어 사용자의 이메일 주소와 같은 단일 속성을 읽으려면 직렬화된 전체 객체를 가져와 애플리케이션에서 역직렬화한 다음 속성과 연결된 필드를 읽어야 합니다.

Valkey는 blob을 저장하고 복잡한 객체의 구조를 이해할 수 있습니다. Valkey를 사용하여 객체의 필드를 Valkey 해시 테이블로 확장할 수도 있습니다. 이 표를 사용하여 깊이 중첩된 값을 직접 가져올 수 있습니다.

다음 예에서는 Valkey 해시 테이블을 사용하여 사용자의 이메일 주소를 가져옵니다.

# valkey-py
client.hset("user:101", mapping={
    "name": "username",
    "email": "username@example.com",
    "login_count": 10
})
client.hget("user:101", "email") # -> b"username@example.com"

Memcached와 Valkey의 통신 프로토콜은 어떻게 다른가요?

Memcached는 ASCII 프로토콜과 선택적 바이너리 프로토콜을 사용합니다. Valkey는 Redis 직렬화 프로토콜 (RESP)을 사용합니다.

프로토콜은 다르지만 최신 Valkey 클라이언트 애플리케이션 라이브러리는 RESP 프로토콜을 자동으로 처리합니다. 이렇게 하면 프로토콜 간의 차이가 애플리케이션 코드에 투명해집니다.

Memorystore for Valkey로 마이그레이션한 후 flags 필드를 어떻게 매핑하나요?

Memorystore for Memcached는 flags 필드를 지원합니다. 이 필드에는 클라이언트 애플리케이션 라이브러리가 저장된 값에 관한 메타데이터를 저장하는 데 사용하는 32비트 부호 없는 정수가 포함됩니다.

Memorystore for Valkey는 이 필드를 지원하지 않습니다. flags 필드를 Memorystore for Valkey에 매핑하려면 다음 단계를 완료하세요.

  1. 플래그를 문자열 객체의 키 이름으로 직렬화합니다.
  2. 플래그를 문자열 객체의 값으로 직렬화합니다.
  3. 플래그용 지정된 필드가 있는 해시 객체를 사용합니다.

Memorystore for Valkey는 더 나은 성능을 제공하나요?

대부분의 시나리오에서 Memorystore for Valkey의 성능이 더 좋습니다. 이는 Valkey의 고급 데이터 구조, 지속적인 연결, 파이프라인 지원, 다중 키 작업의 효율성 개선 때문입니다. 하지만 클라이언트 라이브러리와 명령어를 올바르게 수정해야 합니다.

Memorystore for Memcached 인스턴스에서 여러 노드를 사용하는 경우 Memorystore for Valkey에서는 어떻게 해야 하나요?

마이그레이션을 배포하고 확인할 때 Memorystore for Valkey에서 클러스터 모드 지원 인스턴스를 만듭니다. 이러한 인스턴스는 샤딩과 고가용성을 내부적으로 처리하며 애플리케이션에 단일 엔드포인트로 표시됩니다. 이렇게 하면 애플리케이션의 클라이언트 측 로직이 간소화됩니다.

Memorystore for Memcached 인스턴스에서 여러 노드를 사용하는 경우 Memorystore for Valkey 인스턴스에 어떤 노드 유형을 사용하는 것이 좋을까요?

각 Memorystore for Memcached 인스턴스의 노드 크기를 확인하려면 노드당 메모리 속성과 연결된 값을 확인하세요. 그런 다음 다음 표를 사용하여 해당 Memorystore for Valkey 인스턴스의 노드 유형을 확인합니다.

Memorystore for Memcached 노드 크기 Memorystore for Valkey 노드 유형 총 노드 용량 vCPU 수
1GB 미만 shared-core-nano 1.4GB 0.5 (공유됨)
1GB~5GB standard-small 6.5GB 2
6GB~12GB highmem-medium 13.0 GB 2
13GB~50GB highmem-xlarge 58.0 GB 8

shared-core-nano 노드 유형은 소규모 워크로드용입니다. 이 노드 유형은 가변 성능을 제공하며 SLA가 없으므로 프로덕션 워크로드에는 적합하지 않습니다.

Memorystore for Valkey 인스턴스에 선택하는 가상 CPU (vCPU)가 많을수록 성능이 향상됩니다. 인스턴스에서 리소스 집약적인 워크로드를 실행하는 경우 vCPU가 더 높은 노드 유형 (예: highmem-xlarge)을 선택합니다. 인스턴스에서 요구사항이 낮은 작업을 실행하는 경우 vCPU가 더 낮은 노드 유형 (예: highmem-medium)을 선택합니다.