2014-09-07 2 views
2

내가 일하고있는 웹 스타트 업은 평범한 날의 5000 명에서 주말의 10,000 명까지의 동시 웹 사용자 수가 급증했다. 이번 토요일 트래픽이 너무 높아서 간헐적으로 "너무 많은 연결"오류가 발생하기 시작했습니다. CTO는 데이터베이스 서버에서 max_connections 값을 단순히 늘림으로써이를 수정했습니다. 하나의 영구 연결을 사용하는 것이 더 나은 해결책인지 알고 싶습니다. 사용하는 대신mysql에 "너무 많은 연결"문제를 어떻게 처리해야합니까?

즉 :

$db = new mysqli('db_server_ip', 'db_user', 'db_user_pass', 'db_name'); 

우리는 사용 : 우리는 이미 여러 MySQL의 서버 및뿐만 아니라 다수의 웹 서버 (아파치 + mod_php이)를 사용하는

$db = new mysqli('p:db_server_ip', 'db_user', 'db_user_pass', 'db_name'); 

.

+0

연결을 닫습니다. 나는 동시 사용자가 너무 많아서 문제가 있다고 이야기하고 있습니다. – iamlegend

+1

그 모든 연결이 필요합니까? 예를 들어 서버의 부하를 줄일 수 있습니까? HTML 또는 조각 캐싱을 사용하여? – halfer

+0

아마도 MySQL 서버 및/또는 쿼리를 조정해야합니까? 또한 1 일당 10K 연결은 많지 않습니다. 8 초마다 약 1 회입니다. 웹 서버의 초당 요청 수/초는 얼마입니까? (함께 모여 있다고 가정) – halfer

답변

1

여러 웹 요청에서 데이터베이스 연결을 공유해야합니다. 자책골을 MySQL의 연결을 얻어야한다 응용 프로그램 서버에서 실행중인 모든 프로세스, 즉에 나오는 모든 웹 요청을 한 프로세스가 실행되는 개방 유지 및 재사용

+0

이 조언에는 몇 가지 위험 요소가 있습니다.응용 프로그램이 옵션을 설정하거나 트랜잭션을 수행하는 경우 MySQL에 새로운 프로세스가 다르지 않다는 것을 기억해야합니다. 필요한 경우 영구 연결을 사용하고 그렇지 않은 경우 영구 연결을 사용하십시오. – Brad

+0

내 접근 방식은 데이터베이스 연결을 다시 사용할 수있는 방식으로 코드를 작성하는 것입니다. 일부 서비스 클래스에서 데이터베이스 액세스를 캡슐화하는 지속성 계층을 작성하십시오. 이렇게하면 데이터베이스를 쉽게 변경할 수 있습니다. – Malte

+0

영구 연결은 응용 프로그램을 모듈 방식으로 구조화하는 것과 아무런 관련이 없습니다. 그러나 어떤 경우에는 가능한 경우 영구 연결을 사용하십시오. 나는 프로세스마다 별도의 연결을 갖는 것과 정확히 똑같지는 않다는 것을 지적하고 있습니다. – Brad

1

PHP Docs에서 :.

SQL 서버에 대한 링크를 만드는 오버 헤드가 높은 경우 영구 연결을 사용하는 것이 좋습니다.

그리고

단,이 방법은 영구적 인 연결에 의해 초과 연결 제한 데이터베이스를 사용하는 경우 문제가 될 수있다. 데이터베이스에 동시 연결 수가 16 개로 제한되어 있고 사용량이 많은 서버 세션 중에 17 개의 하위 스레드가 연결을 시도하면 하나는 연결할 수 없습니다.

