Dgraph をいじってみた話
概要
国内ではあまり聞かないけど、海外ではかなり使用例の多い Graph DB のうち、分散システムへの強みを持った Dgraph をいじってみたので備忘録。
Dgraph とは
Graph DB の中でも、スケールや可用性などの分散システムにとってありがたみが多い物になる。一般的に Graph DB といえば neo4j あたりが一番有名な気がしていて、 Dgraph は公式で比較ブログを出している。
Neo4j vs Dgraph - The numbers speak for themselves - Dgraph Blog
2016年にリリースされて、まだまだ若いプロダクトだけど gRPC に対応していたり、GraphQL との相性が良さそうだったり、今後期待?の技術かもしれない。
構成
Dgraph は Alpha Zero Ratel という3つの異なるノードで構成されていて、それぞれのノードがそれぞれの役割を持っている
Alpha
ストレージへのアクセスを管理してくれるノードだと思われる。Zero
Alpha を管理するノードだと思われる。Ratel
スキーマを変更したり、クエリを投げたりできる UI を提供するノード。
クラスタ内部の話は ここら辺 に書かれている。どうも内部的には gRPC を用いてクラスタノード間でのやりとりを行っているようだから、外部からも gRPC を用いて処理を行うと相性が良さそう(特に stream )。
チュートリアル
docker image が存在するから、 pull してきてコンテナを立ち上げれば使えるようになる
# 必要なイメージを pull する docker pull dgraph/dgraph:latest docker pull dgraph/standalone:v20.03.1 # コンテナを立ち上げる docker run -it -p 6080:6080 -p 8080:8080 -p 9080:9080 -p 8000:8000 -v ~/dgraph:/dgraph dgraph/standalone:v20.03.1
これで立ち上がる。クラスタに入ってくるデータは ~/dgraph
に格納されていく。
これで localhost:8000
で Ratel へアクセス可能となるから、実際にいじっていけばいい。
公式チュートリアル, 対話式チュートリアル
使ってみた感じ
初期のデータベースからグラフモデルは確か存在してて、人間にとってわかりにくいモデルだったから関係モデルが生まれた背景があった気がする。だから、やっぱりスキーマ(グラフ構造)を考えるのがすごく難しい。Ratel では ERD のようなものを確認できるけど、これもやっぱり人間にはわかりにくい。また、あいまい検索をするとなるとどうしてもパフォーマンスが悪くなってしまうから、elasticsearch とかと組み合わせるといいかもしれない。検索性は facets があったりかなりいいと思う(他の graph を知らないけど)。