PostgreSQLおよびMySQLのスケーラビリティの制限


43

MySQLやPostgreSQLなどの非シャードリレーショナルデータベースのパフォーマンスは、10 TBを超えると「壊れる」と聞きました。

Netezza、Greenplum、Verticaなどでは思いつかないような制限が存在するのではないかと思いますが、これらの制限が定量化されている研究論文や正式なケーススタディに言及している人がいるかどうかを尋ねたいと思います。

回答:


52

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

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

一方、1TBのデータからモード(最も一般的な値)を取得しようとする場合、使用しているシステムは関係ありません。これは、シャーディングの有無にかかわらず痛みを伴います。(編集:シャーディングは、実際、この問題を悪化させる可能性があります。

MySQLとPostgreSQLで巨大なデータベースで遭遇する主な問題は、どちらもクエリ内並列処理をサポートしていないという事実に関係しています。言い換えれば、クエリは単一のスレッドによって単一のブロックとして実行され、断片に分割して個別に実行することはできません。多くの場合、これは大量のデータに対して大規模な分析クエリを実行する場合の問題です。ここで、Postgres-XCとGreen Plumがストレージを実行から分離し、コーディネーターレベルでこれを実行できるため、救助に出ます。Postgres-XCとGreen Plumは基本的に内部でシャーディングを使用しますが、コーディネーターはすべての一貫性をグローバルに適用することに注意してください。

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

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

そのため、サイズが1〜2 TBを超えると、システムとワークロードの間の多くのトレードオフに直面することになります。繰り返しになりますが、これはデータベース、ワーキングセットのサイズなどに固有です。ただし、この時点では、スノーフレークシステム、つまりワークロードに合わせてカスタマイズされたシステムを使用する必要があります。

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

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

ただし、基本事項(インデックス、自動バキューム、これらが低レベルでどのように機能するかなど)と十分なコンピューティングリソースに細心の注意を払うと、これらは完全に管理可能です(Pgで30TBの範囲内で十分管理できると推定されます)。

Edit2:一度100 TBに達すると、動作はデータセットによって異なります。PostgreSQLで最初にテーブルあたり32 TBの制限に達するため、この範囲にスケールしない1つに現在取り組んでいます。


2
Postgres 9.6には、クエリ内での並列処理の強化(並列seqスキャン、並列結合)が追加されるようです。
a_horse_with_no_name

1
これが本当に役立つようにするには、さらに2、3のリリースが必要だと思います。
クリストラバーズ

@ChrisTraversこの種の状況をより良くサポートする別のデータベースはありますか?おそらくRDBMSとは限りませんか?おかげで
konung

1
@konung私は正直であることを知らない。MapReduceエンジンを一定の規模で試してみる価値があると思います。これは、データに対する考え方を形作るのに役立つからです。非常に大規模な場合、自分が何をしているかを本当に知る必要があります。TeradataやPostgres-XLのようなソリューションは役立ちますが、彼らはあなたがしていることの明確な知識を必要とするソリューションです(そして、そこにあるRDBMS上に構築されたその時点でいつでも独自のものを構築できます)。
クリストラバーズ

1
また、Mongoを使用することをお勧めする理由の1つは、(おそらくそうであっても)拡張性がそれほど高くないにもかかわらず、その時点でフェデレーションデータとMapReduceについて考える方法を教えてくれるからです。
ラバーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.