2

大規模なAmazonRDSインスタンスで実行されているMySQLデータベースにすべての永続データを保存するFacebookゲームがあります。テーブルの1つは2GBのサイズです。そのテーブルで数秒以上かかるクエリを実行すると、ゲームによって実行されたSQLアクションはすべて次のエラーで失敗します。

HTTP / 1.1 503サービスを利用できません:バックエンドサーバーの容量が不足しています

これは明らかに私たちのゲームをダウンさせます!

これらの期間中、RDSインスタンスのCPU使用率を監視しました。スパイクは発生しますが、50%を超えることはありません。以前はインスタンスサイズが小さく、100%に達したので、問題にCPU容量を増やすだけで解決できると期待していました。今では、開いている接続の数に問題があると思います。ただし、SQLを使用してから8か月ほどしか経っていないため、MySQL構成の専門家ではありません。

これらのクエリがサーバーに過負荷をかけないように変更できる構成設定はありますか、それともゲームの起動中に実行しないようにする必要がありますか?

MySQLWorkbenchを使用してクエリを実行しています。

どんな助けでも大歓迎です-ありがとう!

編集:

これが例です...

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

テーブルは次のようになります。

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
4

3 に答える 3

1

高可用性RDSを実行し、そこからリードレプリカを設定することを本当に検討する必要があります。そうすれば、レプリカに対して複雑なクエリを実行して、本番データベースに干渉することはありません。

2GB(サイズ)のデータベースは、実際にはそれほど大きくはありません。クエリしようとしているテーブルに適切なインデックスがある場合は、DBをロックしてはいけません。

何よりも、大容量の本番データベースでクエリを実行しないでください。データベースが何をするのかわからない場合は。上記のコメントから、あなたはあまり経験豊富なDB管理者ではないことが明らかです。それで大丈夫です。大容量のサーバーで作業することは、間違いなくあなたにとって学習体験になります。サービスをクラッシュさせるようなレッスンを行わないようにしてください。繰り返しになりますが、これが、大きなテーブルでクエリを試行する前に、レプリカを作成するか、DBスナップショットを作成してテストDBを設定することをお勧めする理由です。

于 2012-11-30T01:59:04.257 に答える
1

おそらくスキーマを微調整する必要があります(インデックスの追加が当面のステップです)。

状況を分析するために、データベースのMySQL低速クエリログにアクセスして、実行速度の遅いSQLクエリがあるかどうか、ある場合はそれぞれのパフォーマンス特性を判断できます。「slow_query_log」DBパラメータを設定し、mysql.slow_logテーブルにクエリを実行して、実行速度の遅いSQLクエリを確認できます。詳細については、 AmazonRDSユーザーガイドを参照してください。

DynamoDBまたはRedisへのオフロードを検討する必要のあるテーブルがおそらくいくつかあります。どちらも1桁のミリ秒の遅延が発生するため、ゲーム開発者の間で非常に人気があります。データ構造について考える必要があります。

于 2012-11-30T11:09:39.693 に答える
1

のインデックス(FromUserId, Amount, Status)は、おそらくこのクエリに大いに役立ちます。

ただし、このテーブルにヒットするクエリのバリエーションはもっとたくさんあるかもしれません。それらすべてにインデックスを追加すると、テーブルに数十のインデックスが作成され、他の問題が発生する可能性があります。

遅いクエリログを分析してから、最も遅いクエリ(およびCPUの使用率が高いクエリ)を最適化してください。

于 2012-11-30T11:33:53.217 に答える