NoSQL(1) Key-Valueストア型データベース
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ストア型データベース(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 をダウンロードして解凍してください.
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
Redisのコマンド
Key-Valueの登録
KeyとValueのペアを登録するにはSET
コマンドを利用します.
既に同じKeyが登録されていた場合はValueは上書きされます.
日本語が文字化けする場合は,カタカナ ではなく ローマ字 で入力してください.
例えば「アンズ」は「ANZU」と入力します.
> SET apricot アンズ
> SET apple リンゴ
> SET banana バナナ
Valueの取得
登録されているKeyに対応したValueを取得するにはGET
コマンドを利用します.
> GET apricot
> GET apple
> GET banana
Key-Valueの削除
登録されているKey-Valueを削除するにはDEL
コマンドを利用します.
> DEL apricot
Keyの一覧の取得
登録されているKeyの一覧を取得するにはKEYS
コマンドを利用します.
> KEYS *
有効期限を設定したKey-Valueの登録
有効期限を設定してKeyとValueのペアを登録するにはSETEX
コマンドを利用します.
ここでは10秒間を指定してcherryを登録してみます.
10秒が経過した後でGET
をしてもValueが取得できないことがわかります.
> SETEX cherry 10 サクランボ
Set型を利用したKey-Valueの登録
Redisでは一つのKeyに複数の値(Set型)を登録することが可能です.
Set型の登録にはsadd
コマンド,取得にはsmembers
コマンドを利用します.
> SADD downtown 浜田雅功
> SADD downtown 松本人志
> SMEMBERS downtown
例題
Redisの Set型 を利用して,下記のKey-Valueを登録しなさい.
また,それぞれsmembers
コマンドで取得しなさい.
キー | バリュー |
---|---|
unnan | 内村光良,南原清隆 |
neptune | 名倉潤,原田泰造,堀内健 |
情報処理技術者試験・過去問
下記リンクは ITパスポート試験ドットコム, 基本情報技術者試験ドットコム, 応用情報技術者試験ドットコム, データベーススペシャリストドットコムに掲載されている問題です.