Neo4j v2.2 の性能/スケーリング関連の機能強化 ー webinar解説記事 ー #neo4j
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
今回の情報は、2015年3月26日に Neo Technology社で実施されたwebinarの解説記事です。
ビデオはこちらから https://vimeo.com/123422796
バージョン2.2で提供される機能強化に関するウェビナー
2.2リリースは性能とスケーラビリティの機能強化に力を入れている。
バージョン2.2で最も重要視されていた2つのポイント:早くする事!スケーラブルにする事!
CypherをNative Javaのスピードに追いつかせる事
過去のバージョンで最も指摘を受けてきた課題
内部のアーキテクチャに今回の機能強化では相当改造を入れている。
10倍〜100倍の性能アップを実現するための開発はかなり内部構造に及んでいる
リード性能改善:Cypherクエリーの機能強化
コストベース(負荷分析型)最適化機能:
今までは、データモデルに関わらず、画一的な検索パスを設定
いろんなモデルに適用できるようにするため、データモデルのドネーションも受け付けている
ほとんどの検索において最大100倍の性能向上を実現
クエリー性能向上のためのツールも提供
コストベース最適化ツール
従来の最適化は、クエリー内容に即したパス(ルールで指定)を辿って検索をしてきただけ。
これを、グラフデータの規模や構造を分析し、最適な検索モデルを自動作成する機能を開発
棒グラフは、音楽アプリのグラフデータベースに対する様々な検索パターンをかけたケース
検索によっては劇的な性能向上を見せている
クエリーのプランを可視化するツール
Neo4jのクエリーの最適化がどの程度達成できているのかを可視化
クエリーがどのような手順で進むのかを明示
この可視化によって、さらなるCypherクエリーの最適化、高速化を実現できる
Max De Marzi's blog post: http://maxdemarzi.com/2015/03/08/giving-neo4j-2-2-a-workout/
検索のプランを設計する際、「コストベース」にするか、「ルールベース」にするかを選択
Cypherはデフォルトとして最適な方を採用する
分析の結果、別の方法が良い場合は、マニュアルで変更可能
EXPLAINコマンドとPROFILEコマンド
EXPLAIN:
クエリーを走らせずに、クエリープランを参照できる
PROFILE:
クエリーを実際に走らせて結果を表示
文法は簡単で、Cypherのコマンドを指定するだけ
Readのスケーラビリティ
LRU (Least Recently Used)-K インメモリ ページ キャッシュ機能
自動的に設定される
OSが提供するメモリ マップI/O の代わりに提供される、グラフDBに特化したインメモリ ページ キャッシュ機能
マルチコアCPUのサーバでの大量の並列処理で効果を発揮
複数サーバでスケールアウトする手法ばかりではなく、スケールアップする手法として便利
従来のメモリアップI/Oの方法
OSがデータオブジェクトのキャッシュを管理
オブジェクトキャッシュがメモリマップを使う
大量の並列リードが発生すると、OSがボトルネックになってしまう
このOSの負担に対応するため、メモリとCPUの増強が必要だった
Neo4jの提供する新規インメモリ ページキャッシュ 機能
Neo4jがグラフDBに最適化されたメモリ管理を行い、ページキャッシュをメモリ上で提供
安定した性能スケールが保証
Writeのスケーラビリティ
従来の方法(v2.1以前)
Neo4jは書き込みをNeo4j内部のGraphトランザクションログに行う
その後、Indexトランザクションログに書き込み
書き込みはシーケンシャルに行われる
GraphとIndexに渡り、2フェーズコミットが行われトランザクションが完了
この処理が書き込み工程での最大の性能ネックとなっていた
v2.2での新しい書き込み処理
新規のWrite Bufferの開発、統一されたトランザクションログを採用
書き込み要求の平行処理とコミットが可能に
2フェーズコミットの制限と、トランザクションログのシーケンシャル処理の問題が一挙に解決
今後、次のボトルネック解消に取り組む方針
Neo4jブラウザーがデザインと機能のアップデートがなされ、提供
ここからは実機でのデモ!
サンプルデータを使ってCypherコーディングが実際に行うことができる環境
Movie Graph:映画タイトル/役者の関係柄のグラフ
簡単なクエリーを通して、Cypherの検索機能を実証
Bacon Path ==> Kevin Bacon(俳優)の出演している映画の検索
Northwind Graph:
スーパーの取扱商品の商品名/カテゴリー/サプライヤー/購入履歴のグラフ
RBDからCSV経由でデータとスキーマをインポートする機能も提供
同様にインポートした機能に対してCypherで検索可能
画面左:製品カタログをRDBからインポートする手段を説明
画面右:実際に発行するCypherコマンドを表示
グラフデータベースとRDBとの違い:グラフにはデータ間の「関係柄」が存在する
データのインポート後、データ(ノード)間の関係柄を生成する必要が有る(CREATE コマンド)
商品とカテゴリーの間の関係柄を設定するコマンド例
「関係柄」はRDBのテーブル間のJOINからも引用可能
グラフ化した後に、Cypherで様々なクエリーを行う事が可能
結果をグラフ表示可能
画面例:Longlife Tofuは頻繁に購入されている事が判明
Longlife Tofuの購入者の一人に注目
他にも多数の購入をしている事が判明
動的なビジュアライゼーションを通して、購入パターンをいろいろな角度から分析することが可能になる
各々のクエリーのプロファイルを分析することも可能
Cypherコマンドの前にPROFILEを記述
分析を通して、クエリー処理の中で最も処理時間を消費している部位を見いだす事が可能
困った時はいつでもHELPコマンドを通して情報を引き出すことが可能
Query Template を使用して、構造的にクエリー文を作成することができる
作成したクエリー文を実行して、それを表示することも可能
規模の大きいグラフデータベースになると、分析機能による検索の最適化が非常に重要になってくる
v2.2のダウンロードはこのリンクで:
Download Neo4j 2.2: http://neo4j.com/whats-new-in-neo4j-2-2/