Memorystore로 Memcache 마이그레이션

Memcache는 Python 2 런타임에 번들로 제공되는 분산형 인메모리 데이터 저장소입니다. 대부분의 App Engine 앱은 영구 스토리지에만 의존하는 대신 Memcache를 특정 태스크의 캐시로 사용합니다.

대신 Redis용 Memorystore는 Redis 인메모리 데이터 저장소를 통해 완전 관리형 서비스를 제공하여 밀리초 이하로 데이터에 액세스할 수 있는 애플리케이션 캐시를 빌드합니다.

Python 2 앱에서 Memcache를 사용하여 ndb 또는 Cloud NDB 요청의 지연 시간만 줄이는 경우 Memcache 또는 Redis용 Memorystore 대신 Cloud NDB의 기본 제공 Redis 지원을 사용할 수 있습니다.

Memorystore 권한 이해하기

Google Cloud 서비스와의 모든 상호작용은 승인을 받아야 합니다. 예를 들어 Memorystore에서 호스팅되는 Redis 데이터베이스와 상호작용하려면 앱에서 Memorystore에 액세스하도록 승인된 계정의 사용자 인증 정보를 제공해야 합니다.

기본적으로 앱은 앱과 동일한 프로젝트에 있는 데이터베이스에 액세스하도록 승인된 App Engine 기본 서비스 계정의 사용자 인증 정보를 제공합니다.

다음 조건 중 하나라도 해당하는 경우 사용자 인증 정보를 명시적으로 제공하는 대체 인증 기술을 사용해야 합니다.

  • 앱과 Memorystore 데이터베이스가 다른 Google Cloud 프로젝트에 있는 경우

  • 기본 App Engine 서비스 계정에 할당된 역할이 변경된 경우

대체 인증 기술에 대한 자세한 내용은 서버 간 프로덕션 애플리케이션용 인증 설정을 참조하세요.

마이그레이션 프로세스 개요

Memcache 대신 Memorystore를 사용하도록 Python 앱을 마이그레이션하려면 다음 안내를 따르세요.

  1. Redis용 Memorystore를 설정합니다. 이를 위해서는 Memorystore에 Redis 인스턴스를 만들고 앱에서 Redis 인스턴스와 통신하는 데 사용하는 서버리스 VPC 액세스를 만들어야 합니다.

  2. Redis용 클라이언트 라이브러리를 설치하고 Redis 명령어를 사용하여 데이터를 캐시합니다.

    Redis용 Memorystore는 모든 Redis용 클라이언트 라이브러리와 호환됩니다. 이 가이드에서는 redis-py 3.0 클라이언트 라이브러리를 사용하여 앱에서 Redis 명령어를 전송하는 방법을 설명합니다.

  3. 업데이트를 테스트합니다.

  4. App Engine에 앱을 배포합니다.

Redis용 Memorystore 설정

Redis용 Memorystore를 설정하려면 다음 안내를 따르세요.

  1. Memorystore에서 Redis 인스턴스를 만듭니다.

    Redis 인스턴스의 리전을 선택하라는 메시지가 표시되면 App Engine 앱이 있는 리전과 동일한 리전을 선택합니다.

  2. 만들려는 Redis 인스턴스의 IP 주소와 포트 번호를 기록합니다. 이 정보는 코드에서 Redis 클라이언트를 만들 때 사용됩니다.

  3. App Engine을 VPC 네트워크에 연결합니다. 앱은 VPC 커넥터를 통해서만 Memorystore와 통신할 수 있습니다.

    앱에서 커넥터를 사용하도록 구성의 설명대로 VPC 연결 정보를 app.yaml 파일에 추가해야 합니다.

종속 항목 설치

App Engine에서 앱을 실행할 때 redis-py 클라이언트 라이브러리를 앱에서 사용할 수 있도록 만들려면 다음 안내를 따르세요.

  1. 다음 줄을 앱의 requirements.txt 파일에 추가합니다.

     redis
    
  2. 여전히 Python 2 런타임에서 앱을 실행하는 경우 다음 안내를 따르세요.

    1. -t <directory> 플래그와 함께 pip(버전 6 이상)를 사용하여 lib라는 로컬 폴더에 라이브러리를 설치합니다. 예를 들면 다음과 같습니다.

      pip install -t lib <library_name> -r requirements.txt

    2. 앱의 appengine_config.py 파일이 lib 디렉터리를 지정하는지 확인합니다.

    App Engine은 appengine_config.py 파일에 지정된 디렉터리의 모든 라이브러리를 업로드합니다. 자세한 내용은 Python 2 라이브러리 사용을 참조하세요.

App Engine Python 3 런타임은 앱을 배포할 때 앱의 requirements.txt 파일을 자동으로 업로드합니다.

