2016-11-13 8 views
1

저는 Joomla 애플리케이션에서 Gearman을 사용하고 Gearman UI를 사용하여 활성 직원 및 작업 번호를 추적합니다.PHP Gearman 너무 많은 mysql 연결

MYSQL로드 및 연결 수에 문제가있어 문제를 추적 할 수 없지만 몇 가지 질문이 있습니다.

1- Gearman Workers는 각 작업에 대해 새로운 데이터베이스 연결을 시작합니까? 아니면 동일한 연결을 공유합니까?

2 Gearman이 작업이 실행될 때마다 새 연결을 시작하면 모든 작업이 동일한 연결을 공유하도록 어떻게 변경할 수 있습니까?

3 개 이상의 서버간에 부하의 균형을 조정하려면 어떻게해야합니까?

4- MYSQL 호스팅을위한 "Pay-as-you-go"패키지 같은 것이 있습니까? 그렇다면 언급하십시오.

고맙습니다.

+0

앱이 얼마나 정확하게 작동하는지 알 수 없습니다. Gearman 자체는 지속적 대기열을 사용하여 다시 시작한 후에 대기열에 쓰고 대기열에서 읽습니다. 따라서 Gearman은 하나의 연결 만 사용합니다. 나는 당신의 직업이 매번 새로운 MySQL 연결을 시작할 것이라고 믿습니다. 기어맨이 당신을 도울 수 없기 때문입니다. 작업자 코드로 수정해야합니다. http://php.net/manual/en/features.persistent-connections.php에서 도움을받을 수 있습니다. 3) 그게 무슨 gearman을 위해? 단 하나의 서버와 여러 클라이언트가 모든 곳에서 ... 기어 맨이 처리 할 것입니다 .4) - 죄송합니다. ( –

+0

@ dominik.mank 3) 하나 이상의 서버가 아닌 하나 이상의 서버에서 작업자를 실행하고 싶습니다. Gearman을 사용하여 가능합니까? –

+0

http://gearman.org/img/cluster.png 이미지를 배포자 http://gearman.org에서 확인하십시오. 가능 합니다만, 가능하지는 않지만 기어맨을 사용하는 방법에 따라 다르므로 응용 프로그램에서 어떻게 작동하는지 말할 수 없습니다. –

답변

0

이는 작업자와 함께 모든 종류의 작업 대기열을 사용할 때 간과되는 문제입니다. 100 명의 직원이 각각 별도의 데이터베이스 연결을 엽니 다 (PHP 프로세스가 별도로 있음). MySQL이 구성되면 50 개의 연결을 허용하면 작업자가 실패하기 시작합니다. 질문에 대한 답변 :

1) 각 작업자는 각각 하나의 PHP 프로세스 내에서 실행되며 해당 프로세스는 1 개의 데이터베이스 연결을 엽니 다. 근로자는 데이터베이스 연결을 공유하지 않습니다.

2) 한 명의 작업자 만 작업을 처리하는 경우 하나의 데이터베이스 연결 만 열립니다. 50 명의 작업자가 실행 중이면 50 개의 데이터베이스 연결이 필요합니다. 이것들은 웹 요청이 아니기 때문에 영구 연결은 작동하지 않으며 공유는 작동하지 않습니다.

3) READ 슬레이브를 추가하고 MySQL 프록시를 사용하여로드 분산을 수행 할 수 있습니다.

4) 필자는 유료화 된 MySQL 호스팅 솔루션을 본적이 없습니다. 공급자에게 연결 수를 늘리라고 요청하십시오. 그렇지 않은 경우 자체 서버를 실행할 시간이 될 수 있습니다.

또한 gearman 서버 프로세스 자체는 하나의 데이터베이스 연결 만 사용하여 대기열을 유지 관리합니다 (mysql 저장소를 활성화 한 경우). 데이터베이스와 잘 당신의 노동자 코드 플레이를 시도 할 수 있습니다

전략 : 각 작업 후

  1. 는 노동자를 종료하고 다시 시작합니다. 새 작업을 수신 할 때까지 새 데이터베이스 연결을 열지 마십시오. 항상 작업자를 계속 작동 시키려면 supervisor을 사용하십시오.

  2. 모든 쿼리 후 데이터베이스 연결을 닫습니다. '휴면'상태에서 많은 연결이 열리는 것을 보면,이를 정리하고 데이터베이스 연결을 낮게 유지하는 데 도움이됩니다. 각 쿼리 후에 $pdo = null;을 시도하십시오 (PDO를 사용하는 경우).

  3. 데이터베이스 연결을 낮게 유지하기 위해 결과가 변경되지 않는 곳에 자주 사용되는 쿼리를 캐시하십시오.

  4. 쿼리가 가능한 빨리 실행되도록 테이블의 색인이 제대로 작성되었는지 확인하십시오.

  5. 데이터베이스 예외가 try/catch 블록에서 발견되는지 확인하십시오. 재시도 논리 (while loop)를 추가합니다. 여기서 작업자는 10 번의 시도 후에 정상적으로 실패합니다. 실패 후에 작업이 다시 대기열에 있는지 확인하십시오.

+0

감사합니다. @Kris이 질문에 모두 답변을 준 것 같습니다. 지금은 한 가지 질문 만 있습니다. Gearman 작업자를 실행하기 위해 하나 이상의 서버를 사용할 수 있습니까? 모든 서버에 작업자를 등록하고 파일을 모두에 복사하고 방금 (addServer) 함수를 사용해야합니까? 정확히 무엇입니까? –

+0

네, 그렇습니다. 더 많은 서버에 코드를 복사하고 복제하고 작업자를 실행하십시오. 이것은 워크로드가 증가함에 따라 수평 확장하는 방법입니다. –

0

내가보기에 가장 중요한 것은 무엇보다 먼저 MySQL로드라고 생각합니다. 이 혼란의 원인이되는 쿼리가 너무 많을 수도 있습니다. MySQL의 느린 쿼리 로그를 확인 했습니까? 그렇다면 무엇을 찾았습니까? 실행하는 데 1 초 이상 걸리는 쿼리는 느린 쿼리입니다.

+0

글쎄, 나는 작업자 큐를 관리하기 위해 너무 많은 직렬화 된 배열이 데이터베이스에 삽입되는 것을 의미한다. 내가 겪고있는 많은 MySQL의 부하 뒤에 이것이 이유라고 생각합니다. 현재 세션이나 파일 저장소와 같은 다른 솔루션을 찾으려고합니다. –