web-dev-qa-db-ja.com

PostgreSQLとMySQLのスケーラビリティの制限

MySQLやPostgreSQLなどの非分割リレーショナルデータベースのパフォーマンスは10 TBを超えると「壊れる」と聞いたことがあります。

Netezza、Greenplum、Verticaなどを思い付かないので、そのような制限はあるのではないかと思いますが、これらの制限が定量化されている研究論文または正式なケーススタディを参照している方がいらっしゃれば、お願いします。

43
Edmon

あなたの質問に対する単純な答えはありませんが、ここで考えるべきことがいくつかあります。

まず、心配するのは規模だけではありません。データを使って何をするかです。 500個のテーブルが30 TB=のデータであり、単純なOLTPレポートをほとんど作成せずに実行している場合、問題が多すぎるとは思わない。PostgreSQLには32 TBのデータベースがあります。ただし、すべてのディスクにヒットする必要があるため、パフォーマンスは多少低下します。同様に、データが50 TBであるにもかかわらず、一般的に約100 GBのヒットセットがある場合、十分なRAMを備えたサーバーを構築し、データベースのその部分をメモリに保持することで、あなたは黄金に輝くでしょう。

一方、1TBのデータからモード(最も一般的な値)を取り出そうとしている場合は、使用しているシステムに関係なく、これはpainfulシャーディングありまたはなし。 (編集:シャーディングは実際、この問題を引き起こす可能性がありますさらに悪い。

MySQLおよびPostgreSQLの巨大なdbで発生する主な問題には、どちらもクエリ内並列処理をサポートしていないという事実が関係しています。つまり、クエリは単一のスレッドによって単一のブロックとして実行され、分割して個別に実行することはできません。これは、多くの場合、大量のデータに対して大規模な分析クエリを実行するときに問題になります。 Postgres-XCとGreen Plumは、ストレージと実行を分離し、コーディネーターレベルでこれを行うことができるので、ここが役に立ちます。 Postgres-XCとGreen Plumは基本的に内部でシャーディングを使用しますが、コーディネーターはすべての整合性をグローバルに適用します。

クエリ内並列処理を使用すると、クエリを分割し、さまざまなプロセッサ/ディスクI/Oチャネルでクエリの一部を実行し、結果セットの一部を報告してアセンブルし、アプリケーションに戻すことができます。繰り返しますが、これは通常、トランザクション処理の負荷ではなく分析に最も役立ちます。

2つ目は、VerticaやGreenplumなどの一部のシステムでは、情報の列が一緒に格納されることです。これにより、OLTPの観点からシステムを使用することが困難になり、パフォーマンスが低下しますが、大規模な分析ワークロードのパフォーマンスが大幅に向上します。これは、ワークロード固有のトレードオフです。

したがって、答えは、1-2を超えるとTBサイズが大きくなります可能性があります数字に直面しますこれもデータベースやワーキングセットのサイズなどに固有の問題ですが、この時点では、スノーフレークシステム、つまり、ワークロードに固有でカスタマイズされたスノーフレークシステムを使用する必要があります。

もちろん、これは限界が一般に定量化できないことを意味します。

編集:PostgreSQLで意思決定支援とトランザクション処理のワークロードの混合を処理する9TBデータベースで作業しました。単一の最大の課題は、データセットの大部分にヒットする質問がある場合、答えを待つ必要があることです。

ただし、ファンダメンタルズ(インデックス、自動バキューム、これらが低レベルでどのように機能するかなど)と十分なコンピューティングリソースに注意を払えば、これらは完全に管理可能です(そして、私はPgの30TBの範囲で十分に管理できると思います)。

Edit2:いったん100TBに達すると、動作はデータセットによって異なります。現在PostgreSQLのテーブルあたり32TBの制限に達するため、この範囲に拡張されないものに取り組んでいます。

52
Chris Travers