DSE Graphの構成

DSE Graphを構成します。

DSE Graphの構成を調整すると、プロダクション環境のパフォーマンスを保護および向上しながら、開発に使いやすい環境を作成できます。graphデータベースとのアプリケーションの相互作用に影響を与える構成もあれば、DSE内の内部処理に影響を与える構成もあります。さらに、DSE Graphのセキュリティ保護は重要な結果をもたらし、多くの構成設定でクラスター運用のセキュリティを高めることができます。開発を行うか、プロダクションを実装するかにかかわらず、構成に関する十分な知識が不可欠です。

一般的なDSE Graph設定

DSE Graphのコア機能に影響する設定。

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml

dse.yaml Graphオプション

DSE Graphは、dse.yamlのDSE Graph用のクラスター全体のオプションgraph:キーとgremlin-server:キーの下に格納します。変更する一般的なオプションのほとんどは、以下のセクションで説明されています。特に注意することとして、dse.yamlファイルのGremlin Serverオプションでグラフ・サンドボックスが構成されます。この機能はデフォルトで有効になっており、JVM内での悪意のある攻撃から保護します。

dse.yaml 設定を変更するには、クラスター内の各ノードでファイルを変更し、各ノードを再起動します。dse.yamlでの設定は、対象としているノードのシステム・レベルです。dse.yamlファイルは、OpsCenterを使用して変更することもできます。もう1つの方法は、スキーマAPI構成で説明されている、グラフごとにオプションを設定することです。

remote.yaml Gremlin Consoleオプション

remote.yamlファイルは、GremlinサーバーへのDSE Graph Gremlin Console接続の主要な構成ファイルです。ほとんどのオプションは、自明です。特に、DSE Graphで分析OLAPクエリーを使用している場合は、このファイルに変更が必要なことに注意してください。

レプリケーション係数

グラフのレプリケーション係数(RF)とシステム・レプリケーション係数(システムRF)は、DSEでの読み取りと書き込みのパフォーマンスに影響を与える可能性があります。DSEデータベースと同様に、これらの要因によって、分散グラフ・データベースが複数のノードに格納するデータのレプリカの数が制御されます。

グラフごとに2つのキースペースが作成されます。グラフ・キースペースにはデータが格納され、graph_systemキースペースにはDSE Graph操作に不可欠な情報が格納されます。レプリケーション係数とシステム・レプリケーション係数に設定されるデフォルト値は、グラフが作成される時の各データ・センター内のノード数によって異なります。
データ・センターごとのノード数 グラフのレプリケーション係数 グラフのシステム・レプリケーション係数
1 1 1
2 2 2
3 3 3
4 3 4
5以上 3 5
詳細については、グラフ・システムAPI:「レプリケーション係数」および「システム・レプリケーション係数」を参照してください。

Consistency_mode、datacenter_id、read_consistency、およびwrite_consistency

DSE Graphの整合性レベルは、グラフ操作とDSEデータベース操作の両方で制御されます。consistency_mode設定はグラフ操作を構成し、read_consistencywrite_consistency設定はDSEデータベースの読み取り操作と書き込み操作のGraphトランザクション内での整合性レベルを構成します。

consistency_mode(デフォルト:GLOBAL)は、ユーザー定義の頂点IDに適しています。自動生成頂点IDが使用される場合、この設定は、datacenter_id設定に行われた同時変更とともに、DC_LOCALに変更できます。consistency_modedatacenter_idの両方は、クラスターのすべてのノードで構成される必要があります。consistency_modeGLOBALに設定されていると、datacenter_id設定は無視されます。
警告: これらのオプションは、クラスター内のすべてのノードのdse.yamlファイルで同じ値に設定する必要があり、クラスターの実行中に設定した場合は有効になりません。

Gremlinクエリーは、探索を介してグラフ・データを挿入し、読み取り、および更新するCQLコマンドを実行するため、DSEデータベースの整合性レベル設定がグラフ操作の実行に影響を与える可能性があります。ユーザー定義の頂点IDの読み取りまたは書き込みの整合性レベルは、一般にグラフごとに、read_consistency(デフォルト:ONE)およびwrite_consistency(デフォルト:LOCAL_QUORUM)設定を使用して設定できます。グラフ探索で検索インデックスを使用する場合、read_consistencyは複数データ・センター・クラスターでLOCAL_ONEに設定されます。このオプションはスキーマAPIを使用して設定されます。

schema_mode

データにアクセスするには、次の2つの構成項目が重要です。schema_modeallow_scanです。

schema_mode設定には、自動スキーマ作成が許可されるかどうかを識別する2つの選択肢があります。
  • Development:グラフ・スキーマAPIを使用してグラフ・スキーマを明示的に指定する前に、グラフ・データを読み込むことができます
  • Production(デフォルト):グラフ・データを読み込む前に明示的なグラフ・スキーマが必要です
