memcache 데몬 풀을 사용하여 세션을보다 효율적으로 공유 할 수 있습니까?


25

우리는 1 개의 웹 서버 설정에서 2 개의 웹 서버 설정으로 이동하고 있으며 두로드 밸런싱 된 컴퓨터 사이에서 PHP 세션 공유를 시작해야합니다. 우리는 이미 memcached를 설치 하고 시작 했으므로 php.ini파일 에서 세 줄만 변경 하면 ( session.save_handlersession.save_path ) 새 서버간에 세션을 공유 할 수 있다는 것을 기쁘게 생각했습니다 .

나는 교체했다 :

session.save_handler = files

와:

session.save_handler = memcache

그런 다음 마스터 웹 서버 session.save_path에서 localhost를 가리 키도록 설정했습니다 .

session.save_path="tcp://localhost:11211"

슬레이브 웹 서버 session.save_path에서 마스터를 가리 키도록 설정했습니다 .

session.save_path="tcp://192.168.0.1:11211"

작업이 완료되었으며 테스트했으며 작동합니다. 그러나...

분명히 memcache를 사용하면 세션이 RAM에 있고 컴퓨터가 재부팅되거나 memcache 데몬이 충돌하면 손실됩니다-약간 걱정하지만 두 웹 서버 간의 네트워크 트래픽에 대해 조금 더 걱정합니다 (특히 누군가가 슬레이브 웹 서버에로드 밸런싱 될 때마다 세션이 마스터 웹 서버에서 네트워크를 통해 가져 오기 때문에 확장됩니다. save_paths네트워크를 사용하기 전에 머신이 자체 세션 스토리지를 볼 수 있도록 두 개를 정의 할 수 있는지 궁금 합니다. 예를 들면 다음과 같습니다.

석사:

session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"

노예:

session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"

이것이 서버간에 세션을 성공적으로 공유하고 성능을 향상 시킵니까? 즉, 네트워크 트래픽을 50 % 절약합니다. 아니면이 기술이 장애 조치 (예 : 하나의 memcache 데몬에 도달 할 수없는 경우)에만 적용됩니까?

참고 : 실제로 memcache 복제에 대해 구체적으로 묻지는 않습니다 .PHP memcache 클라이언트가 풀의 각 memcache 데몬 내에서 최대가 될 수 있는지 여부에 대한 자세한 내용은 세션을 찾으면 세션을 반환하고 세션을 찾지 못하면 새 세션을 만듭니다 모든 상점에서. 내가 이것을 쓰는 동안 나는 PHP에서 약간을 요구하고 있다고 생각한다.

가정 : 고정 세션, 라운드 로빈로드 밸런싱, LAMP 서버 없음.


1
Memcache 문서는 세션 저장에 Memcache를 사용하지 않는 것이 좋습니다. code.google.com/p/memcached/wiki/…를 참조하십시오 !

답변:


37

면책 조항 : - 당신은 테스트 누군가 자격을 갖춘에서 두번째 의견을 얻기의 톤하지 않고 나에게 듣고 미친거야 내가이 게임에 새로 온 사람을 .

이 질문에서 제안한 효율성 개선 아이디어는 효과가 없습니다. 내가 저지른 주요 실수는 memcached 상점이 풀에 정의 된 순서가 어떤 종류의 우선 순위를 지시한다고 생각하는 것이 었습니다. 그렇지 않습니다 . memached 데몬 풀 (예 :)을 정의하면 session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"어떤 저장소가 사용 될지 알 수 없습니다. 데이터가 균등하게 분배되므로 항목이 첫 번째에 저장되거나 마지막에 저장 될 수 있습니다 (또는 memcache 클라이언트가 복제하도록 구성된 경우 둘 다 가능함-복제를 처리하는 클라이언트 인 경우 memcached 서버는 수행함) 자체적으로 수행하지 마십시오). 어느 쪽이든 풀에서 첫 번째 로컬 호스트를 사용한다고해서 성능이 향상되지는 않을 것입니다. 두 상점을 모두 칠 확률은 50 %입니다.

약간의 테스트와 연구를 한 결과, memcache를 사용하여 서버간에 세션을 공유 할 수 있다고 결론지었습니다.하지만 원치 않는 것 같습니다. 그것의 데이터베이스는 강력하지 않습니다. 이에 대한 의견을 보내 주시면 더 많은 정보를 얻을 수 있습니다.

PHP 앱이 없으면 다음을 무시하십시오.


팁 1 : memcache를 사용하여 두 서버에서 세션을 공유하려는 경우 :

PHP memcache 클라이언트를 설치하고 파일에 다음을 추가 할 때 " memcache 세션 핸들러 지원을 사용 하시겠습니까? " 에 라고 응답했는지 확인하십시오 ./etc/php.d/memcache.ini

session.save_handler = memcache

웹 서버 1에서 (IP : 192.168.0.1) :

session.save_path="tcp://192.168.0.1:11211"

웹 서버 2 (IP : 192.168.0.2)에서 :

session.save_path="tcp://192.168.0.1:11211"

팁 2 : memcache를 사용하여 두 서버에서 세션을 공유하고 페일 오버를 지원하려는 경우 :

/etc/php.d/memcache.ini파일에 다음을 추가 하십시오.

memcache.hash_strategy = consistent
memcache.allow_failover = 1

웹 서버 1에서 (IP : 192.168.0.1) :

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

웹 서버 2 (IP : 192.168.0.2)에서 :

session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"

노트:

  • 이것은 원래 질문에서 한 다른 실수를 강조 session.save_path합니다. 모든 서버 에서 동일한 것을 사용하지 않았습니다 .
  • 이 경우 "failover"는 하나의 memcache 데몬이 실패하면 PHP memcache 클라이언트가 다른 하나를 사용하기 시작 함을 의미합니다. 즉, 실패한 상점에서 세션을 가진 사람은 모두 로그 아웃됩니다. 투명한 장애 조치가 아닙니다.

팁 3 : memcache를 사용하여 세션을 공유하고 투명한 장애 조치 지원을 원하는 경우 :

/etc/php.d/memcache.ini파일에 다음을 추가해야한다는 점을 제외하면 팁 2와 동일 합니다.

memcache.session_redundancy=2

노트:

  • 이것은 PHP memcache 클라이언트가 세션을 2 대의 서버에 쓰게합니다. 쓰기가 n 개의 미러로 전송되고 미러에서 실패 get's가 재 시도 되도록 RAID-1과 같은 중복성을 얻습니다 . 이는 하나의 memcache 데몬 실패시 사용자가 세션을 느슨하게하지 않음을 의미합니다.
  • 미러링 된 쓰기는 비 블로킹 IO를 사용하여 병렬로 수행되므로 미러 수가 증가함에 따라 속도 성능이 크게 저하되지 않아야합니다. 그러나 memcache 미러가 다른 시스템에 분산 된 경우 네트워크 트래픽이 증가합니다. 예를 들어 로컬 호스트를 사용하고 네트워크 액세스를 피할 확률이 더 이상 50 % 없습니다.
    • 쓰기 복제 지연으로 인해 캐시 누락 대신 오래된 데이터가 검색 될 수 있습니다. 문제는 이것이 응용 프로그램에 중요한지 여부입니다. 얼마나 자주 세션 데이터를 작성합니까?
  • memcache.session_redundancy세션 중복성을위한 것이지만 memcache.redundancy, 다른 수준의 중복성을 원한다면 PHP 응용 프로그램 코드에서 사용할 수 있는 ini 옵션도 있습니다.
  • PHP memcache 클라이언트 의 최신 버전 (현재 베타 버전)이 필요합니다 -pecl의 버전 3.0.3 이 저에게 효과적 이었습니다.

"공유 데이터베이스를 사용하는 것뿐만 아니라 확장되지도 않는다"고 언급 할 수 있습니까? 일반적인 마스터-슬레이브 DB 설정과 어떻게 다른지 알 수 없습니다. 감사!
Boy Baukema

이것은 ext/memcache버전 3.x 를 사용할 때 예상대로 작동하지 않는다는 소문 (일명 버그 보고서)이 있지만 꽤 멋진 분류입니다 . 우리는 그 옵션도 가지고 놀고 있으며 서버 목록을 반복하여 직접 작성하기로 결정했습니다.
까지

팁 3의 경우 : 하나의 memcached 호스트가 다운 된 후 작동하면 호스트가 다운되는 시간 (초)은 어떻게됩니까? 내가 이해하는 것처럼-세션 데이터가 복원되지 않고 일부 세션이 손실됩니다.
GioMac

28

Re : 위의 팁 3 (Google을 통해이 문제를 겪고있는 다른 사람들을 위해) 적어도 현재는이 작업을 수행하려면 memcache.session_redundancy = N+1풀의 N 서버에 사용해야 하며 최소한 최소 임계 값 인 것 같습니다 작동하는 가치. (PECL memcache에 3.0.6 두 memcached를 서버. 데비안 안정에 PHP 5.3.3로 테스트 session_redundancy=2최대한 빨리이의 첫 번째 서버를 끈으로 실패 save_path, session_redundancy=3잘 작동합니다.)

이것은 다음 버그 보고서에서 캡처 된 것 같습니다.


1
당신을 충분히 표명 할 수 없습니다 ..
fest

1
아래로 스크롤해서 다행입니다. 이것이 문제였습니다.
Daren Schwenke

이 기능은 PECL memcache 3.x 시리즈에서만 사용할 수 있습니까? 이 모든 것은 pecl.php.net/package/memcache의 베타 소프트웨어에 나와있는 반면 2.2.7에서 리더가 보이는 서버를 죽이면 모든 것이 죽습니다.
Joe

솔직히 말해서 내가 이것을 본 지 몇 년이 지났습니다. 내가 기억하는 것처럼 그것은 3.x 기능 (icbw)이었습니다. 우리는 해당 플러그인의 "베타"버전을 사용하여 많은 시스템을 배포했으며 (일부는 상당히 트래픽이 많음) 이와 관련된 문제는 없었습니다. YMMV, 생방송하기 전에 테스트하기 등 : :) 몇 년 동안 PHP에서 일한 적이 없어서 사소한 세부 사항이 사라지기 시작했습니다.
Michael Jackson

