連載
» 2011年06月23日 00時00分 公開

RDB開発者におくるNoSQLの常識(5):RDBとNoSQLのデータ書き込み法の違い (1/3)

最終回となる今回は、NoSQLとRDBのデータ書き込み方法を比較して、それぞれの得意不得意を考えてみます(編集部)

[渡辺俊史,株式会社システムインテグレータ]

データ構造やインデックスを事前に用意

 前回は、「NoSQLデータベースでRDBMSの機能を実現する」の後半戦として、RDBなら集計処理やテーブル結合を使って簡単にデータを取得できる場合を想定し、それをNoSQLデータベースで実現するための考え方や方法について説明しました。

 NoSQLデータベースにはRDBのように読み取り時にデータを加工する機能はありません。集計や結合といったデータの加工は事前に済ませ、データキャッシュとして保存しておいたものを読み出します。また、キャッシュを格納するための物理的なデータの構造や配置にも気を配らなければなりません。NoSQLデータベースはデータの持ち方で読み出し性能が大きく変わるからです。

 第3回で紹介したデータ検索や並べ替えの実現方法も、「転置インデックス」や「ソート順位列」など、追加のデータ構造を準備することで対応してきました。NoSQLデータベースのデータ読み取りについては、事前に加工済みのデータを用意し、それを分散環境へ複製して配置することで大量の読み取りアクセスに対応するという考え方が基本です。

 RDBのときはSQLで指示した内容に合わせてRDBMSが最適な実行計画を選択し、データを取得、加工して素早く返事を返してくれました。一方、NoSQLデータベースの設計では、具体的な利用ケースに合わせて、データ構造やインデックスを事前に用意しておく必要があります。

 今回は、NoSQLデータベースにデータを書き込む(更新)処理について考えます。これまでも説明したように、RDBは読み取りのリクエストを受け取ってからデータを動的に加工、生成して返します。取得するデータ構造や条件をSQL文として受け取り、RDBMS側で解析してから結果セットを返すという方法は、必要な構造のデータをあらかじめ用意しておくやり方と比べて、とても柔軟で便利な方法です。

 しかし、この方法はRDBMSの特長ともいえる「保持しているすべてのデータは、整合性を確保できている」ということを前提として初めて成立するものです。RDBはSQLによる読み取りリクエストに対して、いつでも最新の結果を返すことを保証するために、データを保存する段階で一貫性を保持する仕組みを備えている必要があります。

RDBMSの更新処理はスケールしない

 しかし、このような一貫性保持の仕組みを備えているために、RDBMSがスケールアウトで性能を上げにくいという側面もあります。第2回でも、図1のようにRDBMSは更新リクエストを交通整理して一貫性を確保すると説明しました。この交通整理を「同時実行制御(排他制御)」と呼びます。RDBは一貫性を保つため、複数の更新リクエストを受け取ったときはに片方を待たせておいて、更新リクエストを1つずつ処理していきます。

 ただし、図1は分かりやすさを考えて書いたものです。実際は、一貫性を損なわない範囲で、ある程度は並行処理します。データ一貫性の確保と性能にはトレードオフの関係があり、一貫性を厳密に確保しようとするほど性能は低下します。一貫性保持のモデルについてはANSI/ISO SQL標準の「トランザクション分離レベル」で4種類に分類されています。

図1 RDBMSは要求を整理して、1つずつ処理する 図1 RDBMSは要求を整理して、1つずつ処理する

 RDBMSが受け取る更新リクエストの数が増えると、同時実行制御によって待たされるリクエストの数も増え、更新リクエストの処理が完了するまでの待ち時間は長くなります。新しい更新リクエストが来る間隔が1件当たりの更新処理時間よりも短くなってしまうと、処理が追い付かなくなり、待ち行列が発生してしまいます。データベースの処理能力には限界があるので、大規模Webサービスのように不特定多数のリクエストを受け付ける環境では、大量の更新要求を1つ1つ更新していくというアプローチにはどうしても無理があるのです。

 NoSQLデータベースは、このようなRDBMSの弱点を逆手に取り、一貫性を保持することをある程度あきらめることで、読み書きの反応の速さ(可用性)を確保しています。図2は、NoSQLデータベースに対する書き込み処理のイメージです。更新要求はデータベースに到着した時点で即座に反映されます。

図2 NoSQLはデータの整合性を考えずに、要求を並列で処理する 図2 NoSQLはデータの整合性を考えずに、要求を並列で処理する

 それぞれの更新処理は分離されていないため、他のユーザーによる更新の途中にデータの読み取り(ダーティリード)が発生したり、他のユーザーの更新を上書きしてしまう(ロストアップデート)ことがあります。また、複数の更新処理がすべて成功するまで保留しておき、最後に確定(あるいは取り消し)を実行するトランザクションの仕組みもありません。NoSQLデータベースでは、これまでRDBMSが前提としてきた、厳密に一貫性保持しながらデータを更新するという考え方をそのまま適用することはできません。

 このようなNoSQLデータベースの特徴を見て「トランザクションがないのではまったく使い物にならない」という意見もありますが、更新処理の方法を工夫すれば、NoSQLデータベースでもデータの不整合を防ぐことが可能です。ここからは、NoSQLデータベースで同時実行制御やトランザクションを実現する方法について掘り下げていきたいと思います。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。