view paper/chapter1.tex @ 25:67880a2ca650

Modfied chapter1.tex
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 25 Jan 2014 22:24:03 +0900
parents 5316b4791570
children 388cd4555b3d
line wrap: on
line source

\chapter{既存の分散データベース}

% 分散データベースとはなんなのか。
% データベースはなんなのかをいれないと。
% NoSQL の説明も必要。

この章ではまずデータベースの種類である RDB と NoSQL について述べる.
その次に, 既存の NoSQL データベースとして Cassandra, MongoDB, Neo4j について述べる.

\section{RDB と NoSQL}
データベースは大別すると RDB と NoSQL に分けられる.
RDB とは関係と関係の属性により表されるスキーマをデータ構造に持つデータベースである.
データベースアクセス言語として SQL 言語を持つ RDB は一台の PC でデータを扱う分には最適である.
しかし, RDB はマシン単体以上の処理性能をだすことができない.
そこで, 汎用的な PC をいくつも用意しデータや処理を分散して管理できるデータベースが求められた.
それらのデータベースは NoSQL(Not Only SQL) と呼ばれる.
NoSQL は, SQL を使用するデータベースには向いていない処理を行うことを目的にしている.

分散データベースは, NoSQL に分けられる.


\section{Cassandra}
Cassandra は2008年7月に Facebook によってオープンソースとして公開された Key-Value なデータベースである.
Amazon の Dynamo という分散キーバリューデータベースの影響を受けて作られている.
スキーマレスな NoSQL データベースになる.

Cassandra はサーバノードの配置にコンシステント・ハッシングアルゴリズムを用いる.
コンシステント・ハッシングによりノードは論理的にリング上に配置される.
リングには数値で表される位置がある.
データを書き込む際には, キーとなるハッシュ値に従いそのリングの位置から時計回りに近いサーバノードへと書き込まれる.
コンシステント・ハッシングを用いることで, ノードの数が増減した場合に, 再配置をしなくてもよいという利点がある.
データの偏りにより少数のサーバへの負荷が大きい場合に, 負荷が高いハッシュ値が指すリング上に
新たなノードを追加することで負荷を下げるといった手段もとれる.

データを最大どれだけ配置するかを示すレプリケーションファクタと, データの読み書きをいくつのノードから
行うのかを決めるコンシステンシーレベルを設定できる.
コンシステンシーレベルには主に ONE, QUORAM, ALL がある.
レプリケーションファクタの数値を N とした場合, ONE は1つのノード, QUORUM は N/2 + 1 のノード, ALL は N のノード
へと読み書きを行う.
コンシステンシーハッシング, レプリケーションファクタとコンシステンシーレベルの設定により Cassandra は
高い可用性と分断耐性を持つ.

% keyspace, super column といったデータの表現についても述べるべきか?
% レプリケーションファクタはkeyspace毎に設定できる

\section{MongoDB}
MongoDB は2009年に公開された NoSQL のデータベースである.
JSON フォーマットのドキュメントデータベースであり, これはスキーマが無い
リレーショナルテーブルに例えられる.
スキーマが無いため, 事前にデータの定義を行う必要がない.
そのためリレーショナルデータベースに比べてデータの追加・削除
が行いやすい.

MongoDB は保存したデータを複数のサーバに複製をとる(replicate).
これはレプリケーション(replication)と呼ばれる.
また, 1つのサーバが全てのデータを持つのでなく, ある範囲の値を別々の
サーバに分割(シャード)させて保持する.
これをシャーディング(sharding)という.
MongoDB はレプリケーションとシャーディングにより分散データベースとして機能する.

% クエリ言語として JavaScript を採用しており, 演算子を自分作れるという利点を持つ.
% スペルミスに弱い

\section{Neo4j}
No4j は, グラフデータベースと呼ばれる NoSQL のデータベースである.
データをグラフとして保存する.
グラフはノードとリレーションシップにより表され, それぞれがプロパティを持つことができる.
リレーションシップはグラフでいうところのエッジにあたる.
ノードからリレーションシップを辿り, 各プロパティをみることでデータの取得を行うことができる.
通常データベースでは, データの取り出しに価の結合や条件の判定を行う.
だが, グラフデータベースグラフはどれだけデータが大きくなろうがノードからノードへの移動は1ステップですむ.
そのため, どれだけデータが大きくなろうと, データが小さい時と同じ計算量でデータの取得が行える.

Neo4j はマスターとスレーブの関係になるクラスタを構成することで分散データベースとして機能する.
マスターに書かれたデータはスレーブに書き込まれるが, すぐに全てのスレーブに書き込まれるわけではない.
したがってデータの整合性が失われる危険がある.
スレーブサーバは現在保持しているデータを返すことができる.
それにより高い読み取り性能の要求に答えることができる高可用性を実現している.