web-dev-qa-db-ja.com

書き込みの多いアプリケーションによるデータベースのスケーラビリティ

書き込みの多いアプリケーションがあります。アプリケーションは調査と比較して最適です。顧客はカスタムの質問を作成し、これをデータベースに保存します。ほとんどのリクエストは、これらのフォームを送信するユーザーからのものです。その後、お客様はこれらの提出物について複雑なレポートやグラフを作成します。

アプリケーションサーバー(PHP)とWebサーバー(Nginx)のスケーリングが非常に簡単であることを確認します。問題は、データベースサーバーを複数のサーバーにスケーリングすることです。

多くのアプリケーションは読み取りが多いため、通常、すべての書き込みが単一のマスターに送信されるマスタースレーブレプリケーション設定がありますが、読み取りはスレーブに分散されます。ほとんどの場合書き込みを行っているため、これは機能しません。

マスターマスターのセットアップについての言及を見たことがありますが、これは通常、自動インクリメントされた主キーで問題にぶつかります。解決策は通常、一方のサーバーに奇数を実行させ、もう一方のサーバーに偶数を実行させることです。避けたい。

いくつかの同様の質問で、タングステンレプリケーターについての言及と、それがどのようにレプリケーションでより多くの柔軟性を提供するかについて言及しました。これは私にまったく役立ちますか?これにより、MySQLの組み込みレプリケーションでは提供できないどのようなメリットがありますか?

MySQL Clusterもありますが、これは通常、非常に大規模なデータベースと複雑なクエリ(結合)で問題にぶつかります。複雑なレポートを実行できる必要があるため、これはおそらく機能しません。

冗長性、自動フェイルオーバー、リクエストの分散、データの整合性を求めています。

Webに適したより良いソリューションを提供する他のRDMSはありますか?

3
Luke

大統一データベースレイアウトのようなものはありません。カスタム質問がある場合は、実際には、カスタムテーブルが必要です。そうしないと、thedailywtf.comからのVARCHAR(128)-with-no-primary-keys怪物の200列の単一テーブルへのクイックパスにいます。これは非効率的でサポートできず、将来的にあなたを傷つけるでしょう。 。

Toppledwagonが推奨するシャーディングは考慮すべきことかもしれませんが、最初に、データベースが合理的に設計されていることを再確認してください。それが正規化されていない場合は、非常に良いものを持ってください。できれば、テスト、理由、そうでない理由に裏打ちされています。何百ものテーブルがある場合、それはおそらく間違っています。テーブルが1つしかない場合は、間違いなく間違っています。問題を独立したセットに分割する方法を見てください。あなたは前もってより多くの努力を費やすでしょう、しかしシステムはそれのためにより良いでしょう。

たとえば、1行あたり2kのデータ(調査では多くの文字のように見えます)を含む100万行は、2GBのメモリです。問題にもう少しハードウェアを投入できれば、データセットをRAMに保持できるかもしれません。

次の質問につながるのはどれですか:絶対数でのあなたの負荷は何ですか? 1秒あたりのI/Oに変換され、1秒あたりの読み取りと書き込みに分割された、1秒あたりの顧客の要求、何ギガバイトのデータ、どのような成長率ですか?負荷はリクエスト数に応じてどのようにスケーリングしますか?直線的に?指数関数的に?データを公開する必要はありません。データを書き留めて考えてください。今日は何ですか、1、2年後にはどうなると思いますか。

Wikipedia 15k rpm SASドライブは175-210IOpsを提供します。現在および予測される負荷を満たすためにRAID10にはいくつ必要ですか?データセット?データセットに合わせるために必要なドライブの数(おそらくIO要件を満たすよりもはるかに少ない)SSDのペア(またはダース)を購入することは正当ですか?ローカルストレージは問題ありませんか?または、2つの8Gbファイバーリンクをハイエンドストレージサブシステムに飽和させますか?

現在1kIOpsが必要であるが、RAID5に3つの10krpm HDDがある場合、ハードウェアが要件を満たすことができる方法はありません。 OTOHアプリに1秒あたりのユーザー要求があり、32コアの256GBのRAM獣、エンタープライズクラスのストレージに支えられている)があれば、問題はハードウェア内にない可能性があります機能。

5
Paweł Brodacki

マスター-マスターのセットアップですが、これは通常、自動インクリメントされた主キーで問題にぶつかります

いいえ-衝突を避けるために auto-increment-incrementauto-increment-offset を設定するだけです

解決策は通常、一方のサーバーに奇数を実行させ、もう一方のサーバーに偶数を実行させることです。避けたい。

どうして?代理キーは、その性質上、インデックスを作成するデータとは無関係です。そのような値に意味を割り当てることは非常に危険です

提供したTungstenリンクをざっと見てみると、その機能についてはあまりわかりません。たとえば、「複数のマスターレプリケーションを実行できます。これは、MySQLネイティブレプリケーションで実行できるよりも多くなります」)。同じ段落で、競合を処理できないと書かれています。この商品の有用性に自信がありません。

マスター-マスターレプリケーション(レプリケーションを制限するためのフェデレーションの有無にかかわらず)が要件を満たさないと仮定すると(ただし、自動インクリメントフィールドタイプについての考え方を再検討する必要があります)、mysqlproxyまたはを使用してネイティブクラスター間でデータをシャーディングできます。 nosqlデータベースを使用します。

1
symcbean

これは sharding の良いケースのように聞こえます。ある調査のデータが別の調査のデータにすぐにアクセスする必要がない場合は、データのシャーディングが簡単になります。基本的に、SurveyDBを指すユーザーIDキーを持つデータベースをセットアップします。その後、複数の調査DBを設定できます。うまくいけば、複製されたタプルにもそれらを設定することを選択するでしょう。アプリケーションは少し手直しする必要があります。

レポートを実行し、ソフトウェアで結合を実行します。それもオプションである場合は、シャーディングが最適です。

0
toppledwagon