3

위에 표시된 php.ini 설정과 함께 다음 사항도 설정하십시오 :

memcache.allow_failover = 1  
memcache.hash_strategy = 'consistent'

그런 다음 완전한 장애 조치 및 클라이언트 측 중복성을 얻게됩니다. 이 접근법의주의 사항은 memcached가 localhost에서 다운되면 php memcache 클라이언트가 session에 지정된 풀의 다음 서버를 시도하기 전에 항상 읽기 누락이 발생한다는 것입니다.

이는 웹 서버에서 실행되는 php memcache 클라이언트의 전역 설정에 영향을 미칩니다.


consistent해시 전략을 사용하는 session.save_path것이 웹 서버마다 다르다는 것을 고려하면 의미 가 있습니까?
Tom

1

memcached는 그런 식으로 작동하지 않습니다 (잘못되면 수정하십시오!)

애플리케이션이 중복 세션 스토리지를 갖도록하려면 두 memcached 인스턴스에 대한 항목을 변경 / 추가 / 삭제하는 항목을 작성해야합니다. memcached는 이것을 처리하지 않으며, 제공하는 유일한 것은 키 해시 저장소입니다. 따라서 복제, 동기화, 아무것도 없습니다.

나는이 문제에 틀리지 않기를 희망하지만 이것이 내가 만진 지 몇 년이 지난 지금 내가 memcached에 대해 알고있는 것입니다.