schema_mode設定には、Production値がデフォルトとしてハード・コーディングされており、次のいずれかによってオーバーライドできます。
  • dse.yamlファイルのオプションを含める:schema_mode: Development
  • グラフレベル・コマンドを使用する: schema.config().option('schema_mode').set('Development')
グラフ・アプリケーションを設計するためにデータを探索する場合、設定schema_mode: Developmentは、使用するグラフ・スキーマを検出するのに役立ちます。ただし、設定schema_mode: Productionは、ランダム・スキーマの作成を防ぐために、開発が完了した後、重要です。
注: schema_modeおよびallow_scanのデフォルトの設定は、既定の操作が制約の厳しい環境に適合するように、開発用ではなくプロダクション用に設定されています。
これらの2つの設定の現在の値を検出するために、次の3つの便利なコマンドを使用できます。
  • schema.getEffectiveSchemaMode():ハード・コーディングされた値、dse.yaml値(指定されている場合)、および設定されているかもしれないグラフレベル設定をチェックします。
  • schema.getEffectiveAllowScan():ハード・コーディングされた値、dse.yaml値(指定されている場合)、および設定されているかもしれないグラフレベル設定をチェックします。
  • graph.getEffectiveAllowScan():ハード・コーディングされた値、dse.yaml値(指定されている場合)、設定されているかもしれないグラフレベル設定、およびトランザクション・レベル設定をチェックします。

DSE Graphのセキュリティ設定

DSE Graphのセキュリティに影響する設定。

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml

Graphサンドボックスおよびホワイトリスト/ブラックリスト登録されたコード

DSE Graphサンドボックスは、gremlin-server:キーの下の dse.yaml ファイルで構成され、デフォルトで有効になっています。このセキュリティ機能により、DSEインスタンスに損害を与える可能性のあるJVMでの悪意のあるコードの実行を阻止します。サンドボックス・ルールは、ブラックリスト(実行禁止)とホワイトリスト(実行許可)の両方のパッケージ、スーパークラスおよびタイプに定義されています。Gremlin Consoleに入力されたJava/Groovyコードの場合、指定されて許可された操作のみが実行されます。dse.yamlファイルのデフォルトのサンドボックス・ルールはオーバーライドされる場合があります。サンドボックス・ルールは以下の順で適用されます。
  1. blacklist_supers(リスト項目を実装または拡張するすべてのクラスを含む)
  2. blacklist_packages(すべてのサブパッケージを含む)
  3. whitelist_packages(すべてのサブパッケージを含む)
  4. whitelist_types(サブクラスは含まず、指定されたタイプのみを含む)
  5. whitelist_supers(リスト項目を実装または拡張するすべてのクラスを含む)
ホワイトリストで指定されていないタイプはすべて、デフォルトでブロックされます。項目がブラックリストに登録されている場合は、ブラックリストから削除されない限り、その項目をホワイトリストに入れることはできません。エラーが発生し、その項目がブロックされます。
重要: 次の2つのクラスはブラックリストとしてハードコードされており、ホワイトリストに登録することはできません。
  • java.lang.System:currentTimeMillisとnanoTime以外のすべてのメソッドはブロックされます(ブラックリストに登録)。
  • java.lang.Thread:currentThread().isInterruptedは、toStringを使用してラップされたスレッドを返すことができる許可されたメソッドで、sleepは別の許可されたメソッドであり、他のすべてのメソッドは許可されません。
dse.yamlファイルのgremlin_serverセクションにおいて、ホワイトリストとブラックリストに登録されている可能性のある項目の例を以下に示します。
gremlin_server:
     port: 8182
     threadPoolWorker: 2
     gremlinPool: 0
        scriptEngines:
            gremlin-groovy:
                config:
 #                  sandbox_enabled: false
                       sandbox_rules:
                            whitelist_packages:
                            - org.apache.tinkerpop.gremlin.process
                            - java.nio
                        whitelist_types:
                            - java.lang.String
                            - java.lang.Boolean
                            - com.datastax.bdp.graph.spark.SparkSnapshotBuilderImpl
                            - com.datastax.dse.graph.api.predicates.Search
                        whitelist_supers:
                            - groovy.lang.Script
                            - java.lang.Number
                            - java.util.Map
                            - org.apache.tinkerpop.gremlin.process.computer.GraphComputer
                        blacklist_packages:
                            - java.io
                            - org.apache.tinkerpop.gremlin.structure.io
                            - org.apache.tinkerpop.gremlin.groovy.jsr223
                            - java.nio.channels

