fbpx

Neo4j v2.2 の性能/スケーリング関連の機能強化  ー webinar解説記事 ー #neo4j

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

今回の情報は、2015年3月26日に Neo Technology社で実施されたwebinarの解説記事です。
ビデオはこちらから https://vimeo.com/123422796

55d3ab28-1668-4451-bd21-c1f4d83e0b14

バージョン2.2で提供される機能強化に関するウェビナー
2.2リリースは性能とスケーラビリティの機能強化に力を入れている。

A33BA1AD-25F7-4BDA-AB34-2FA506025A9D

バージョン2.2で最も重要視されていた2つのポイント:早くする事!スケーラブルにする事!
CypherをNative Javaのスピードに追いつかせる事
過去のバージョンで最も指摘を受けてきた課題
内部のアーキテクチャに今回の機能強化では相当改造を入れている。
10倍〜100倍の性能アップを実現するための開発はかなり内部構造に及んでいる

3a400d83-1d01-4fd8-9789-9890a6591a11

リード性能改善:Cypherクエリーの機能強化
コストベース(負荷分析型)最適化機能:
今までは、データモデルに関わらず、画一的な検索パスを設定
いろんなモデルに適用できるようにするため、データモデルのドネーションも受け付けている
ほとんどの検索において最大100倍の性能向上を実現
クエリー性能向上のためのツールも提供

96f4a1d8-140d-422a-a782-9875b9215ef4

コストベース最適化ツール
従来の最適化は、クエリー内容に即したパス(ルールで指定)を辿って検索をしてきただけ。
これを、グラフデータの規模や構造を分析し、最適な検索モデルを自動作成する機能を開発
棒グラフは、音楽アプリのグラフデータベースに対する様々な検索パターンをかけたケース
検索によっては劇的な性能向上を見せている

3bf31e79-f19c-4a28-9b02-b56490417117

クエリーのプランを可視化するツール
Neo4jのクエリーの最適化がどの程度達成できているのかを可視化
クエリーがどのような手順で進むのかを明示
この可視化によって、さらなるCypherクエリーの最適化、高速化を実現できる

Max De Marzi's blog post: http://maxdemarzi.com/2015/03/08/giving-neo4j-2-2-a-workout/

9a424f38-f66f-4b97-971d-a4c4c0d92f81

検索のプランを設計する際、「コストベース」にするか、「ルールベース」にするかを選択
Cypherはデフォルトとして最適な方を採用する
分析の結果、別の方法が良い場合は、マニュアルで変更可能

0bc9147d-a8e3-47af-9fb1-a06ba928d26c

EXPLAINコマンドとPROFILEコマンド
EXPLAIN:
クエリーを走らせずに、クエリープランを参照できる
PROFILE:
クエリーを実際に走らせて結果を表示
文法は簡単で、Cypherのコマンドを指定するだけ

8c0f8ae3-e17d-4501-b517-4b4ce18f4590

Readのスケーラビリティ
LRU (Least Recently Used)-K インメモリ ページ キャッシュ機能
自動的に設定される
OSが提供するメモリ マップI/O の代わりに提供される、グラフDBに特化したインメモリ ページ キャッシュ機能
マルチコアCPUのサーバでの大量の並列処理で効果を発揮
複数サーバでスケールアウトする手法ばかりではなく、スケールアップする手法として便利

33d75818-ccfc-40bc-b530-f8617cbb11d1

従来のメモリアップI/Oの方法
OSがデータオブジェクトのキャッシュを管理
オブジェクトキャッシュがメモリマップを使う
大量の並列リードが発生すると、OSがボトルネックになってしまう
このOSの負担に対応するため、メモリとCPUの増強が必要だった

52500411-3a6f-4f26-b541-62a78dbf5fa0

Neo4jの提供する新規インメモリ ページキャッシュ 機能
Neo4jがグラフDBに最適化されたメモリ管理を行い、ページキャッシュをメモリ上で提供
安定した性能スケールが保証

a2e0fd21-560a-41ed-a1c8-3d9a55fef5fa

Writeのスケーラビリティ
従来の方法(v2.1以前)
Neo4jは書き込みをNeo4j内部のGraphトランザクションログに行う
その後、Indexトランザクションログに書き込み
書き込みはシーケンシャルに行われる
GraphとIndexに渡り、2フェーズコミットが行われトランザクションが完了
この処理が書き込み工程での最大の性能ネックとなっていた

199108a2-f253-4ac2-add3-b123d014e90e

v2.2での新しい書き込み処理
新規のWrite Bufferの開発、統一されたトランザクションログを採用
書き込み要求の平行処理とコミットが可能に
2フェーズコミットの制限と、トランザクションログのシーケンシャル処理の問題が一挙に解決
今後、次のボトルネック解消に取り組む方針

daa18223-1437-4114-94f6-b03073ed5948

Neo4jブラウザーがデザインと機能のアップデートがなされ、提供
ここからは実機でのデモ!

65b59717-1432-41ff-8c40-714663d93e9d

サンプルデータを使ってCypherコーディングが実際に行うことができる環境
Movie Graph:映画タイトル/役者の関係柄のグラフ
簡単なクエリーを通して、Cypherの検索機能を実証
Bacon Path ==> Kevin Bacon(俳優)の出演している映画の検索
Northwind Graph:
スーパーの取扱商品の商品名/カテゴリー/サプライヤー/購入履歴のグラフ
RBDからCSV経由でデータとスキーマをインポートする機能も提供
同様にインポートした機能に対してCypherで検索可能

7865ac0e-d2e5-45cb-a4b5-fc65ec02d046

画面左:製品カタログをRDBからインポートする手段を説明
画面右:実際に発行するCypherコマンドを表示

10550de2-189a-4d1e-8917-cd762dccba3f

グラフデータベースとRDBとの違い:グラフにはデータ間の「関係柄」が存在する
データのインポート後、データ(ノード)間の関係柄を生成する必要が有る(CREATE コマンド)

31aa3854-c001-4b33-aab7-fa7d314edf88

商品とカテゴリーの間の関係柄を設定するコマンド例

74d741fd-3b50-44f7-8867-1209c6ee97e5

「関係柄」はRDBのテーブル間のJOINからも引用可能

a4020fff-58d6-42ea-a189-563d74e33b90

グラフ化した後に、Cypherで様々なクエリーを行う事が可能
結果をグラフ表示可能
画面例:Longlife Tofuは頻繁に購入されている事が判明

52532ff7-8e29-484b-a913-3a91f80af20a

Longlife Tofuの購入者の一人に注目
他にも多数の購入をしている事が判明
動的なビジュアライゼーションを通して、購入パターンをいろいろな角度から分析することが可能になる

f15aed14-743f-43e9-b49f-88801faaa373

各々のクエリーのプロファイルを分析することも可能
Cypherコマンドの前にPROFILEを記述
分析を通して、クエリー処理の中で最も処理時間を消費している部位を見いだす事が可能

b4b6028b-38fe-408e-9c04-6a214ee8b7bc

困った時はいつでもHELPコマンドを通して情報を引き出すことが可能

09573d3d-5269-4d5b-8392-93e231d2c9c8

Query Template を使用して、構造的にクエリー文を作成することができる

7820534c-b088-44cf-a22b-9b2d49a2bfd3

作成したクエリー文を実行して、それを表示することも可能

460794b1-7ab8-44d9-8949-e70e05279139

規模の大きいグラフデータベースになると、分析機能による検索の最適化が非常に重要になってくる

v2.2のダウンロードはこのリンクで:
Download Neo4j 2.2: http://neo4j.com/whats-new-in-neo4j-2-2/

新規CTA