2012-06-26 4 views
0

나는 이것을 잠시 동안 연구했지만 설득력있는 대답을 얻지 못했다.mysql은 어떻게 실제 연결에서 대규모 연결을 처리합니까?

mysql 튜토리얼에서 기본 연결 수는 200 개 미만이며 충분한 리소스가있는 한 Linux 상자에서 max_connection_num을 2000으로 설정할 수 있습니다. 수백만 명의 사람들이 귀하의 웹 사이트를 동시에 방문하기 때문에 실제 배포에서는이 수치가 충분하지 않다고 생각합니다.

각 쿼리에서 시간 비용을 줄이기 위해 최적화하는 방법에 대해 설명하는 몇 가지 기사가 있습니다. 그러나 그들 중 누구도이 문제가 어떻게 뿌리 내렸는지를 나에게 알려주지 못합니다. 거대한 연결이 동시에 일어나지 않도록 대기열과 같은 메커니즘이 있어야한다고 생각합니다. 그렇지 않으면 마침내 "너무 연결"예외가 발생합니다.

누구나이 분야에 대한 전문 지식이 있습니까? 고맙습니다.

+0

clustering을 통해 균형

  • 로드 http://en.wikipedia.org/wiki/MySQL_Cluster – Kaii

  • +0

    귀하의 질문에 짧은 대답은 데이터베이스에 연결을 관리 할 수있는 "연결 풀"입니다 . http://dev.mysql.com/tech-resources/articles/connection_pooling_with_connectorj.html 다른 많은 구현 인 DBCP, C3PO 등. 큰 문제는 데이터베이스 연결을 반복적으로 생성하고 삭제하는 연결 변경의 높은 비용입니다. – spencer7593

    답변

    2

    몇 가지 옵션이 있습니다.

    1. Connection pooling
    2. 당신은 했나요 같이 대기합니다. 너무 많은 클라이언트가 동시에 연결되면 응용 프로그램 계층에서이 예외를 처리하고 짧은 시간 동안 요청을 잠자기 한 다음 다시 시도해야합니다. 이러한 트래픽이 많은 환경에서 2 초 이상 지속되는 요청은 일반적으로 금지되어야합니다. replication 및/또는
    +0

    emm, Spring에서 Hibernate JPA를 사용하고 있는데, "너무 연결"예외에 놀랐습니다. 내 가정은 JPA 구현이 내부적으로 연결 풀을 사용해야한다는 것입니다. 따라서 풀을 사용할 수있는 연결이 없을 때 어떤 일이 발생합니까? 내 기억에, 나는 아파치 연결 풀과 함께 JDBC를 가지고 놀곤 했었지만, 여전히 연결을 얻을 수 없다는 일부 예외가있다. 그렇다면 작동하지 않습니다. 이상적으로는 이러한 요청을 큐에 저장하고 연결이 해제 될 때마다이를 제공해야합니다. 일부 스레드 풀 –

    +0

    의 동작과 오랜 시간 쿼리의 경우와 같이 쿼리에 소요되는 시간을 예상 할 수있는 방법이 없습니다. –

    +0

    JPA 또는 Hibernate 또는 Spring에서 연결을 처리하는 방법에 대해 전혀 모릅니다. 죄송합니다. MySQL은 TCP 수준에서 대기열 형태를 제공하지만 너무 많이 의존하지는 않습니다. 라이브러리는 이러한 메커니즘을 구현할 수도 있고 구현하지 않을 수도 있습니다. 이러한 특정 프레임 워크가 풀링 또는 큐잉을 처리하는 방법에 대한 또 다른 질문을 게시 할 수 있습니다. 질의 실행 시간은 네 라이브러리에서 생성 된 실제 SQL 코드를보고 추정 할 수 있습니다. MySQL의 느린 쿼리 로그로 실제 실행 시간을 모니터링 할 수도 있습니다 (단, 실행 한 후에 만 ​​가능). – RandomSeed

    0

    일반적으로 응용 프로그램은 이미 설정된 연결을 다시 사용해야합니다. 그러나 응용 프로그램을 구현하기 위해 선택한 언어에는 제한이 있습니다. Java 또는 .Net을 사용하는 경우 연결 풀을 가질 수 있습니다. PHP의 경우 해당되지 않습니다. this discussion

    +0

    나는 링크 된 토론에 분명히 동의하지 않습니다. PHP 퍼시 스턴트 연결은 연결 풀에서 예상되는 대부분의 것을 허용합니다 (즉, 여러 프로세스에 걸쳐 연결 재사용). – RandomSeed

    +1

    @YaK 공식 문서 "메모에 따르면 이러한 종류의 링크는 PHP 버전의 모듈을 사용하는 경우에만 작동합니다." PHP를 모듈로 사용하는 경우에도 PHP에서 10 개의 다른 연결로 10 개의 동시 트랜잭션을 시작할 수 있습니까? – Andy

    +0

    가능합니다. 방금 mysql_pconnect()로 테스트했다. 이 질문을 제기 해 주셔서 감사 드리며 실제로 확인한 적이 없습니다. – RandomSeed

    0

    max_connection_num을 초과하면 너무 많은 연결 오류가 발생합니다. 하지만 실제로 웹 서버에 100 만 명의 사용자가있는 경우 정확히 한 대의 서버에서 처리 할 수 ​​없으며 1 백만 명의 동시 연결에서 실제 처리 할 수있는 대규모 팜이 필요합니다.

    그러나 웹 클라이언트는 일반적으로 connection pool이라는 추상화를 통해 데이터베이스에 연결합니다.이 데이터베이스는 모든 데이터베이스 연결이 진행되는 동안 클라이언트 측 데이터베이스에 대한 연결 수를 제한합니다 그 같은 풀을 통해서.

    관련 문제