ablog

不器用で落着きのない技術者のメモ

KVSやNoSQLについて

一口にKVSやNoSQLといってもたくさんの種類があるので一概に言えないが、特定の用途に特化したソフトウェアで、F1マシンや競技用自転車みたいなイメージ。レースではめっぽう強いが、汎用的に使うには不便なところもある。特定の用途に特化しているので汎用的である必要がないが、それを理解せずに使ってしまうと不便なことになってしまう。

Key Value Store の名の通り、キーを使って大量のデータの中から目的のデータに効率よくアクセスできる。そういうデータ構造と探索アルゴリズムを使っているので。RDBMSはデータ構造とアルゴリズムのデパートみたいなもので、なんでも揃っているがその分のオーバーヘッドもかかる。それに比べて、KVSは特定の用途に合わせて機能やデータ構造、アルゴリズムを絞っているので非常に高速にアクセスすることができる。

RDBMS で単一表からPKを使ってアクセスするのはキーを使って必要なデータを最小限のコストで取得するが、KVS はそれだけに特化していいるので軽く速く作られている。

そして、キーと値のペアでデータを管理しているので、複数のノードに分散させて、ノード内で完結させることができる。あるキーのデータを取得する場合、一つのノードだけ見れば良いので、高速に処理することができる。一部のデータが他のノードにあって転送しなければいけないと、ネットワーク通信が発生するので遅くなる。当然、単一ホスト内で完結する処理より遅くなる。このように、キーで複数ノードに分散させやすい点はKVSの強いところだと思う。マルチプロセッサシステムでも複数ノードからなるクラスターでもプロセッサやノードの間で処理が直列化したり、協調が必要なところがボトルネックになる。

RDBMSを使ったクラスタでJOINがボトルネックになりやすいのは、JOINされるデータが別々のノードに存在する場合にノード間でデータ転送が発生するから。単一ノード内であればメモリ(ディスク)上のデータを取得するだけだが、別のノードにあると通信してデータを転送しないといけなくなる。プロセッサやノードを複数並べて並列処理を行う場合はプロセッサ間やノード間で処理を直列化させずにいかに並列処理をさせるかがポイントになる。

KVSにおいても、適切なデータ構造を使っていかに効率的に探索するか、いかにディスクI/O*1を抑えるかといったアプローチはRDBMSやISAMやVSAMなど過去の技術と同じだと思う。

新しい技術や流行の技術を評価するには、本質やメリット・デメリットを理解しておく必要があると思う。今後、KVSやNoSQLもRDBMSも適材適所で使い分けられてどちらも使われ続けると思う。

細かい定義とか気にせず、妄想のおむむくままにワイルドに書いてしまった。

*1:メモリ上で完結するものありますが