Greenplum DBのシステム構成
ここで、Greenplum DBのシステム構成を見ていきましょう。Greenplum DBのシェアードナッシングアーキテクチャでは、データはセグメントという単位で分割されてそれぞれが独立したRDBMSプロセスで管理されます。システム内に複数用意するセグメントサーバと呼ばれるサーバはそれぞれが1つもしくは複数のセグメントを収容し、高い帯域幅で接続されたディスクにデータを格納します。クライアントから発行されたクエリは、システム内に1つだけ存在するマスターサーバと呼ばれるサーバで受け付けられ、システム構成やデータ配置などの情報をもとに効率的に並列実行がなされるようにクエリ実行プランが生成されます。実行プランは各セグメントサーバに送られ、セグメントサーバは並列にすべてのディスク接続を最大限活用しながら処理を実行し、なおかつネットワークインターコネクトを介して必要なデータがやり取りされます。最終的に処理結果はマスターサーバに集約されクライアントに返されます。
Greenplum DBは完全なソフトウェア製品であるため、汎用のx86アークテクチャサーバやネットワークスイッチを使用してシステムを構成します。システム全体で最大限の性能を発揮させるには、ハードウェアの構成のバランスが重要なポイントになります。上で述べたように、高いI/O帯域幅を確保するために数台~十数台のサーバ内蔵ハードディスクを接続したり、高速なセグメントサーバ間の通信を行うためにギガビットもしくは10ギガビットイーサーネットを二重で接続したりするのが一般的です。
性能がスケールアウトするしくみ
シェアードナッシングアーキテクチャにおいては、その名前が示す通りサーバ間のデータの共有はなく、処理は各サーバで独立して実行されます。一般的には各サーバは高いI/O帯域幅を持つローカルディスクに接続するように構成されるため、バックプレーンのSAN接続の共有ストレージに対するアクセスの輻輳に引っ張られることなく、最大限にハードウェアの能力を生かしきることができます。そのため、BIや分析アプリケーションのようなワークロードでは、ノードを増やした分だけ性能がスケールしていきます。
データの分散と並列スキャン
それでは、効率的な並列処理を行わせるために、ユーザーは何か特別な考慮をする必要があるのでしょうか。Greenplum DBでユーザーが考慮すべきことはただ一つ、テーブル定義の際に1つまたは複数のカラムを「ハッシュ分散」キーとして指定することです。このテーブルに対してデータの各行が挿入される際に、システムは指定されたカラムの値からハッシュ値を計算し、これをもとにどのセグメントサーバにそのデータを配置するかを決定します。ハッシュ分散キーの選び方にもよりますが、たいていのケースでは結果としてすべてのセグメントサーバに渡って均等にデータの各行が格納されるはずです。
--ハッシュ分散キーの指定 CREATE TABLE products ( product_no integer, name text, price numeric ) DISTRIBUTED BY (product_no);
一旦このようにシステムにデータが入ってしまえば、データベースシステムが効率的な並列処理を自動で行ってくれるので、ユーザーは意識すること無く汎用RDBとまったく同じクエリを高速に実行することができます。テーブルスキャンは各セグメントでそれぞれが所有する部分に対して並列で行われるため、シーケンシャルなテーブルスキャンと比較して大幅に短い時間で完了します。ユーザーは性能を向上させるために細かいチューニングに多大な労力をかける必要はもはやなくなります。