web-dev-qa-db-ja.com

ローカルデータベースとAmazon RDS

ローカルのMySQLデータベースに大きなINSERTを実行しています

私は2,000,000行に達しており、現在、減速に気づき始めています。 MySQLはあまりスケーラブルではないと聞いていました

私はこのデータベースが大きくなることを期待しており、挿入することがたくさんあります

amazonマイクロインスタンスを使用すると、ここで何かメリットがありますか?

アップロード速度がボトルネックになるとは思いません。そのため、私のロジックでは、分散処理によってデータベースが高速になるということです。

これはより多くのCPU使用率の問題であることが判明しましたが、Amazonのソリューションの方が優れているでしょう。このロジックを使用すると、より高価なインスタンスのパフォーマンスが向上します

しかし、ここには非常に多くの変数が含まれているので、誰かがこれについて言う経験がありますか?

5
CQM

MySQL環境、特にInnoDB設定を完全に調整する必要があります。 (チューニングのヒントについては、回答の下部を参照してください)。これは、RAM /ディスクのエルボールームでアマゾンと戦うよりもはるかに優れています。なぜ私は戦いと言ったのですか?

MySQLのAmazon RDSインスタンスをスピンアップしただけの場合は、与えられた制約を受けます。 MySQL Amazon RDSのすべてのモデルには同じ主要オプションがありますが、2つの点のみが異なります

  • max_connections
  • innodb_buffer_pool_size

ここに私が一週間前に投稿したチャートがあります: https://dba.stackexchange.com/a/21498/877

MODEL      max_connections innodb_buffer_pool_size
---------  --------------- -----------------------
t1.micro   34                326107136 (  311M)
m1-small   125              1179648000 ( 1125M,  1.097G)
m1-large   623              5882511360 ( 5610M,  5.479G)
m1-xlarge  1263            11922309120 (11370M, 11.103G)
m2-xlarge  1441            13605273600 (12975M, 12.671G)
m2-2xlarge 2900            27367833600 (26100M, 25.488G)
m2-4xlarge 5816            54892953600 (52350M, 51.123G)

モデルが大きいほど、InnoDBバッファープールも大きくなります。ええ、予算を大きくする必要があります。

ほとんどの人が知らないのは、InnoDBトランザクションログファイルがすべてのモデルで同じサイズであるということです:128M。デフォルト設定( innodb_log_files_in_group = 2)を前提とすると、256Mのトランザクションログスペースになります。他のInnoDBオプションを設定する場合は、次のようにします。

  • カスタムDBパラメータグループを作成します(これをMySettingsと呼びます)
  • RDS CLIをダウンロードし、AWS認証情報で構成ファイルをセットアップする
  • 以下を実行します:./rds-modify-db-parameter-group MySettings --parameters "name=<InnoDB Option>,value=???,method=immediate"
  • DBパラメータオプションリストを使用して変更MySettings
  • MySQL RDSインスタンスを再起動します

それはあなたの将来の考慮のためです。

手元のインポートの問題については、 AWS RDSドキュメントにインポートの遅延を回避するための多くの提案があります 以下を含みます:

  • ロードする前にすべてのセカンダリインデックスを作成します。これは、他のデータベースに精通している人にとっては直観に反しています。セカンダリインデックスを追加または変更すると、MySQLはインデックスが変更された新しいテーブルを作成し、既存のテーブルから新しいテーブルにデータをコピーして、元のテーブルを削除します。
  • PK順でデータをロードします。これは、読み込み時間が75〜80%削減され、データファイルのサイズが半分になるInnoDBテーブルで特に役立ちます。
  • 外部キー制約を無効にするforeign_key_checks = 0 LOAD DATA INFILEでロードされたフラットファイルの場合、これは多くの場合必要です。どのような負荷でも、FKチェックを無効にすると、パフォーマンスが大幅に向上します。制約を有効にし、ロード後にデータを確認してください。
  • 既にリソース制限に近づいていない限り、並行してロードします。必要に応じて、分割テーブルを使用します。
  • SQLでロードするときに複数値の挿入を使用して、ステートメント実行のオーバーヘッドを最小限に抑えます。 mysqldumpを使用する場合、これは自動的に行われます。
  • InnoDBログを減らすIO innodb_flush_log_at_trx_commit = 0