네가 틀렸다면 나에게 편리 할 것이다. :-) phpslacker.com ( phpslacker.com/2009/03/02/php-session-clustering-with-memcache )에는 memcached가 질문에 설명 된대로 작동 할 수 있음을 제안 하는 기사가 있습니다. 아마도 memcache 클라이언트가 해싱 전략을 구현하는 방법에 달려 있습니까?
Tom

1
memcache는 그렇게 작동하지 않지만 php가 원하는 방식으로 작동하는 것 같습니다. 설명대로 php.ini를 변경하거나 앱을 변경해야합니다. 블로그에서 : 당신이 묻는 클러스터링은 어디에 있습니까? 지금까지 가지고있는 것은 2 개의 서버로 구성된 memcache 풀입니다. PHP는 풀에 쓰도록 구성되어 있습니다. PHP는 "session.save_path"ini 지시문에 지정된 순서대로 서버 풀을 읽고 씁니다. 읽기를 위해 PHP는 풀에서 키로 캐시 객체를 요청합니다. "failover"가 활성화 되었기 때문에 PHP는 [...]까지
멤 캐시

1

memcached는 기본적으로 복제되지 않지만 repcached (패치 된 memcached)는 복제합니다 . 그러나 이미 mysql을 사용하고 있다면 마스터-마스터 복제와 함께 복제 기능을 사용하고 전체 데이터 복제의 이점을 누리십시오.

