2013-07-16 3 views
0

안녕하세요 저는 Memcache를 처음 사용했습니다. 저는 5 개의 Memcache 서버 (버전 1.22)를 사용하고 있습니다. 파이썬 memcache 라이브러리를 사용하고 있습니다. 하나의 서버를 사용할 때 모두 정상적으로 작동하지만 memc.set_servers (memcL)를 사용하면 5 개의 서버를 구성하여 일부 키는 캐시되고 다른 키는 캐시되지 않습니다. 이 이상한 행동의 원인은 무엇입니까?Python Memcache

코드 발췌 :

 itemsForCache=queries[1].execute(settings.getDBCursor_1(),queries[1].getQuery(settings.getParameters()))  
    cacheDataEntry="" 
    for CacheItems in itemsForCache: 
     cacheDataEntry+=str(CacheItems[0])+" " 

    cache_time = time.time() - start_time 
    cachingTime+=cache_time; 
    li.info(recommendation.getIdRec()+str(iterator[0])+"_"+pKey+" | "+cacheDataEntry+" | "+str(cache_time)) 
    settings.getMemCacheClient().set(recommendation.getIdRec()+str(iterator[0])+"_"+pKey,cacheDataEntry,int(settings.getConfigurationValue("memcache-data-life-time"))) 

당신의 도움에 감사드립니다.

답변

0

Memcached는 실제로 분산 서버가 아닙니다. 간단한 키 - 값 저장소입니다. 각 서버에서 실행중인 각 memcached 인스턴스는 다른 memcached 서버가 있다는 것을 모른 채 독립적으로 작동합니다. 소프트웨어가 서버에 키를 제공하고 값을받습니다. 그리고 그게 다야.

데이터 배포는 어떻게 이루어 집니까? 이 작업을 수행하는 것은 클라이언트 라이브러리입니다. Memcached 클라이언트 라이브러리 (예 : 프로그램에서 사용하는 Python Memcache 라이브러리)는 실제로 구성한 모든 서버에 데이터를 배포하는 라이브러리입니다. 데이터 분배를위한 알고리즘은 주어진 키가 항상 동일한 memcached 서버로 이동하는 것과 같습니다.

따라서 일부 키는 캐시되고 다른 키는 캐시되지 않습니다. 이는 캐시 된 키가 작동중인 memcached 서버로 이동하는 반면, 캐시되지 않은 키는 도달 할 수없는 memcached 서버로 이동 함을 의미합니다. 클라이언트 설정이 올바른지 확인하고 클라이언트에서 각 서버로 순서대로 연결해보십시오.

nc 192.168.1.18 11211 

여기서 192.168.1.18은 memcached 서버입니다.

클라이언트 구성을 변경하면 (예 : 서버 추가) 모든 키의 배포가 변경되므로 구성을 변경하기 전에 이미 캐싱 한 일부 키를 새 구성에서 검색 할 수 없을 수도 있습니다. 그 (것)들을위한 서버는 변화했다) re-cached 할 필요가있을 것이다.

+0

도움 주셔서 감사합니다. 마지막으로 문제는 캐시 된 키의 만료 시간을 30 일 이상으로 설정하고 Memcache가 만료 시간을 30 일 이상 지원하지 않는다는 것입니다. 그 상황은 Memcache의 이상한 행동을 일으켰습니다. – amartin

0

마지막으로 키 만료 시간을 0 (만료 없음)으로 설정하여이 문제를 해결했습니다. 위의 매개 변수를 2592000s (30 일)보다 큰 값으로 설정하면 Memcache가 이상한 동작을합니다. http://php.net/manual/en/memcache.set.php에서

:.. 항목의

"만료 시간이가 0의 경우, 항목은 또한 유닉스 타임 스탬프 또는 현재 시간부터 (초)을 사용할 수 있습니다 만료되지 만, 후자 않습니다 초 수가 2592000 (30 일)을 초과 할 수 없습니다. "

도움 주셔서 감사합니다.