mysql_pconnect없이 PHP 영구 연결 풀링-가능합니까?


12

나는 잠시 동안 이것을하는 좋은 방법을 찾으려고 노력해 왔습니다. 그러나이 작업을 수행하기에 적합한 조각을 찾는 데 어려움을 겪었습니다. 이것이 가능해야한다고 생각합니다.

여기에 간단한 용어를 넣으면 내가 성취하고 싶은 것입니다.

PHP / Other front end -> [SOCKET] ->

Locally hosted 'pooler' -> [Pool of persistent TCP/IP connection(s)]->

Externally hosted MySQLD

그러한 도구 / 일을하는 방법이 있습니까?

기본적으로 mysql_pconnect를 사용하지 않고 지속적인 mysql 연결을 구현하고 싶습니다.

나는 지속적인 연결이 어떻게 필요하지 않은지에 대해 논의하기 시작하지 않기를 정중하게 요청합니다. TIME_WAIT 포트가 부족하여 이러한 유형의 시스템이 구현 된 경우 해결 될 다른 문제가 있습니다.

그래서, 요약하자면 ... 로컬 끝을 기반으로하는 소켓 인 mysql 연결 풀러를 구현하고 (LAN) 외부에서 호스팅되는 mysql 서버에 대한 연결을 유지합니다.

우리는 재활용되는 mysql 연결의 영향을받는 트랜잭션이나 다른 것을 사용하지 않습니다.

우리는 프론트 엔드에서 마스터 + 마스터 percona 5.5 클러스터로 리눅스를 실행하고 있습니다.

감사!

답변:


12

많은 검색을 마친 후 마침내 해결책을 찾았습니다.

나는 작가가 많지 않으므로 가능한 한 간결하게 만들기 위해 최선을 다할 것입니다.

내가 찾을 수있는 한 두 가지 가능한 솔루션이 있습니다.

SQL 릴레이

http://sqlrelay.sourceforge.net/

이것은 질문이 요구 한 것과 정확하게 일치합니다. 나는 이것에 대해 알 수있는 것에 대해 너무 자세하게 설명하지는 않지만 투명하지 않기 때문에 가능한 해결책이 아니라고 언급 할 것입니다. 흐름은 다음과 같습니다.

PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL

따라서 이것은 모든 코드를 mysql에서 sql relay로 다시 작성하는 것과 관련이 있습니다. 우리의 경우에는 옵션이 아닙니다.

말하자면, 누군가가 SQL Relay의 수많은 기능 중 하나를 필요로 하는 신선한 대규모 프로젝트를 계획하고 있다면 아름답게 들립니다.

MySQL 프록시

http://forge.mysql.com/wiki/MySQL_Proxy

이것이 우리가 사용한 솔루션입니다.

이것이 우리가 원하는 일을하게하는 열쇠는 mysql 프록시를위한 풀링 LUA 스크립트입니다.

이 LUA 확장은 다음에서 찾을 수 있습니다.

https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua

너무 자세하게 설명하지 않으면 여기에 몇 가지 기본 통계가 있습니다 ... 맨손으로 염두에두고 사용률이 낮을 때 테스트합니다.

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

mysql-proxy로 전환하고 문제를 해결 한 후 :

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

보다시피 알 수 있듯이 mysql의 TIME_WAIT 포트는 거의 없음으로 떨어졌습니다.

연결은 이제 mysql_pconnect / mysqli_connect (... p : hostname ...)를 사용하지 않고 지속적으로 유지 됩니다.

풀러 루아 스크립트 상단 근처에 몇 가지 구성 가능한 설정이있는 것으로 보입니다.

로컬 min_idle_connections

로컬 max_idle_connections

이것들은 꽤 자명 한 것으로 보입니다. 이를 제외하고 : 각 사용자 이름 (및 비밀번호? 테스트되지 않은 ... 대부분은 그렇지 않음) 조합이 고유 한 영구 연결 세트를 생성하는 것으로 보입니다.

