2012-11-29 2 views
2

우리는 대규모의 Amazon RDS 인스턴스에서 실행되는 MySQL 데이터베이스에 모든 영구 데이터를 저장하는 Facebook 게임을 보유하고 있습니다. 우리 테이블 중 하나는 2GB 크기입니다. 나는 몇 초 이상 걸릴 해당 테이블에 어떤 쿼리를 실행하면, 우리의 게임에 의해 수행되는 SQL 작업 오류와 함께 실패합니다SQL 쿼리가 우리 게임을 깨뜨립니다! (백엔드 서버 용량 있음)

HTTP/1.1 503 서비스를 사용할 수 없음 : 백 엔드 서버 용량

에있다

이것은 분명히 우리 게임을 가져옵니다!

이 기간 동안 RDS 인스턴스의 CPU 사용량을 모니터링했지만 스파이크는 있지만 50 %를 넘지 않았습니다. 이전에는 크기가 더 작은 인스턴스 크기 였고 100 %를 기록 했으므로 문제를 해결하기 위해 더 많은 CPU 용량을 던지기를 기대했습니다. 이제는 열린 연결의 수가 문제라고 생각합니다. 그러나 나는 8 개월 정도만 SQL을 사용하여 작업 했으므로 MySQL 구성에 대한 전문 지식이 없습니다.

이러한 쿼리가 서버에 과부하되는 것을 방지하기 위해 변경할 수있는 구성 설정이 있습니까? 아니면 게임이 정상적으로 실행되고 있지 않아야합니까?

저는 쿼리를 실행하기 위해 MySQL Workbench를 사용하고 있습니다.

도움이 될 매우 감사하겠습니다 - 고마워!

는 편집 : ....

SELECT * 
FROM BlueBoxEngineDB.Transfer 
WHERE Amount = 1000 
AND FromUserId = 4 
AND Status='Complete'; 

표는 다음과 같은 예를 들어 보이는 여기

이있어 :

당신은 고 가용성 RDS를 실행하고 최대 설정하는 것이 정말해야
TransferId Started Status Expires FromUserId ToUserId CurrencyId Amount SessionId 

1177 2012-06-04 21:43:18 Added  150001  2   4   1 12156 
1179 2012-06-04 21:48:50 ISF   150001  2   4   1 12156 
1181 2012-06-04 22:08:33 Added  150001  2   4   25 12156 
1183 2012-06-04 22:08:41 Complete 150001  2   4   50 12156 
1185 2012-06-04 22:08:46 Added  150001  2   4   200 12156 
+3

큰 테이블에 이미 적절한 인덱스가 있다고 가정합니다. –

+2

테이블이 2GB 인 경우에도 일반적으로 검색어가 복잡해지지 않으면 검색어에 몇 초 이상 걸리지 않습니다. 예제 쿼리, 해당 쿼리의'EXPLAIN' 및 테이블 구조를 게시하십시오. 쿼리를 실행중인 테이블에 쓰는 게임에서 오는 쿼리입니까? 그렇다면 잠금 문제 일 수 있습니다. –

+0

방금 ​​다음과 같은 간단한 쿼리를 사용했습니다. SELECT * FROM BlueBoxEngineDB.Transfer WHERE Amount = 1000 AND FromUserId = 4; – TimH

답변

1

그것으로부터 복제본을 읽는다. 그렇게하면 복제본에서 복잡한 내용을 마음대로 처리하고 프로덕션 데이터베이스를 방해하지 않을 수 있습니다.

크기가 2GB 인 데이터베이스는 실제로 그렇게 큰 것은 아닙니다. 쿼리하려는 테이블에 적절한 인덱스가 있다면 DB를 잠그지 않아야합니다.

무엇보다 어떻게 해야할지 모르는 경우 고용량 프로덕션 데이터베이스에서 쿼리를 실행하지 마십시오. 위의 주석에서 당신은 매우 숙련 된 DB 관리자가 아니라는 것이 분명해 보입니다. 괜찮아. 대용량 서버에서 작업하는 것은 확실히 당신을위한 학습 경험이 될 것입니다. 단지 당신이 당신의 서비스를 망가 뜨리는 곳에서 당신의 수업을 만들지 않도록 노력하십시오. 다시 말하지만 큰 테이블에서 쿼리를 시도하기 전에 복제본을 만들거나 DB 스냅 샷을 만들고 테스트 DB를 설정하는 것이 좋습니다.

+0

사실, 귀하의 회신을 보았을 때이 일을 마쳤습니다. 그것은 위대한 작품! :) – TimH

1

아마도 스키마를 조정해야합니다 (adding indexes).

상황을 분석하려면 데이터베이스의 MySQL 저속 쿼리 로그에 액세스하여 느리게 실행되는 SQL 쿼리가있는 경우와 그렇지 않은 경우 각각의 성능 특성을 확인할 수 있습니다. "slow_query_log"DB 매개 변수를 설정하고 mysql.slow_log 테이블을 쿼리하여 느리게 실행되는 SQL 쿼리를 검토 할 수 있습니다. 자세한 내용은 Amazon RDS User Guide을 참조하십시오.

DynamoDB 또는 Redis으로 오프로드하는 것이 좋습니다. 둘 다 한자리 수 밀리 초의 대기 시간을 제공하므로 게임 개발자들 사이에서 매우 인기가 있습니다. data structure에 대해 생각하면됩니다.

1

(FromUserId, Amount, Status)에 대한 색인은이 검색어에 많은 도움이 될 것입니다.

이 표를 조회하는 검색어가 훨씬 많아 졌을 수도 있습니다. 각각의 인덱스를 추가하면 테이블에 수십 개의 인덱스가 생겨 결국 다른 문제가 발생할 수 있습니다.

느린 쿼리 로그를 분석 한 다음 가장 느린 쿼리 (및 더 많은 CPU 백분율을 사용하는 쿼리)를 최적화하십시오.