기음.


정보에 대해서 감사드립니다. 내가 뒤 따르는 것은 실제로 복제가 아닙니다. 세션이 발견 될 때까지 차례로 각 memcached를 피크로 만들고 싶어하는 경우가 더 많습니다. 즉, 가장 빠른 로컬 호스트를 먼저 확인한 다음 다른 서버를 확인하십시오.
Tom

1
모든 신들의 이름으로 WHY ???? 이것은 내가 생각할 수있는 모든 문제에 대한 완전히 잘못된 해결책입니다. 서버를 2 대만 추가해도 매우 비효율적 일뿐만 아니라 더 많은 서버를 추가하면 성능이 매우 빠르게 저하됩니다. 그리고 실제로 서버를 클러스터에 추가 할 때 중단 가능성을 줄여야 할 때 솔루션이 단일 서버에서와 같이 중단 가능성을 두 배로 증가 시킨다는 사실을 고려하지 않습니다. (BTW 만약 당신이 DNS 기반 라운드 로빈을 의미한다면 세션 친화 성은 암시 적입니다!)
symcbean

의견을 보내 주셔서 감사합니다. 예, 자유롭게 세션 공유에 멍청한 놈임을 인정합니다! :-) 그러나 나는 여전히 내 제안이 왜 그렇게 추한지 이해하지 못했습니다. 공유 DB를 사용하는 것보다 더 효율적이라고 생각했고 중단 가능성도 줄었다 고 생각했습니다.
Tom

아니요, 더 가능성이 높습니다. 이와 같이 데이터를 연합하는 것은 복제 량을 줄이기 때문에 매우 많은 수의 노드가있을 때 의미가 있지만 일반적으로 가용성을 유지하기 위해 정의 된 수의 풀로 복제를 수행 할 수 있습니다. repcached 복제와 mysqld 복제의 차이점을 확인하려면 성능에 대해 매우 까다로워 야합니다.
symcbean

allow_failover = 1을 사용하는 한 여러 미러로 인해 LESS가 중단 될 가능성이 높은 것으로 테스트하고 확인했습니다. 하나의 미러를 종료했다가 다시 시작한 후 다른 미러를 종료했다가 다시 시작한 후 첫 번째로 다시 종료 할 수 있습니다. PHP memcache 클라이언트가 뒤에서 많은 속임수를하고 있다고 생각합니다.
Tom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.