2012-02-23 3 views
12

동료!memcached에 대한 PHP-memcache 세션 페일 오버

memcached 서버를 처리하기 위해 memcache (2.2.6) 클라이언트 라이브러리 (http://pecl.php.net/package/memcache)와 함께 5.3 (5.3.8)을 실행 중입니다.

  • 만 기본 PHP 세션 지원 (어떤 사용자 정의 핸들러)

는 내가 기대하는 것입니다 풀

  • 거의 memcached를 서버 : 내 목표는 즉 세션 엔진에 대한 장애 복구 솔루션을 가지고있다 경우에 memcached 서버 중 하나가 다운되면, php는 수영장에있는 두 번째 서버를 활용하려고합니다 [성공적으로 연결되어 행복해질 것입니다]. 그러나 수영장의 첫 번째 memcached 서버가 다운되었을 때 다음 오류가 발생합니다 :

    Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111) 
    

    관련 PHP 설정은 동안 (나는 그것이 가까운 표준 있다고 생각하면서)

    session.save_handler memcache 
    session.save_path tcp://10.0.10.111:11211?persistent=1&weight=1&timeout=1&retry_interval=10, tcp://10.0.10.110:11211?persistent=1&weight=1&timeout=1&retry_interval=10 
    

    및 memcache 설정은 다음과 같습니다

    Directive Local Value 
    memcache.allow_failover 1 
    memcache.chunk_size 8192 
    memcache.default_port 11211 
    memcache.default_timeout_ms 1000 
    memcache.hash_function crc32 
    memcache.hash_strategy standard 
    memcache.max_failover_attempts 20 
    

    Memcached가 여전히 두 번째 서버에서 실행에서 완벽하게 접근 웹 서버 :

    telnet 10.0.10.110 11211 
    Trying 10.0.10.110... 
    Connected to 10.0.10.110 (10.0.10.110). 
    Escape character is '^]'. 
    get aaa 
    END 
    quit 
    Connection closed by foreign host. 
    

    다른 말로하면, f 나열된 서버가 대기열의 첫 번째 서버에 성공적으로 연결하지 못하면 순차적으로 충돌합니다. 마침내 나는 3.0.x 클라이언트 라이브러리를 사용할 수 있다는 것을 알았지 만 아직 베타 버전만큼 나에게는 너무 안정적이지 않습니다.

    표준 PHP, 클라이언트 lib 및 서버에서 원하는 동작을 얻으려면 어떻게 조언하십시오.

    고맙습니다.

    최저

    , 유진

  • +0

    session.save_path 지시문에서 여러 개의 (쉼표로 구분 된) 값을 사용할 수 있습니까? 나는 php docs를 perusing 어떤 실제 예제를 보지 못했어요. –

    +1

    @Mike http://php.net/manual/en/memcached.sessions.php : '세션 서버 풀에 사용할 호스트 이름 : 포트 항목을 쉼표로 구분하여 정의합니다 (예 : "sess1 : 11211, sess2"). : 11211 "." – Eugene

    +0

    링크를 보내 주셔서 감사합니다. 해당 페이지를 보지 못했습니다. 최소한 memcached 아래 묻혀있는 세션 문서에서 참조해야합니다. OP에서 오류 상태에 대해 언급합니다. 'Server 10.0.10.111 (tcp 11211) failed', 그리고 10.0.10.110으로 telnet 할 수 있다는 예를 들었을 때, 실제로 10.0.10.111로 telnet 할 수 있는지 확인할 수 있습니까? –

    답변

    7
    나는이 질문에 참여한 모든 사람에게 감사의 말씀을

    , 대답은 다음과 같다 : 현실에서 Memcache에 을 지원하는 세션 핸들러로 (D을에서 Memcache되지 않음) 쉼표로 구분 된 서버는 session.save_path으로, 또한 장애 조치를 지원합니다. 위에 언급 된 오류 Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111)에는 8 번째 (알림) 수준 만있었습니다.실제로 엔진은 서버 중 하나를 사용할 수 없다는 사실을 알려주고 (논리적이고 그렇지 않으면 어떻게 알 수 있습니까?) 두 번째 서버에 성공적으로 연결하여 사용합니다.

    모든 오해는 내 사용자 정의 오류 처리기의 약한 설명서, memcache/memcached confusions 및 편집증 (E_ALL) 설정으로 인해 발생했습니다. 한편이 문제는 상황

    +0

    Ic를 참조하십시오. 서버가 실제로 작동 중지 되었기 때문에 메시지가 생성되었지만 다른 서버가 작동 중이기 때문에 세션 처리가 예상대로 작동 했습니까? –

    +0

    @ 마이크, 예, 정확히 – Eugene

    +0

    롤, 거짓말하지 않을 거예요. 그리고 명확히하기 위해, 이것은 연결 풀링이 아니며 중복성입니다. –

    7

    사용 Memcached가 확장. PHP에는 memcache 플러그인이 두 개 있습니다. 하나는 Memcache라고하고 다른 하나는 Memcached라고합니다. 예, 혼란 스럽지만 어쨌든 사실입니다.

    Memcached 플러그인은 프로토콜 식별자 (tcp)와 매개 변수 (지속성 등)를 사용하여 복잡한 URL을 지원하며 Memcached 플러그인은 연결 풀을 지원합니다.

    위의 주석 (http://www.php.net/manual/en/memcached.sessions.php)에서 언급 한 설명서는 Memcached가 아니라 Memcached 확장에 대한 것입니다.

    업데이트 : 일부 흥미로운 읽기 : https://serverfault.com/questions/164350/can-a-pool-of-memcache-daemons-be-used-to-share-sessions-more-efficiently

    +0

    워드 프로세서를 살펴볼 때이 점도 눈치 챘지만, 워드 프로세서에 따르면 그의 구현도 잘 작동 할 것입니다. –

    +0

    글쎄, 나는 문서에서 memcache 플러그인을 위해 연결 풀을 사용할 수 없다. 실제로 memcache 세션 핸들러에 대한 많은 문서가 없습니다. –

    +0

    다음 문서를 확인하십시오 : http://php.net/manual/en/memcached.sessions.php, PHP 공식 및 아래 주석에 따르면, 작동합니다. –

    0

    당신은 해시를 만들 때

    memcache.hash_strategy consistent 
    

    에 설정을 변경

    해시 전략을 변경해야합니다을 수립 세션에서 Connection refused (111) 에러에 관련된주의 사항을 무시함으로써 해결되었습니다 전략 일관성 memcache는 여러 서버에 데이터를 복사합니다. 서버 중 하나가 작동 중지되면 다음 요청시 서버를 복사하려고 시도합니다.

    관련 문제