따라서 max_idle_connections에 데이터베이스에 연결할 고유 한 mysql 사용자 수를 곱하십시오. 그리고 그것은 당신에게 얼마나 많은 유휴 연결이 있는지에 대한 아이디어를 줄 것입니다.

이 작은 블 러브가 Google을 통해 검색하는 사람들을 위해 일부 키워드를 검색하도록 반복하겠습니다.

PHP를 사용할 때 mysql_pconnect없이 지속적인 mysql 연결이 가능합니까?

예, 확장을 통해 쿼리를 파이프하거나 ro-pooling.lua 스크립트와 함께 mysql-proxy를 투명하게 사용하기 위해 대부분의 코드를 다시 작성하지 않아도되는 경우 SQL Relay를 통해 수행 할 수 있습니다.

우리는 지금 약 1 년 동안 이런 것을 원했습니다.

즐겨!


mysqli의 영속 함수가 제공하는 정리 기능 (아래 답변에 명시된 바와 같이)을 단순히 사용하지 않는 이유는 무엇 입니까? mysqli에 접근 할 수 없다면 왜 mysql_pconnect"정리 기능"으로 각 연결을 사용 하고 시작 하지 않습니까?
Pacerier

4
  1. mysqli확장을 위해 지속적인 연결 지원이 PHP 5.3에 도입되었습니다 . PDO MYSQL 및 ext / mysql에는 이미 지원이있었습니다. 영구 연결의 기본 개념은 클라이언트 프로세스와 데이터베이스 간의 연결을 여러 번 작성 및 파괴하지 않고 클라이언트 프로세스에서 재사용 할 수 있다는 것입니다. 이렇게하면 사용하지 않는 연결이 캐시되고 재사용 될 수 있으므로 필요할 때마다 새로운 연결을 생성하는 오버 헤드가 줄어 듭니다.

  2. mysql 확장과 달리 mysqli영구 연결을 여는 별도의 기능을 제공하지 않습니다. 지속적인 연결을 열려면 연결시 p :를 호스트 이름 앞에 추가해야합니다.

  3. 지속적인 연결의 문제점은 클라이언트가 예측할 수없는 상태로 남아있을 수 있다는 것입니다. 예를 들어, 클라이언트가 예기치 않게 종료되기 전에 테이블 잠금이 활성화 될 수 있습니다. 이 영구 연결을 재사용하는 새 클라이언트 프로세스는 "있는 그대로"연결을 얻습니다. 영구적 인 연결을 잘 활용하기 위해서는 새로운 클라이언트 프로세스에서 정리를 수행해야하므로 프로그래머의 부담이 커집니다.

그러나 mysqli 확장의 지속적인 연결은 내장 된 정리 처리 코드를 제공합니다. mysqli가 수행하는 정리는 다음과 같습니다.

Rollback active transactions

Close and drop temporary tables

Unlock tables

Reset session variables

Close prepared statements (always happens with PHP)

Close handler

Release locks acquired with `GET_LOCK()`

이렇게하면 클라이언트 프로세스가 연결을 사용하기 전에 연결 풀에서 리턴 할 때 지속적 연결이 깨끗한 상태에있게됩니다.

mysqli 확장은 C-API 함수를 자동으로 호출하여이 정리를 수행 mysql_change_user()합니다.

자동 정리 기능에는 장점과 단점이 있습니다. 장점은 프로그래머가 더 이상 자동으로 호출되는 정리 코드 추가에 대해 걱정할 필요가 없다는 것입니다. 그러나 연결 풀에서 연결이 리턴 될 때마다 정리를 수행하기위한 코드를 실행해야하기 때문에 단점은 코드가 약간 느려질 수 있다는 것입니다.

MYSQLI_NO_CHANGE_USER_ON_PCONNECT정의 된 PHP를 컴파일하여 자동 정리 코드를 끌 수 있습니다 .

노트 :

mysqli 확장은 MySQL Native Driver 또는 MySQL Client Library를 사용할 때 지속적인 연결을 지원합니다.

또한 다음 링크를 참조 할 수 있습니다. http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.