영구 연결을 사용하면 문제가 해결되지 않습니다. 문제는 버스트 사용량이 데이터베이스 구성 및 잠재적으로 인프라에서 설정된 제한을 초과한다는 것입니다. 연결 한계를 높이는 CTO가 한 일은 좋은 첫 걸음입니다. 이제 데이터베이스 서버에서 리소스 사용률을 모니터링하여 추가 연결에서 증가 된로드를 처리 할 수 ​​있어야합니다. 가능하면 괜찮아. 리소스가 부족한 데이터베이스 서버를보기 시작하면 트래픽의 버스트를 처리 할 추가 서버를 설정해야합니다.

+0

언제/내 PHP 응용 프로그램에서 영구적 인 자식 연결을 생성합니까? 얼마나 많은 동시 사용자가 있더라도 모든 쿼리를 보내기 위해 항상 MySQL 서버와의 지속적인 연결을 유지한다고 믿었습니다. [내가 주어진 PHP 스크립트의 맨 위에 다음 줄을 포함한다고 가정하면 : $ db = new mysqli ('p : db_server_ip', 'db_user', 'db_user_pass', 'db_name');] – iamlegend

+0

각 스레드는 자체 연결이므로 서버 당 하나의 연결이 아니며 스레드 당 하나의 연결입니다. 각각 10 개의 스레드가있는 10 개의 서버가 있다면 총 100 개의 연결이 필요합니다. 영구 연결은 연결에 대한 설정 및 해체를 저장합니다. 사용 가치는 있지만 사용할 수있는 연결이 충분하지 않은 서버의 문제는 해결되지 않습니다. – hukir

1

너무 많은 연결

원인 이 오류가

  • 동시 연결을 많이, 또는 오래된 연결하여
  • 에 의해 발생되고 곧
을 발표하지

이미 SHOW VARIABLES LIKE "max_connections";을 입력하고 값을 높이십시오.

영구 연결하면 영구적으로 사용하는 경우

또는 persistent database connections, 당신은 항상 계정에 MySQL의 지시 wait_timeout을해야합니다. 닫기가 작동하지 않지만 시간 초과를 줄일 수 있습니다. 따라서 사용 된 리소스가 다시 사용 가능해질 것입니다. netstat을 활용하여 여기에 설명 된대로 정확히 무슨 일이 일어나는지 확인하십시오 https://serverfault.com/questions/355750/mysql-lowering-wait-timeout-value-to-lower-number-of-open-connections.

DB 서버 리소스 낭비를 줄이려면 결과 집합을 해제해야합니다.

영구 연결 대신 일시적인 짧은 연결을 사용하는 것이 좋습니다. 지속성을 도입하는 것은 전체 웹 요청 - 응답 흐름에 상당히 비견적입니다. 아시다시피 : 1 pconnect 요청은 db 서버에서 8 시간 지속되는 연결을 야기하고 다음 요청을 기다리지 않습니다. 사용자 수를 곱하여 리소스를 살펴보십시오.

임시 연결

당신이로 mysql_connect()를 사용하는 경우이 - mysql_close하는 것을 잊지 마세요(). new_link을 false로 설정하고 CLIENT_INTERACTIVE 플래그를 전달하십시오. interactive_timeout을 조정하면 이전 연결이 작업을 차단하는 것을 막을 수 있습니다. 문제가 해결되지 않으면

문제가 지속되면

, 규모

, 다음 확장하기로 결정. 다른 DB 서버를 추가하고 프록시를 앞에두고 (MySQL은 HAProxy와 잘 작동 함) 또는 자동으로 스케일링 클라우드 서비스로 전환하십시오.

나는 정말로 의심 스럽지만, 당신의 물건이 올바르게 구성되어 있습니다. 여러 개의 웹 서버는 물론 여러 개의 MySQL 서버를 이미 실행하고있는 경우 어떻게 이런 문제가 발생할 수 있습니까? 로드 균형 조정 설정을 설명하십시오.

아파치 2.2 + mod_php + MySQL + 알 수없는 균형 장치 같은 소리, 맞습니까?

아마 시도
+0

동시 사용자는 1 만 명입니다. 일일 사용자는 약 50 만 명입니다. – iamlegend

관련 문제