こんにちは友人私は私の製品の1つにMySQLDBを使用しています、現在約250の学校が歌っています、1時間あたり約1500000挿入、1日あたり約12000000挿入、1台のサーバーのような私の現在のセットアップは数時間でクラッシュする可能性があると思います、読み取りも書き込みと同じです。どうすればクラッシュのないDBサーバーを作成できますか。現在直面している主な問題は、データの書き込みと読み取りの両方が遅いことです。どうすればそれを克服できますか。解決策を入手してください。みんな助けてください。解決策を実行するための良いモデルはどれですか?
3 に答える
1秒あたり約500回の挿入は、実際にくしゃみをするものではありません。
柔軟なソリューションの場合、ある種のシャーディングを実装することをお勧めします。おそらく最も簡単な解決策は、学校を事前にグループに分け、学校のさまざまなグループのデータをさまざまなサーバーに保存することです。たとえば、学校1〜10のデータはサーバーAに保存され、学校11〜20はサーバーBに保存されます。異なる学校のデータ間の関係がほとんどないと仮定すると、これはほぼ無限にスケーラブルです。
また、問題に対してより多くの馬力を投入して、SSDドライブのRAIDに投資することもできます。十分な処理能力があると仮定すると、問題はありません。もちろん、それが巨大なデータベースである場合、SSDドライブの容量は十分ではないかもしれません。
最後に、たとえばデータベースを非正規化することによって、挿入の数を減らすことができるかどうかを確認します。たとえば、各生徒の出席を別々の行に格納する代わりに、クラス全体の出席を1つの行のベクトルとして配置します。もちろん、このような変更により、クエリ機能が大幅に制限されます。
高速読み取りと書き込みの両方を同時に取得することは困難です。高速読み取りを取得するには、インデックスを追加する必要があります。高速書き込みを取得するには、いくつかのインデックスが必要です。そして、両方を高速にするために、それらは互いにロックしてはなりません。
ニーズに応じて、1つの解決策は2つのデータベースを持つことです。ライブデータベースに新しいデータを書き込みます。静かなときに、クエリを実行できる別のデータベースにデータを同期できることがよくあります。このアプローチの欠点は、読み取るデータが少し古くなることです。これは、何をする必要があるかによって、問題になる場合と問題にならない場合があります。
私ののんびりとしたアドバイスは次のとおりです。
- アプリケーションを軽量に構築します。ActiveRecordのような高レベルのデータベース抽象化レイヤーを使用しないでください。彼らはスケーリングに夢中です。
- mysqlのパフォーマンスについて多くを学びます。
- mysqlレプリケーションについて学びます。
- 負荷分散について学びます。
- インメモリキャッシュについて学びます。(memcached)
- 管理者(適切なmysqlの知識を持つ)またはWebアプリのパフォーマンスの第一人者/コンサルタントを雇います。
具体的な戦略は、アプリケーションとその使用方法によって異なります。Mysqlレプリケーションは、適切な場合と適切でない場合があります(前述のシャーディング戦略にも同じことが当てはまります)。ただし、アプリケーションの設計にあまり影響を与えないため、スケーリングを実現するためのかなり簡単な方法です。インメモリキャッシュはデータベースからの負荷をある程度抑えることができますが、適用するにはいくつかの作業といくつかのトレードオフが必要です。最終的には、高負荷の下でデータベース駆動型アプリケーションを処理する方法を全体的によく理解する必要があります。締め切りが厳しい場合は、経験がなければ6週間以内にこれを行うことができないため、外部の人員を追加してください。