フルーエントAPIは、許可できる操作を制限して実行のセキュリティを高めますが、サンドボックスを使用してlambda関数を有効にします。

認証、承認、および暗号化

DSEは、ユーザーによるアクセスの認証または承認、格納されたデータの暗号化によるセキュリティ保護、またはグラフ頂点ラベルまたはグラフに基づく(該当する場合)、SSLを使用したGremlin Consoleのセキュリティ保護ができます。

DSE Graphのセキュリティは、DSEのセキュリティにより管理されます。DSE Graphでは、Gremlin Consoleを安全に使用するために構成を変更する、dse.yamlファイルのgremlin-server:キーでGraphサンドボックスを変更するなど、独自の構成をいくつか行う必要があります。

DSE Graphは、DSE監査を使用した監査もサポートしています。「データベース監査の設定」を参照してください。

lambdaの制限

lambda制限は、Gremlin探索での任意のコード実行をブロックするためにデフォルトで有効になっています。ほとんどのアプリケーションでは、ユーザー定義のlambda関数を必要としません。lambda関数が必要な場合は、スキーマAPIを使用してlambda制限を無効にして、restrict_lambda(デフォルト:true)オプションを変更します。
ヒント: lambda関数の詳細については、Apache TinkerPopのドキュメントを参照してください。

DSE Graphの探索パフォーマンス設定

DSE Graphの探索パフォーマンスに影響する設定。

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml

allow_scan

データにアクセスするには、次の2つの構成項目が重要です。schema_modeallow_scanです。

allow_scan設定は、クラスター全体の完全なスキャンが許可されるかどうかを識別するブーリアン値の設定です。
  • TRUE:任意のグラフ・クエリーでクラスターの完全なスキャンを許可します。CQLクエリーでのALLOW FILTERINGと同様です。開発中は便利ですが、完全なスキャンを許可すると、1つ以上のテーブルに対してコストのかかる線形スキャンを行うクエリーが実行される可能性があります。
  • FALSE(デフォルト):クラスター全体のデータのサブセットに対する制限が含まれていない場合、クエリーは実行されません。
allow_scan設定にはデフォルトでFALSE値がハード・コーディングされており、以下の操作のいずれかを行うことにより、TRUE値にオーバーライドできます。
グラフ・アプリケーションを設計するためにデータを探索する場合、allow_scan: trueに設定すると、すべてを探索することが可能になり、g.V()のように非常に広範なクエリーを使用して小さいテスト・データセットでそれらの関係を可視化できます。ただし、完全なスキャンで探索を実行すると時間がかかりすぎるため、開発が完了した後はallow_scan: falseが適切な設定であることに注意してください。
注: schema_modeおよびallow_scanのデフォルトの設定は、既定の操作が制約の厳しい環境に適合するように、開発用ではなくプロダクション用に設定されています。
これらの2つの設定の現在の値を検出するために、次の3つの便利なコマンドを使用できます。
  • schema.getEffectiveSchemaMode():ハード・コーディングされた値、dse.yaml値(指定されている場合)、および設定されているかもしれないグラフレベル設定をチェックします。
  • schema.getEffectiveAllowScan():ハード・コーディングされた値、dse.yaml値(指定されている場合)、および設定されているかもしれないグラフレベル設定をチェックします。
  • graph.getEffectiveAllowScan():ハード・コーディングされた値、dse.yaml値(指定されている場合)、設定されているかもしれないグラフレベル設定、およびトランザクション・レベル設定をチェックします。

cache

キャッシュは、追加のメモリーを使用して中間結果を格納し、クエリーの完了までの時間を短縮することでDSE Graphのパフォーマンスを向上させることができます。DSE Graphには、次の2つのキャッシュがあります。
  • 隣接キャッシュ:頂点のプロパティとそれらの頂点のインシデント・エッジのプロパティを格納します。
  • インデックス・キャッシュ:hasLabel()またはhas() stepなどのグローバル・インデックスを含むグラフ探索の結果を格納します。
キャッシュはデフォルトで有効になっています。スキーマAPI設定cache(デフォルト:true)を使用してキャッシュを無効にできます。さらに、隣接キャッシュとインデックス・キャッシュの両方に、変更可能な設定があります。
1. DSE Graphのキャッシュ
キャッシュ設定 デフォルト 場所 説明
vertex_cache_size 10000l スキーマAPIで設定します。 最近使用した頂点のトランザクションレベル・キャッシュの最大サイズ。
adjacency_cache_clean_rate 1024 dse.yaml 各グラフの隣接キャッシュから1秒あたりに消去する古い行の数。
adjacency_cache_max_entry_size_in_mb 0 dse.yaml 各グラフの隣接キャッシュの最大エントリー・サイズ。
adjacency_cache_size_in_mb 128 dse.yaml 各グラフの隣接(エッジおよびプロパティ)キャッシュに割り当てるRAMの容量。
index_cache_clean_rate 1024 dse.yaml インデックス隣接キャッシュから1秒あたりに消去する古いエントリーの数。
index_cache_max_entry_size_in_mb 0 dse.yaml インデックス隣接キャッシュの最大エントリー・サイズ。ゼロに設定すると、キャッシュ・サイズとCPU数に基づいてデフォルトが計算されます。

