web-dev-qa-db-ja.com

MySQLサーバーを自動スケーリングする方法は?

トラフィックが急増しているサイトを運営しています。そのため、この場合、自動スケーリングソリューションは非常に有益です。現在、Webサーバーは水平方向に自動スケーリングできますが、ボトルネックはMySQLサーバーにあります。

  • Amazon RDS Multi-AZを試してみましたが、12GBのデータベースがアップグレードするのに15分ほどかかります。ダウンタイムは数分です。ある特定の瞬間に交通量の急増が起こることを私がすでに知っていたとき、それは大いに役立ちました。
  • Xeroundについても検討しました。このサイズのデータ​​ベースにはかなりの費用がかかりますが、これはおそらく最良の解決策です。とにかく、データベースをEUに置くことを法的に必要とするため、これは選択肢ではありません。
  • 私はScalrについて読みましたが、それが役立つかどうか、またどのように役立つかはわかりません。
  • 多くのクラウドホスティングプロバイダーが、ダウンタイムがゼロだと思う垂直スケーリングソリューションを提供しているのを見てきました(Xenハイパーバイザーを使用していることがわかっている限り、それが本当に可能かどうかはわかりません)。それは解決策かもしれませんが、ダウンタイムがないのか、MySQL構成(およびOS上の他の多くのもの)がダウンタイムなしでどのようにアップグレードできるのか疑問に思います。
  • MySQLスレーブサーバーで試しましたが、まったく役に立ちませんでした。
  • Memcacheを使用していますが、これは非常に役立ちますが、十分ではありません。読み取りだけでなく、書き込みのためにアップグレードする必要があります。

助言がありますか?前もって感謝します

8
Zillo

実際には、より簡単な解決策は、スタックにMemcachedを追加して、DBの負荷を節約することです。これにより、負荷を大幅に節約でき、サーバーをすばやく起動する(難易度が低い)問題を解決してから、MySQLの高速同期(難易度がはるかに高い)を計算するよりもはるかに簡単です。

http://toblender.com/?s=memcached

書き込みが多すぎるという問題を解決するための最も一般的な修正は、サーバーにメモリを追加する(より大きなワーキングセットをRAMに保持できる)、より高速なディスクにDBを配置する(SSDは優れたソリューションですが、コストがかかる)、またはシャーディングです。 (これは、追加のサーバーと複雑さで高価です)。

DBの書き込み負荷を軽減する別の方法は、頻繁に変化するデータを処理するためにインメモリデータストア(Redisなど)を組み込み、必要に応じて定期的にメインDBに変更を書き戻すことです。

4
gWaldo

スタートポロジ の使用を検討する必要があります

これが私が提案していることです

  • 1つの書き込みマスター(別名WM)
  • 1つ Distribution Master (別名DM)
  • Five(5)Read Slave Server(別名RSS)

このようにトポロジを準備します

ステップ01:これらの一般的なオプションを使用して5つのRSSをセットアップします

[mysqld]
skip-innodb
key_buffer_size=1G

これにより、すべてのテーブルがMyISAMストレージエンジンとしてロードされて作成されます。

ステップ02:セットアップDMおよびすべてのRSサーバー

  • mysqldumpWMからschemadumpファイルへのすべてのテーブルのスキーマ
  • schemadumpファイルをDMおよび5つのRSSすべてにロードします
  • rSSのすべてのテーブルでALTERTABLE tblname ROW_FORMAT=Fixed;を実行します
  • dMのすべてのテーブルでALTER TABLE tblname ENGINE=BLACKHOLE;を実行します
  • mysqldumpデータのみ(--no-create-infoを使用)をデータダンプに
  • 5つすべてのRSSにデータダンプをロードする

ステップ03:DMから5つのRSSすべてへのレプリケーションのセットアップ

ステップ04:WMからDMへのレプリケーションのセットアップ

セットアップの終了

読み取り/書き込みメカニズムの仕組みは次のとおりです

  • すべての書き込み(INSERT、UPDATE、DELETE)はWMで発生します
  • SQLはDMのバイナリログに記録されます(DMには実際のデータはありません)
  • 各RSSはDMへの読み取りスレーブです
  • すべての読み取りはRSSで行われます

さて、ここに問題があります...

  • 最初の読み取りにはRSS1〜4を使用します
  • 5番目のRSSを使用して、他のRSSを起動します
    • 5番目のRSSでservice mysql stopを実行します
    • 別のRSSをスピンアップ
    • 5番目のRSSの/ var/lib/mysqlと/etc/my.cnfを新しくスピンアップしたRSSにコピーします
    • 5番目のRSSでservice mysql stopを実行します
    • 新しいRSSでservice mysql stopを実行します

RSS#5を使用して、新しいサーバーを何度も起動できます

ちなみに、WMまたはDMはInnoDBまたはBLACKHOLEストレージエンジンをサポートしていないため、XEROUNDを使用しないでください。

これらのアイデアがお役に立てば幸いです。

3
RolandoMySQLDBA

これはあなたが管理するラックにありますか、それともクラウドにありますか? 12GBは、使用可能なディスクのサイズに比べて非常に小さいデータベースです。小さなSLCSSDのRAID1またはRAID10アレイに配置すると、書き込みレイテンシーがなくなります。

Intel311シリーズ20GBSLC SSD (各120ドル)は見事に仕事をします。

データベースが大きい場合は、データベースをZFS上のiSCSIターゲットに移動することで、同様に素晴らしい結果を得ることができますSANサーバー(Nexenta、OpenIndiana、FreeNASなどを使用して商品サーバーハードウェア上に構築) ZILライトキャッシュ用に類似のSSDのミラーを設定する最も異常な状況を除いて、ギガビットイーサネットはデータベースiSCSIトラフィックを移動するのに十分です。

1
Skyhawk

Innodbを使用する場合は、 Mysql multi-masters 管理対象 Galera を検討する必要があります。これにより、mysqlマルチマスターのセットアップが簡単になり、「セミ」自動スケーリングが簡単になります。

これがあなたまたはあなたの会社が作成しているアプリケーションである場合は、アプリケーションのシャード(パーティション化)設計への移行を検討できます。ただし、シャーディングは複雑になる可能性があります。ここに リンク があります。

私は、割り当てられた適切なメモリなどのように、mysql構成ファイルを「調整」したと想定しています。

1
Not Now