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ストア型のデータベースです. データはハードディスクではなく, 高速にアクセスが可能なメモリに記録する仕組みになっています(オンメモリ・データベース). このため,停電などによって電源供給を失った場合は,全てのデータが失われてしまうことに注意が必要です. 現在は,多くのプログラミング言語やフレームワークで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

Set型を利用したKey-Valueの登録

Redisでは一つのKeyに複数の値(Set型)を登録することが可能です. Set型の登録にはsaddコマンド,取得にはsmembersコマンドを利用します.

> SADD downtown 浜田雅功
> SADD downtown 松本人志
> SMEMBERS downtown

Image from Gyazo

例題

Redisの Set型 を利用して,下記のKey-Valueを登録しなさい. また,それぞれsmembersコマンドで取得しなさい.

キーバリュー
unnan内村光良,南原清隆
neptune名倉潤,原田泰造,堀内健

情報処理技術者試験・過去問

下記リンクは ITパスポート試験ドットコム基本情報技術者試験ドットコム応用情報技術者試験ドットコムデータベーススペシャリストドットコムに掲載されている問題です.

参考書籍

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