2013-07-15 2 views
2

Heroku의 Memcachier를 사용하여 멋진 캐시 머신 Django 앱 (https://github.com/jbalogh/django-cache-machine)을 사용하고 싶습니다.Heroku Memcachier에서 Django 캐시 시스템을 구성 하시겠습니까?

Memcachier에 PyLibMC 및 SASL 인증이 필요하기 때문에 Cache Machine은 Memcachier와 함께 작동하지 않습니다 (https://devcenter.heroku.com/articles/memcachier#django 참조). Cache Machine은 PyLibMC를 지원한다고 말합니다. "caching.backends.memcached.PyLibMCCache"를 CACHES 설정으로 가져 가면됩니다.

는하지만,이 오류 얻을, 그렇게 할 때 "memcached_set에서 오류 47 : 서버에 장애가 발생한 TIMED RETRY UNTIL 사용할 수 없습니다"나는이의 원인이 caching.backends.memcached입니다 생각

. PyLibMCCache는 django.core.cache.backends.memcached.PyLibMC (https://github.com/jbalogh/django-cache-machine/blob/master/caching/backends/memcached.py 참조)에서 상속 받아 django_pylibmc.memcached.PyLibMCCache에서 상속 받아 Heroku에서 작동합니다 (그러나 이것은 어둠 속에서 일종의 샷입니다).

대신 django_pylibmc.memcached.PyLibMCCache에서 상속받은 내 자신의 사용자 지정 캐시 백엔드를 만들었지 만 지금 Heroku Memcachier 패널을 검사하면 캐시를 늘리는 것이 나타나지 않습니다. mb, 비록 그것이 각 쿼리 집합과 함께 증가 할 것이라고 기대할지라도.

누가 Heroku에서 캐시 컴퓨터를 성공적으로 설정 했습니까? 그렇다면 어떻게하셨습니까?

답변

3

저는 MemCachier에서 작업합니다. 우리는 이전에 Cache Machine을 직접 다루지 않았지만, Heroku 및 MemCachier에서 제대로 작동하는지 확인하기 위해 작은 응용 프로그램을 만들었습니다.

memcache 및 MemCachier에 익숙하지 않은 경우 빠른 배경을 제공합니다. 클라이언트와 서버 사이의 통신을위한 두 가지 프로토콜이 있습니다. 하나는 이전 ascii 프로토콜이고 다른 하나는 최신 binary 프로토콜입니다. 우리는 MemCachier에서 프로토콜이 인증을 지원하지 않으므로 binary 프로토콜 만 지원합니다.

실수는 캐시 백엔드로 caching.backends.memcached.PyLibMCCache을 사용하고 있습니다. pylibmcbinary 프로토콜과 sasl 인증을 지원하므로 memcache 클라이언트이지만 Django와 함께 제공되는 캐시 인터페이스는 슬프게도 바이너리 프로토콜을 지원하지 않습니다. 그래서 pylibmc는 간단히 기본값 인 ascii 프로토콜을 사용하고 실패합니다.

이 문제에 대한 장고 티켓을 here에서 볼 수 있습니다.

마찬가지로 MemCachier에서는 대체 django-pylibmc-sasl 패키지를 사용하도록 권장했습니다. 이 패키지는 pylibmc을 사용하지만 django가 제공하는 캐시 인터페이스와 다른 캐시 인터페이스를 제공합니다. 이 바이너리 프로토콜 및 인증을 지원하도록 지원합니다. 자세한 내용은 here 설명서를 참조하십시오. 여기

내가 일반적으로 MemCachier 장고의 캐시를 구성 할 settings.py에 배치 코드입니다 : '

## MemCachier Settings 
## =================== 
def get_cache(): 
    # We do this complicated cache defenition so that on a local machine (where 
    # MEMCACHIER_SERVERS won't be defined), the try fails and so we use the 
    # inbuilt local memory cache of django. 
    try: 
    os.environ['MEMCACHE_SERVERS'] = os.environ['MEMCACHIER_SERVERS'].replace(',', ';') 
    os.environ['MEMCACHE_USERNAME'] = os.environ['MEMCACHIER_USERNAME'] 
    os.environ['MEMCACHE_PASSWORD'] = os.environ['MEMCACHIER_PASSWORD'] 
    return { 
     'default': { 
     'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', 
     'TIMEOUT': None, 
     'BINARY': True, 
     'OPTIONS': { 
      'tcp_nodelay': True, 
      'no_block': True, 
      'tcp_keepalive': True, 
      '_poll_timeout': 2000, 
      'ketama': True, 
      'connect_timeout': 2000, 
      'remove_failed': 4, 
      'retry_timeout': 2, 
      'dead_timeout': 10 
     } 
     } 
    } 
    except: 
    # Use django local development cache (for local development). 
    return { 
     'default': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache' 
     } 
    } 

CACHES = get_cache() 

이것은 또한 MEMCACHIER_SERVERS이 떨어지지 것입니다 정의되지 않은 경우와 같이 쉽게 로컬 컴퓨터에서 개발하게됩니다 django의 간단한 로컬 힙 캐시로 돌아가서 memcache를 로컬에 설치할 필요가 없습니다.

희망이 Jake!

+0

문제가 무엇인지 지적하고 get_cache 함수를 함께 사용 해줘서 고맙습니다. 유일한 문제는 Cache Machine과 같은 것입니다. "caching.backends ..."로 시작하는 사용자 정의 캐시 백엔드를 사용해야합니다. SASL을 활용하는 자체 백엔드를 정의해야하는지 궁금합니다. ? 시작하는 방법에 대한 조언이 있습니까? – Jake

+0

"생각하다"는 것은 위의 시도를했는데 실패했음을 의미합니까? 아니면 이것이 가정입니까? 캐시 시스템에 이러한 제한이있는 경우 매우 놀랍습니다. 그렇게하는 것은 의미가 없습니다. 또한 테스트에서 위의 방법으로 작업 할 캐시 컴퓨터가 있습니다. 따라서 귀하의 것이 효과가 없다면 오류를 게시하여 더 자세히 진단 할 수 있도록하십시오. –

+0

연락 주셔서 감사합니다. 내가 당신의 솔루션을 시도 할 때 (이것은 내가 SO에 게시하기 전에 먼저 시도한 것과 유사하며 지금도 다시 시도해야 함) 오류가 발생하지 않습니다. 그러나 Memcachier 대시 보드가 "현재 사용"또는 "키 수"를 표시하지 않기 때문에 작동하지 않는 것으로 생각합니다. (Elasticache/내 자신의 캐시 서버와 함께 "caching.backends.memcached.MemcachedCache"백엔드를 사용할 때 사이트 사용으로 인해 예상대로 캐시 사용량이 증가합니다.) – Jake