2010-03-27 3 views
2

단일 서버를 염두에두고 작성한 PHP 프로그램이 있으므로 처리 할 수있는 고유 한 제한이 있습니다. 예를 들어, 개발자는 현재 웹 호스팅 서비스에서 "50 개의 MySQL 연결"을 제공한다고 말하면서 50 명의 사용자 만이 동시에 로그온 할 수 있다고 해석합니다.증가하는 사용자를 지원하기 위해 PHP 프로그램을로드 밸런싱 하시겠습니까?

500 이상의로드를 처리 할 수 ​​있도록 확장하려면 어떻게해야합니까? 이 프로그램을 최소한의 변경만으로 "로드 밸런서"에 어떻게 적용 할 수 있습니까?

응용 프로그램은 PHP로 작성되었으며 MySQL을 사용합니다.

+0

'로드 밸런서'에 대해 좀 더 자세히 설명해 주실 수 있습니까? –

+0

나는 PHP가 MySQL 연결을 재사용한다고 생각했다. 편집 : mysql_pconnect() [http://php.net/manual/en/function.mysql-pconnect.php]라는 명령이 있었지만 아파치가 좋은 결과를 내지 못하기 때문에 실제로 연결이 끊어지기 때문입니다. –

답변

4

호스트가 설정 한 제한 사항과 관계없이 일 때마다 은 쿼리를 현저히 제한해야합니다. 공유 호스팅을 사용 중이거나 완전히 처분 할 수있는 서버로 구성된 10 개의 랙을 소유하고있는 경우이 작업이 진행됩니다. 응용 프로그램이 메모리를 을 해제 할 수는 RDBMS가 빠른 연결 자원이 닫혀

  • 메모리를 해제 할 수 있도록

    • 빠른 데이터베이스 연결이 닫 혔을 :

      적을 쿼리는 페이지를 렌더링하는 데 필요한

    • 더 빠른 HTTP 서버 프로세스가 종료되어 메모리를 해제 할 수 있습니다.
    • 더 빨리 사용자가 찾고있는 정보를 얻습니다.

    일반적인 공유 웹 호스트는 단일 서버 사고 방식을가집니다 (참고로). 웹 서버와 동일한 컴퓨터에서 RDBMS를 실행하는 것은 확장하려는 경우 거의 좋은 아이디어가 아닙니다. 왜? 요청을 처리하고 요청 된 데이터를 반환 할 수 있으려면 둘 다 실제로 필요한 것보다 많은 양의 메모리를 할당해야합니다. 특히 유형의 선호도을 지원하는 모든 RDBMS에서 그렇습니다.

    또한 실제로 이 필요한 검색어가 반환되는 데 걸리는 시간을 살펴보십시오. 끝내면 빠를수록 리소스가 더 빨리 릴리스됩니다 (위 목록의 거의 모든 것).

    이것은 응용 프로그램이 데이터베이스에 연결하는 시간이 적을수록 연결 제한에 걸릴 가능성이 적음을 의미합니다. 50은 500 명 이상의 사용자를 지원할 수 있습니다. 쿼리를 제한하거나 쿼리를 최적화하십시오.

    앱을 잘 살펴보십시오.모든 페이지로드시 변경되지 않는 정보에 대해 캐싱을 구현할 수있는 위치는 어디입니까? 어떻게 세션을보다 잘 활용할 수 있습니까? 그 그루비 아약스 인터페이스가 모든 이벤트에 대한 쿼리를 만들고 있습니까?

    대부분의 사람들은 이미 이러한 상황이 발생하지 않도록하기 때문에 이와 같은 질문은 micro optimization 카테고리에 해당합니다. 정말 근본적인 디자인 컨셉입니다.

    크기를 조정하고 이러한 제약 조건을 해결하도록 설계하십시오. 시간과 비용이 문제를 해결할 때까지 제약 조건을 피할 수 있습니다.

    또한 모든 것을 관리하는 쪽지 인 VPS는 일반적인 리 셀러 호스팅 계정만큼 저렴합니다. 왜 자신의 샌드 박스를 만들고 자신의 규칙에 따라 플레이하지 않습니까?

    load balancing의 경우 먼저 replication 체계를 결정하십시오. 그런 다음 작업을 가장 효과적으로 배포하는 방법을 결정합니다. 어떤 경우에는 하나의 슬레이브에서 읽고 다른 호스트에 쓰기를 할 수 있으며 어떤 경우에는 하드웨어 나 소프트웨어와 같은 일종의 역방향 프록시를 사용해야합니다. 귀하의 질문은 너무 포괄적 인 대답을 제공하기에는 너무 일반적입니다.

  • +0

    "가능한 한 쿼리를 제한하십시오"라는 공리에 동의 할 수 없습니다. 이 번호 안개 그냥 어떤 의미에서, 어떤 비용으로 낮추지 않습니다. 일반적으로 "하나의 쿼리에서 완전히 다른 정보를 얻는 방법"이라는 이상한 질문을 제기합니다. 대부분의 쿼리 수는 성능이 아닌 적절한 아키텍트의 문제입니다. 성능 튜닝 **은 쿼리 수를 줄이지 않습니다 **. 그러나 * 프로파일 링 * 기반 쿼리/데이터베이스 최적화입니다. –

    +1

    @Col. Shrapnel : '가능할 때마다'라고 말하면서 나는 '감성'이 '가능하다'를 결정하는 모든 과정에 들어가 있다고 가정한다. 그러나 나는 명확성을 위해 편집 할 것입니다. –

    +0

    그럼에도 부하 분산이나 실제 성능 최적화 질문에 대답하지 않습니다. –

    0

    MySQL 연결은 열려있을 때 사용중인 것으로 계산됩니다. 예를 들어 웹 서버에 연결하여 페이지를 가져 오는 경우 페이지를 실제로 만들어서 나에게 보내려면 50ms 정도만 걸릴 것입니다 (추측). 즉, 1 개의 MySQL 연결로 1 초에 20 페이지를 처리 ​​할 수 ​​있습니다. 사용자가 브라우저로 보낸 후 페이지에서 수행하는 작업은 서버 성능에 영향을주지 않습니다.

    따라서 50을 사용하면 초당 약 1000 개의 안타가 발생해야 문제가 발생할 수 있습니다.

    문제가 발생하면 MySQL 연결을 항상 닫을 수 있습니다 (스크립트가 끝날 때 종료되지 않고).

    완벽하게 솔직히 말하면 내가 생각하는 문제는 아니라고 생각합니다. 진정으로 문제가되기에 충분한 트래픽을 얻으면 '좋은 문제'라고 할 수 있습니다.

    +0

    성능 문제가있을 때뿐만 아니라 가능한 한 빨리 모든 연결을 닫아야한다고 말하고 싶습니다. –

    관련 문제