memcache 데몬 풀을 사용하여 세션을보다 효율적으로 공유 할 수 있습니까? 걱정합니다 (특히 누군가가 슬레이브 웹 서버에로드

우리는 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 서버 없음.



답변

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

이 질문에서 제안한 효율성 개선 아이디어는 효과가 없습니다. 내가 저지른 주요 실수는 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 이 저에게 효과적 이었습니다.

답변

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잘 작동합니다.)

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


답변

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

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

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

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


답변

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

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

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


답변

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

기음.


답변