タイムアウト

タイムアウト設定は、クライアント側とサーバー側の両方で、さまざまな方法でDSE Graphの障害の原因になる可能性があります。クライアント側では、Gremlin Consoleからのコマンドが、Gremlinサーバーに到達する前にタイムアウトになる可能性があります。Gremlin Consoleでコマンド:remote config timeout noneを発行すると、デフォルトの最大タイムアウト3分を時間制限なしにオーバーライドできます。Gremlin Consoleに入力された要求はGremlinサーバーに送信され、Consoleは、要求を中止してユーザーに制御を返す前に応答を待機します。タイムアウトがnoneに変更されると、要求は決してタイムアウトしません。これは、複雑な探索や大規模なデータセットの場合に、サーバーに要求を送信して戻るまでにかかる時間がデフォルトのタイムアウトよりも長い場合に便利です。

サーバー側では、クラスター全体のタイムアウト設定、realtime_evaluation_timeout_in_seconds(デフォルト:30秒)またはanalytic_evaluation_timeout_in_minutes (デフォルト:1008分)は、それぞれ、OLTP探索またはOLAP探索が評価されるのを待機する最大時間になります。これらの設定は、dse.yamlファイルに設定されています。探索評価のタイムアウト動作を特定のグラフに対してオーバーライドする必要がある場合、evaluation_timeoutをグラフごとに設定して、OLTPまたはOLAP探索評価タイムアウトのいずれかをオーバーライドできます。複雑な探索が実行中にタイムアウトする場合は、適切なタイムアウト設定に変更するとエラーが修正されます。

dse.yamlファイルで調整できる追加のサーバー側設定は、schema_agreement_timeout_in_ms(30秒)で、スキーマを変更する際にスキーマ・バージョンがクラスター全体で合意するのを待機する最大時間です。特にインデックスが定義されている大きなスキーマがクラスターに送信される場合、データがグラフに送信される前にこの設定で調整が必要になる場合があります。

最後に、dse.yamlファイルで、system_evaluation_timeout_in_seconds(デフォルト:180秒)が、グラフ・システムが評価を要求するのを待つ最大時間として定義されます。グラフの作成または削除は、この設定の影響を受けるシステム要求であり、他のタイムアウト・オプションとは相互作用しません。

2. DSE Graphのタイムアウト
タイムアウト デフォルト 影響
:remote config timeout none 3分 Gremlin ConsoleからGremlinサーバーへのコマンド転送がタイムアウトする場合は、長くします。
realtime_evaluation_timeout_in_seconds 30秒 OLTP探索評価がタイムアウトする場合は、長くします。
analytic_evaluation_timeout_in_minutes 1008分 OLAP探索評価がタイムアウトする場合は、長くします。
evaluation_timeout なし グラフごとに設定して、OLTPまたはOLAP探索評価タイムアウトをオーバーライドします。
schema_agreement_timeout_in_ms 30秒 大きなスキーマが、特にインデックス付きで送信される場合は、長くします。
system_evaluation_timeout_in_seconds 180秒 グラフ・システム要求が完了しない場合は、長くします。

external_vertex_verify and internal_vertex_verify

これらの設定により、正確性の検証と読み込みパフォーマンスの向上との間のトレードオフが可能になります。たとえば、ユーザー定義の頂点ID external_vertex_verify(デフォルト:true)または自動生成頂点ID internal_vertex_verify(デフォルト:false)を持つ大きなデータセットを読み込む場合、これらのオプションは重要です。データがまだない新しいクリーンなグラフがあり、データに含まれる頂点IDがグラフに既に存在するかどうかを確認しない場合は、該当するオプションをfalseに設定し、DSE Graph Loaderによるデータの読み込みを高速化します。もちろん、データが既にあり、新しく読み込んだデータセットで上書きしない場合は、該当するオプションにtrue値を使用する必要があります。

tx_autostart and max_query_queue

大きなGraphSONファイルを読み込む場合、tx_autostartを使用すると、読み込み中に10,000要素に到達すると、クエリーで自動的に新しいトランザクションを開始できます。大きなファイルを読み込むときに制限を回避するもう1つの有効な方法は、ノード・システム・レベルでの制限を削除するようにmax_query_queuedse.yaml ファイルで構成することです。