1

ここに示すように、DC/OS 1.7 を使用して ArangoDB 3.0 クラスターをセットアップしています。

DC/OS 1.7 経由の ArangoDB 3.0 クラスター

この 3x co-ord、6x サーバーのセットアップで 2 つのクエリを試しました。各ノードには次の仕様があります。

  • 15 GB RAM (DC/OS を介して DB プライマリごとに 4 GB を割り当て)
  • 8コア
  • CoreOS

coinsコレクションに対するパフォーマンスをテストするために、2 つのクエリを試しました。インデックスは追加されませんでした。コレクションの構成は次のとおりです。

Wait for sync:  false
Type:   document
Status: loaded
Shards: 16
Replication factor: 1
Index buckets:  8

書く:

FOR i IN 1..1000000 INSERT {flip:RAND() > 0.5 ? 'h' : 't'} IN coins

結果:

13.894秒で実行

実行計画:

 Id   NodeType            Site          Est.   Comment
  1   SingletonNode       COOR             1   * ROOT
  2   CalculationNode     COOR             1     - LET #2 = 1 .. 1000000   /* range */   /* simple expression */
  3   EnumerateListNode   COOR       1000000     - FOR i IN #2   /* list iteration */
  4   CalculationNode     COOR       1000000       - LET #4 = { "flip" : ((RAND() > 0.5) ? "h" : "t") }   /* v8 expression */
  6   DistributeNode      COOR       1000000       - DISTRIBUTE
  7   RemoteNode          DBS        1000000       - REMOTE
  5   InsertNode          DBS              0       - INSERT #4 IN coins
  8   RemoteNode          COOR             0       - REMOTE
  9   GatherNode          COOR             0       - GATHER

Indexes used:
 none

Optimization rules applied:
 Id   RuleName
  1   remove-data-modification-out-variables
  2   distribute-in-cluster

Write query options:
 Option                   Value
 ignoreErrors             false
 waitForSync              false
 nullMeansRemove          false
 mergeObjects             true
 ignoreDocumentNotFound   false
 readCompleteInput        false

読んだ:

FOR coin IN coins COLLECT flip = coin.flip WITH COUNT INTO total RETURN {flip, total}

結果:

1.157秒で実行

実行計画:

 Id   NodeType                  Site          Est.   Comment
  1   SingletonNode             DBS              1   * ROOT
  2   EnumerateCollectionNode   DBS        1000000     - FOR coin IN coins   /* full collection scan */
  3   CalculationNode           DBS        1000000       - LET #3 = coin.`flip`   /* attribute expression */   /* collections used: coin : coins */
 10   RemoteNode                COOR       1000000       - REMOTE
 11   GatherNode                COOR       1000000       - GATHER
  4   CollectNode               COOR        800000       - COLLECT flip = #3 WITH COUNT INTO total   /* hash*/
  7   SortNode                  COOR        800000       - SORT flip ASC
  5   CalculationNode           COOR        800000       - LET #5 = { "flip" : flip, "total" : total }   /* simple expression */
  6   ReturnNode                COOR        800000       - RETURN #5

Indexes used:
 none

Optimization rules applied:
 Id   RuleName
  1   move-calculations-up
  2   move-calculations-down
  3   scatter-in-cluster
  4   distribute-filtercalc-to-cluster
  5   remove-unnecessary-remote-scatter

次に、コーディネーターを 1 台、サーバーを 1 台に縮小し、使用可能な RAM を 90GB / 48 コアから 15GB / 8 コアに減らしました。

書き込みと読み取りが何らかの違いを示すことを期待していました。同じクエリの結果を次に示します (コレクションを切り捨てて再実行した後)。

書く:

13.763秒で実行

読んだ:

1.127秒で実行

結果 - ほぼ同じ実行時間。

質問:

  • ある種のステップ re: 明示的複製が欠落していますか? (「シャードの再調整」を試みました - これにより、追加の DB サーバーの一部がフォロワーとしてラベル付けされましたが、実行速度に違いはありませんでした)

  • コレクションの構成は最適ですか? ドキュメントの「DBPrimary squared」の推奨事項に基づいて、16 個のシャードを選択しました (元のセットアップでは 4x サーバーを使用し、同等のパフォーマンスが得られました)。

  • 試したクエリは効果的にクラスター化できますか? 遠距離ループなど

  • クラスターが正しく構成されているかどうかをテストし、1x ノードと n ノードの読み取り/書き込みパフォーマンスの違いを明確に証明するサンプル クエリはありますか?

4

1 に答える 1

1

私はこれらの質問にいくらか光を当てることができると思います (ArangoDB のコア開発者の 1 人であり、分散モードを担当しています)。以下のコメントは、ArangoDB バージョン 3.0 を考慮しています。

3.0 以前の単一の AQL クエリは、単一のコーディネーターのみを使用します。したがって、より多くのコーディネーターをデプロイしても、書き込みクエリであろうと読み取りクエリであろうと、単一のクエリの速度は向上しません。

AQL はクラスター全体でデータ パイプラインを編成し、複数のコーディネーターを関与させることは難しいため、これを変更するのは非常に困難です。

クエリを作成する場合、現在、3.0 の関連するコレクションに排他的な書き込みロックが適用されています。したがって、シャードまたは DB サーバーを増やしても、AQL 書き込みクエリのパフォーマンスをスケールアップするのには役立ちません。3.1 でこの制限に取り組む予定ですが、これも特に簡単ではありません。

このブログ投稿で示されているように、DB サーバーとコーディネーターが増えると、(AQL を使用しない場合) 単一ドキュメントの読み取りと書き込みのスループットが高速化されます。したがって、新しいバッチ拡張機能を備えた標準ドキュメント API を使用すると、書き込みクエリをより高速に実行できる可能性があります。

AQL クエリを読み取る場合、一般に、より多くのサーバーを使用する場合、クエリを複数のシャード間で並列化できる場合、またはそのようなクエリのスループットを多数測定する場合に高速化が見られます。

集計を使用した特定の読み取りクエリについては、集計を個々のシャードに移動して結果を結合できる付随するインフラストラクチャを備えた AQL クエリ オプティマイザー ルールがありません。これは計画されていますが、3.0 ではまだ実装されていないため、読み取りクエリの速度向上は見られません。Explain 出力は、COLLECT とその SORT がコーディネーターで実行されるため、すべてのデータを単一のコーディネーターを介して移動する必要があることを示しています。

最初の質問に関しては、ここでもレプリケーションは役に立ちません。同期レプリケーションを設定すると、3.0 ではすべての読み取りと書き込みが各シャードの単一サーバーを経由します。したがって、この段階では、レプリケーション係数を高くしても読み取りパフォーマンスは向上しません。

適切なクラスター全体のトランザクションがあれば、この制限を回避できるようになります。これも計画されていますが、3.0 には含まれていません。

于 2016-06-29T13:11:54.643 に答える