Memorystore로 Memcache 마이그레이션

확장 가능한 고성능 Python 3 웹 애플리케이션은 특정 태스크에 대해 분산형 메모리 내 데이터 캐시를 견고한 영구 스토리지 대신 사용하는 경우가 많습니다.

이를 위한 App Engine 솔루션은 특정 태스크의 캐시로 사용되는 분산형 메모리 내 데이터 스토어인 Memcache입니다.

기존 번들 서비스에서 마이그레이션할 때 App Engine Memcache에 권장되는 대안은 오픈소스 캐싱 엔진인 Redis 및 Memcached를 지원하는 완전 관리형 클라우드 기반 캐싱 서비스인 Memorystore입니다. 이 가이드에서는 1밀리초 미만의 데이터 액세스를 제공하는 애플리케이션 캐시를 빌드할 수 있는 Redis용 Memorystore 사용에 대해 설명합니다.

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

시작하기 전에 앱이 Redis용 Memorystore 할당량 내에 있는지 확인합니다.

Python 앱에 메모리 캐시를 사용해야 하는 경우

Python 앱에서 세션 데이터, 사용자 환경설정, 웹페이지의 쿼리를 통해 반환되는 기타 데이터도 캐시하기에 적절한 대상입니다. 일반적으로 자주 실행되는 쿼리가 앱에 즉시 표시할 필요가 없는 일련의 결과를 반환하는 경우 이 결과를 캐시할 수 있습니다. 후속 요청에서는 캐시를 확인하여 결과가 없거나 만료된 경우에만 데이터베이스를 쿼리합니다.

다른 영구 스토리지에 백업하지 않고 Memcache에만 값을 저장할 경우 값이 만료되어 캐시에서 삭제되면 애플리케이션이 정상적으로 동작하는지 확인해야 합니다. 예를 들어 사용자의 세션 데이터가 갑자기 사라져서 세션이 오작동하는 경우 세션 데이터를 Memorystore 외에 데이터베이스에도 저장해야 합니다.

시작하기 전에

아직 하지 않은 경우 Google Cloud와 호환되는 Python 버전을 사용하도록 Python 개발 환경을 설정하고 격리된 Python 환경을 만드는 테스트 도구를 설치하세요.

Memorystore 권한 이해하기

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

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

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

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

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

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

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

Python 앱에서 Memcache 대신 Memorystore를 사용하려면 다음 단계를 따르세요.

  1. Redis용 Memorystore를 설정합니다. 이를 위해서는 Memorystore에 Redis 인스턴스를 만들고 앱에서 Redis 인스턴스와 통신하는 데 사용하는 서버리스 VPC 액세스를 만들어야 합니다. 이 두 독립 항목을 만드는 과정은 엄격한 순서를 따르지 않으며 어떤 순서로든 설정할 수 있습니다. 이 가이드의 안내에서는 먼저 서버리스 VPC 액세스를 설정하는 방법을 보여줍니다.

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

    Redis용 Memorystore는 모든 Redis용 클라이언트 라이브러리와 호환됩니다.

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

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

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

Redis용 Memorystore 설정

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

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

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

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

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

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

종속 항목 설치

redis-py 클라이언트 라이브러리를 사용하려면 다음 단계를 따르세요.

  1. app.yaml 파일을 업데이트합니다. 사용 중인 Python 버전에 해당하는 안내를 따르세요.

    Python 2

    Python 2 앱의 경우 최신 버전의 grpcio, setuptools 라이브러리를 추가하세요.

    다음은 app.yaml 파일의 예시입니다.

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    - name: setuptools
      version: latest
    

    Python 3

    Python 3 앱의 경우 지원되는 Python 3 버전을 사용하여 app.yaml 파일에서 runtime 요소를 지정합니다. 예를 들면 다음과 같습니다.

    runtime: python310 # or another support version
    

    Python 3 런타임은 라이브러리를 자동으로 설치하므로 이전 Python 2 런타임의 기본 제공 라이브러리를 지정할 필요가 없습니다. 마이그레이션 시 Python 3 앱이 다른 기존 번들 서비스를 사용하는 경우 계속 필요한 기본 제공 라이브러리를 지정할 수 있습니다. 또는 app.yaml 파일에서 불필요한 줄을 삭제할 수도 있습니다.

  2. requirements.txt 파일을 업데이트합니다. 사용 중인 Python 버전에 해당하는 안내를 따르세요.

    Python 2

    Redis용 Memorystore의 Cloud 클라이언트 라이브러리를 requirements.txt 파일의 종속 항목 목록에 추가합니다.

    redis
    

    pip install -t lib -r requirements.txt를 실행하여 앱에 사용 가능한 라이브러리 목록을 업데이트합니다.

    Python 3

    Redis용 Memorystore의 Cloud 클라이언트 라이브러리를 requirements.txt 파일의 종속 항목 목록에 추가합니다.

    redis
    

    App Engine은 Python 3 런타임에서 앱 배포 중에 이러한 종속 항목을 자동으로 설치하므로, lib 폴더가 있는 경우 이를 삭제하세요.

  3. Python 2 앱의 경우 앱에서 lib 디렉터리에 지정된 기본 제공 또는 복사된 라이브러리를 사용한다면 app.yaml 파일과 동일한 폴더에 있는 appengine_config.py 파일에서 해당 경로를 지정해야 합니다.

    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set PATH to your libraries folder.
    PATH = 'lib'
    # Add libraries installed in the PATH folder.
    vendor.add(PATH)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(PATH)
    

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 명령어가 나와 있습니다. 앱에서 이러한 명령어를 호출하는 방법은 클라이언트 라이브러리의 문서를 참조하세요.

Python 2 앱의 경우 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 앱 테스트에 대한 자세한 내용은 로컬 개발 서버 사용을 참조하세요.

앱 배포

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

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

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

다음 단계