it-gundan.com

다중 서버 / 클러스터 환경에서 알아야 할 잠재적 문제는 무엇입니까?

나는 한동안 클라이언트와 웹 사이트를 작업하고 있으며 사이트 자체가 크게 인기를 얻고 있습니다. 현재 우리는 사이트를 호스팅하는 단일 머신이 요청을 유지하기 위해 고군분투하고 있으며 가능한 한 (캐싱 등) 사이트 자체를 최적화했습니다.

이제 우리는 웹 서버 또는 클러스터 호스팅으로 이동할 때 사이트에 대해 알고 있거나 테스트해야 할 잠재적 함정과주의 사항에 대한 질문에 이르게하기 위해 다른 서버를 추가해야하는 단계에 있습니다. 환경?

3
Wolfwyrd

몇 가지주의 사항이 있습니다.

세션

세션이 서버 측에 저장된 경우 (예 : PHP), both 서버는 공유 세션 스토리지 경로에 액세스해야합니다. 그렇지 않으면로드 밸런서가 한 서버에서 다른 서버로 요청을 보내거나 한 사용자에게 두 개의 고유 한 세션이 있으면 세션이 손실됩니다. 이것은 AJAX에 특히 실망 스러울 수 있습니다. 로드 밸런서에 따라 'Sticky'세션도 가능할 수 있습니다.

임시 파일

실제로 요청을 처리하기 위해 어떤 종류의 임시 파일을 사용하는 경우 두 서버는 동일한/tmp 디렉토리를 공유해야합니다. 이것은 다운로드를 위해 압축 된 임시 아카이브, 무엇이든 추적하는 플랫 파일 DB 일 수 있습니다.

SQLite 잠금

SQLite3를 사용하는 경우, 특히 NFS와 같은 것을 사용하여 서버간에 데이터베이스 파일을 공유하는 경우 이전에는 없었던 단점이있을 수 있습니다. NFS는 이것으로 느리므로 다른 것을 사용하는 것이 좋습니다. Luster와 같은 분산 파일 시스템은 쉽게 설정하거나 GFS/OCFS2를 사용할 수 있습니다.

SSL

로드 밸런서는 SSL 핸드 셰이크를 처리하는 것으로, 이전의 자체 서명 된 인증서를 사용하여 백엔드 서버에 요청합니다.

몇 가지 일반적인 참고 사항 :

  • 언급 한대로 고성능 파일 시스템을 사용하여 디렉토리를 공유하십시오. 모든 공유 파일은 웹 서버 중 하나가 아닌 네트워크 저장소에 있어야합니다. 그렇지 않으면, 하나가 쓰러지면 둘 다 쓸모없고, 목적을 무너 뜨립니다.

  • 사이트가 RDBMS를 사용하는 경우 두 가지 옵션이 있습니다. 두 노드 모두에서 실행하고 마스터-마스터 동기화를 사용하거나 DB 서버를 자체 홈에 배치하십시오. 두 번째는 웹 서버에 더 많은 팔꿈치 공간을 제공하기 때문에 권장합니다.

  • 로드 밸런서에도 중복성이 필요합니다.

대부분의 경우 실제 사이트/애플리케이션 자체를 거의 또는 전혀 변경하지 않고 단일 서버에서로드 밸런스 팜으로 이동할 수 있지만 모든 노드가 동일한 파일을 읽고 쓸 수 있는지 확인해야합니다. 앱 자체를 잠그기위한 로직을 추가해야 할 수도 있습니다.

1
Tim Post

세션 상태 (문제인 경우)는 잠재적 인 문제입니다. 대부분의로드 밸런싱 어플라이언스는 고정 세션을 사용할 수 있습니다. 즉, SERVER1로 시작하는 사용자는 일반적으로 브라우저 메모리에 저장된 쿠키를 사용하여 SERVER1에 남아 있습니다. 이것에 대한 유일한 경고는 어떤 이유로 SERVER1이 오프라인 상태가되면 해당 사용자가 다른 서버에 다시 로그인해야한다는 것입니다.

서버 팜에서 세션을 공유하여 내 앱 (CF 앱)에서이를 무시하기 시작했습니다. 따라서 하나의 시스템이 중단되면 사용자 경험에 영향을 미치지 않습니다.

팜의 모든 서버에 콘텐츠를 올바르게 복제 할 때 직면 한 유일한 문제는 다음과 같습니다. 이 작업을 수행하는 소프트웨어가 있습니다 (로보 카피, NCH 소프트웨어의 Fling은 두 가지 사용했습니다). 그러나 여전히 동기화가 100 % 작동하지 않는 인스턴스가 있습니다.

0
Milner

응용 프로그램이 상태에 관심이 있습니까? 사용자에게 한 시스템에서 하나의 요청을 제공 한 다음 다른 시스템에서 다른 요청을 제공하는 경우 중요합니까? 요청간에 어떤 형태의 상태를 유지해야하는 경우 모든 것이 더 복잡해지며 문제를 처리하는 다양한 방법이 있습니다.

상태에 대해 걱정할 필요가 없다면 사이트를 구축하는 것이 좋으며 proxy 및 몇 개의 백엔드 서버를 사용하면 비교적 괜찮을 것입니다.

상태를 유지해야하는 경우 동일한 백엔드 서버가 단일 사용자의 모든 요청을 처리 할 수 ​​있도록 프록시를 통해 고정 세션을 작성하는 다양한 방법이 있지만 해당 세션을 고정 상태로 유지하기 어렵게 만드는 많은 방법이 있습니다. .

백엔드의 공용 매체에 상태를 유지할 수도 있으므로 각 서버는 동일한 사용자에 대해 동일한 상태를로드합니다. 데이터베이스 (너무 느릴 수도 있음) 또는 memcached 와 같은 방법으로이 작업을 수행 할 수 있습니다.

데이터베이스 서버 수도 확장하고 있습니까? 그것은 걱정해야 할 또 다른 문제들을 가져올 것입니다.

일부 세션 문제는 Stack Overflow Podcast에서 논의됩니다 Number 6

테스트를 위해 유사한 테스트 클러스터를 강하게 쳐서 동일한 클라이언트에서 다른 백엔드로의 많은 요청이 문제가 될 수 있으므로 많은 서버에서 요청이 전달 될 때 요청이 수행되는 방식을 확인할 수 있습니다. 테스트 계획에서 무언가가 발생합니다.

Stack Overflow의 network config

0
danivovich