로컬 개발의 경우 Python 2용 virtualenv 또는 Python 3용 venv와 같은 가상 환경에 종속 항목을 설치하는 것이 좋습니다.

Redis 클라이언트 만들기

Redis 데이터베이스와 상호작용하려면 코드에서 Redis 클라이언트를 만들어 Redis 데이터베이스에 대한 연결을 관리해야 합니다. 다음 섹션에서는 redis-py 클라이언트 라이브러리를 사용하여 Redis 클라이언트를 만드는 방법을 설명합니다.

환경 변수 지정

redis-py 클라이언트 라이브러리는 2가지 환경 변수를 사용하여 Redis 데이터베이스의 URL을 어셈블합니다.

  • Memorystore에 만든 Redis 데이터베이스의 IP 주소를 식별하는 변수입니다.
  • Memorystore에 만든 Redis 데이터베이스의 포트 번호를 식별하는 변수입니다.

이러한 변수를 코드에서 직접 정의하는 대신 앱의 app.yaml 파일에서 정의하는 것이 좋습니다. 이렇게 하면 로컬 환경 및 App Engine과 같은 다양한 환경에서 앱을 간편하게 실행할 수 있습니다.

예를 들어 app.yaml 파일에 다음 줄을 추가합니다.

 env_variables:
      REDISHOST: '10.112.12.112'
      REDISPORT: '6379'

redis-py 가져오기 및 클라이언트 만들기

REDISHOSTREDISPORT 환경 변수를 정의한 후 다음 줄을 사용하여 redis-py 라이브러리를 가져오고 클라이언트를 만듭니다.

  import redis

  redis_host = os.environ.get('REDISHOST', 'localhost')
  redis_port = int(os.environ.get('REDISPORT', 6379))
  redis_client = redis.Redis(host=redis_host, port=redis_port)

다른 앱에 이전 버전의 redis-py를 사용했다면 Client 대신 StrictClient 클래스를 사용한 것일 수 있습니다. 하지만 현재 redis-py에서는 StrictClient 대신에 Client를 사용하는 것이 좋습니다.

Redis 명령어를 사용하여 캐시에 데이터 저장 및 검색

Memorystore Redis 데이터베이스는 대부분의 Redis 명령어를 지원하지만 그 중 몇 가지 명령어만 사용하여 캐시에서 데이터를 저장 및 검색해야 합니다. 다음 표에는 데이터를 캐시하는 데 사용할 수 있는 Redis 명령어가 나와 있습니다. 앱에서 이러한 명령어를 호출하는 방법은 클라이언트 라이브러리의 문서를 참조하세요.

Memcache는 대부분의 명령어에 비동기 대안을 제공하지만 redis-py 클라이언트 라이브러리가 항상 동일한 비동기 메서드를 제공하지는 않습니다. 캐시와의 모든 상호작용을 비동기화해야 하면 Python용 다른 Redis 클라이언트 라이브러리를 사용할 수 있습니다.
태스크 Redis 명령어
데이터 캐시에 항목을 만들고
항목의 만료 시간 설정
SETNX
MSETNX
캐시에서 데이터 검색 GET
MGET
기존 캐시 값 바꾸기 SET
MSET
숫자 캐시 값 증가 또는 감소 INCR
INCRBY
DECR
DECRBY
캐시에서 항목 삭제 DEL
UNLINK
캐시와의 동시 상호작용 지원(비교 및 설정) Redis 트랜잭션에 대한 세부정보를 참조하세요. redis-py 클라이언트 라이브러리를 사용하려면 모든 트랜잭션이 파이프라인에서 발생해야 합니다.

업데이트 테스트

앱을 로컬에서 테스트할 때는 프로덕션 데이터와의 상호작용을 방지하기 위해 Redis의 로컬 인스턴스를 실행하는 것이 좋습니다(Memorystore는 에뮬레이터를 제공하지 않음). Redis를 로컬에 설치 및 실행하려면 Redis 문서의 안내를 따르세요. 현재 Windows에서는 Redis를 로컬에서 실행할 수 없습니다.

Python 2 앱 테스트에 대한 자세한 내용은 로컬 개발 서버 사용을 참조하세요.

앱 배포

앱이 로컬 개발 서버에서 오류 없이 실행되면 다음을 수행합니다.

  1. App Engine에서 앱을 테스트합니다.

  2. 앱이 오류 없이 실행되면 트래픽 분할을 사용하여 업데이트된 앱의 트래픽을 천천히 늘립니다. 앱을 면밀히 모니터링하여 데이터베이스에 문제가 없는 것을 확인한 후 더 많은 트래픽을 업데이트된 앱으로 라우팅합니다.