LOAD DATA INFILEインポート用。どうして ?なぜなら、MyISAMテーブルのみが、一括挿入バッファー( がデフォルトで8M )と組み合わせて使用​​することでメリットがあるためです。 InnoDBはその恩恵を受けません。

Mysqldumpまたは独自のSQLを介してInnoDBテーブルをロードしている場合、すべて順調です。大量のトランザクションを一括で課している場合は、前に説明したように、トランザクションログを拡張する必要があります。

補足として、AWSがスナップショットを実行している場合は、大きなトランザクションを実行しないでください。スナップショットが適切にスケジュールされていることを確認してから、スナップショットウィンドウ内で大きなトランザクションを実行しないようにコミットする必要があります。一括トランザクション中にスナップショットを無効にすることもできますが、 AWS RDSのドキュメント には、次の点に大きな注意があります。

警告:ポイントインタイムリカバリを実行する機能を維持する必要がある場合は、自動バックアップを無効にしないでください。自動バックアップを無効にすると、既存のバックアップがすべて消去されるため、自動バックアップを無効にした後は、ポイントインタイムリカバリを実行できません。自動バックアップを無効にすることはパフォーマンスの最適化であり、データのロードには必要ありません。 DBスナップショットは、自動バックアップを無効にしても影響を受けないことに注意してください。既存のすべてのDBスナップショットは、引き続き復元に使用できます。

自動バックアップを無効にすると、ロード時間が約25%短縮され、ロード中に必要なストレージ容量が減少します。データを含まない新しいDBインスタンスにデータをロードする場合、バックアップを無効にすると、ロードを高速化し、バックアップに必要な追加のストレージを使用しないようにする簡単な方法です。ただし、すでにデータが含まれているDBインスタンスにロードする場合は、バックアップを無効にすることの利点と、ポイントインタイムリカバリを実行する機能を失うことの影響を比較検討する必要があります。

DBインスタンスでは、デフォルトで自動バックアップが有効になっています(保持期間は1日)。自動バックアップを無効にするには、バックアップ保持期間をゼロに設定する必要があります。ロード後、バックアップ保持期間をゼロ以外の値に設定することにより、バックアップを再度有効にすることができます。バックアップを有効または無効にするために、Amazon RDSは、DBインスタンスをシャットダウンして再起動し、MySQLロギングをオンまたはオフにする必要があります。

Rds-modify-db-instanceコマンドを使用して、バックアップ保持をゼロに設定し、変更をすぐに適用します。保持期間をゼロに設定するには、DBインスタンスを再起動する必要があるため、再起動が完了するまで待ってから次に進みます。

rds-modify-db-instance AcmeRDS --apply-immediately --backup-retention-period = 0 rds-describe-db-instancesコマンドを使用して、DBインスタンスのステータスを確認できます。この例では、AcmeRDSデータベースインスタンスのステータスが表示され、列見出しを表示する--headersオプションが含まれています。

エピローグ

これが、InnoDBのチューニングに関する私の過去の投稿です。

10
RolandoMySQLDBA

@Philで述べたように、Amazon RDSは配布されないため、オンデマンドでマシンをアップグレードできることを除いて、ローカルシステムとほとんど同じです。それでも、最大のRDSインスタンスで利用できるよりも多くのCPUパワーを使用する必要がある場合は、行き詰まります。スループット/ CPU使用率に無制限のスケーラビリティを持たせたい場合は、自動スケーリングを提供する Xeround のようなMySQLサービス、または RackSpace's MySQLサービスを検討する必要があります-これらは分散されていますRDSとは異なり、ソリューション。 :)

0
Lena Weber