NoSQL(1) Key-Valueストア型データベース

Image from Gyazo

NoSQL

NoSQLとは,リレーショナルデータベース以外のデータベースの総称です. このNoSQLという用語は,2009年にEric Evans氏によって提唱されました. 当初は「特に考えることもなく名前を思いついた」と述べています. しかし, No という表現がネガティブな印象を与えることから, 現在は Not Only SQL の略と考えることが望ましいと考えられています.

NoSQLの主な用途は,リレーショナルデータベースが苦手とする ビッグデータ の処理です. ガートナーによると,ビッグデータは 「高ボリューム、高速度、高バラエティな情報資産」と定義され, 数十テラバイトから数ペタバイトまでの巨大なデータを指しています (Googleの一日に処理するデータ量は20ペタバイト以上 - GIGAZINE). リレーショナルデータベースは, 事前にスキーマの定義が必要であることに加え, 分散処理が苦手なため, 構造化されていない大量なデータを高速に処理するのに適していません. NoSQLは,冗長な機能をそぎ落とし,対象のデータに最適化されたシンプルな構造にすることで, リレーショナルデータベースより,ビッグデータの処理において高いパフォーマンスを発揮することができます.

現在は,様々なオープンソースのNoSQLが提供されており, 主要なサービスやアプリケーションを支える技術として普及しています. NoSQLは,そのデータモデルに基づき,4種類に分類されます (KVS系NoSQLのまとめ - @IT). この授業では,Key-Valueストア型データベースと, ドキュメント指向データベースを取り上げます.

Key-Valueストア型データベース

Key-Valueストア型データベース(Key-Value Store: KVS) は, NoSQLの中でも最もシンプルな構造のデータベースです. キー(Key)とバリュー(Value)の組み合わせだけで表現され, 高いスケーラビリティ(データの規模に合わせて拡張可能なこと)を誇ります. ここでは,果物の英単語の辞書データベースを例に考えてみましょう.

キー バリュー
apricot アンズ
apple リンゴ
banana バナナ
cherry サクランボ
coconut ココナッツ
cranberry クランベリー

【果物の英単語】

Key-Valueストア型データベースに対する問い合わせは,SQLとは異なり, 「特定のキーに対するバリュー」を取得することに特化しています. 例えば,キーが「apple」のレコードを検索すると, 対応するバリューの「リンゴ」が取得されることになります.

上述したように,Key-Valueストア型データベースは, スケーラビリティが高く,大量のデータの処理に適しています. 一般に,スケーラビリティを向上させるには, スケールアップスケールアウト と呼ばれる方法があります. スケールアップとは,データベースを管理しているサーバの CPUやメモリなどのハードウェアのスペックを上げることで, パフォーマンスを向上させることを意味しています. 一方,スケールアウトは,サーバの台数を増やし, 不可を分散させることでパフォーマンスを向上させます. Key-Valueストア型デーテベースは, このスケールアウトが容易に可能です.

Key-Valueストア型データベースをスケールアウトするには, キーごとにサーバを分ける方法が用いられます (実際はサーバの故障に備えて,一つのキーが複数のサーバで冗長的に管理される). 例えば,先ほどの果物の英単語の例では, 英単語の頭文字のアルファベットに応じて下記の3つのサーバに分けることが考えられます. このようにスケールアウトをすることで, ビッグデータにおいても,高いパフォーマンスを維持することができます.

キー バリュー
apricot アンズ
apple リンゴ

【果物の英単語(A)】

キー バリュー
banana バナナ

【果物の英単語(B)】

キー バリュー
cherry サクランボ
coconut ココナッツ
cranberry クランベリー

【果物の英単語(C)】

代表的なKey-Valueストア型データベースには下記があります. ここでは,オンメモリで高速に動作する Redis に着目します(データの永続化も可能).

Redis

Redisはオープンソースとして公開されているKey-Valueストア型のデータベースです (BSDライセンス). データはハードディスクではなく, 高速にアクセスが可能なメモリに記録する仕組みになっています(オンメモリ・データベース). このため,停電などによって電源供給を失った場合は,全てのデータが失われてしまうことに注意が必要です. 現在は,多くのプログラミング言語やフレームワークでRedisを利用するためのライブラリが提供されており, ウェブアプリーケーションなど様々な用途で導入されています.

Redisのインストール

Windowsの場合

公式サイトでは,Windows版は提供されていないため,マイクロソフトが提供しているRedisを利用します(現在はRedisと互換性のあるMEMURAIの利用が推奨されています). 下記リンクから最新バージョン(3.2.1)の Redis-x64-3.2.100.zip をダウンロードして解凍してください.

Windows版 Redisのダウンロード

MacOSの場合

MacOSでは,HomeBrewを利用してインストールするのが簡単です. Homebrewのインストールに関しては,他のサイトを参考にしてください.

% brew install redis

Redisの起動

Redisはクライアント・サーバ型のデータベースです. サーバは redis-server,クライアントは redis-cli です. コマンドプロンプトやPowerShellで下記のコマンドを実行します(Shiftキーを押しながら右クリックで起動できる). 文字化けを防ぐため,--raw を引数に与えます. クライアントのプロンプトには,127.0.0.1:6379 と表示され, ローカルホスト(127.0.0.1)の6379番のポートに接続されていることがわかります.

% redis-server
% redis-cli --raw

Image from Gyazo

Image from Gyazo

Redisのコマンド

Key-Valueの登録

KeyとValueのペアを登録するにはSETコマンドを利用します. 既に同じKeyが登録されていた場合はValueは上書きされます. 日本語が文字化けする場合は,カタカナ ではなく ローマ字 で入力してください. 例えば「アンズ」は「ANZU」と入力します.

> SET apricot アンズ
> SET apple リンゴ
> SET banana バナナ

Image from Gyazo

Valueの取得

登録されているKeyに対応したValueを取得するにはGETコマンドを利用します.

> GET apricot
> GET apple
> GET banana

Image from Gyazo

Key-Valueの削除

登録されているKey-Valueを削除するにはDELコマンドを利用します.

> DEL apricot

Image from Gyazo

Keyの一覧の取得

登録されているKeyの一覧を取得するにはKEYSコマンドを利用します.

> KEYS *

Image from Gyazo

有効期限を設定したKey-Valueの登録

有効期限を設定してKeyとValueのペアを登録するにはSETEXコマンドを利用します. ここでは10秒間を指定してcherryを登録してみます. 10秒が経過した後でGETをしてもValueが取得できないことがわかります.

> SETEX cherry 10 サクランボ

Image from Gyazo

例題1

Redisの Set型 を利用して,下記のKey-Valueを登録しなさい. Set型の登録にはsaddコマンド,取得にはsmembersコマンドを用いる. また,それぞれsmembersコマンドで取得した出力結果を確認しなさい.

キーバリュー
downtown浜田雅功,松本人志
un内村光良,南原清隆
neptune名倉潤,原田泰造,堀内健

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.