分散KVS(キーバリューストア)は、RDBMSの代わりになると思ってはいけない。RDBMSでは当たり前だった機能の一部は、あきらめる必要がある。このため、重要なデータをむやみやたらと分散KVS上に置くのはやめた方がよい。
分散KVSであきらめなければならない機能には、次の四つがある、
・トランザクション機能
・排他制御機能
・読み取り一貫性を保証する機能
・スプリットブレイン対策機能
逆にいえば、これらを取り込まないことで、分散KVSはRDBMSではかなわなかった、無尽蔵なスケーラビリティーや、極端に短いレイテンシー(要求が返ってくるまでの遅延時間)による高パフォーマンスを実現できたわけだ。
ところが、使い方を間違えれば、たちまち問題が生じてしまう。とりわけ、業務システムにおける重要なデータを分散KVS上に置く場合は注意が必要だ。
トランザクション処理に支障
重要なデータとは、不整合や損失が許されないデータを指す。業務システムの多くは、重要なデータといっても過言ではない。こうした重要なデータを置いてはいけない理由の一つは、分散KVSではトランザクション処理に支障が出る可能性があるからだ。
例えば、商品の購入処理で、在庫を増やす処理と預金残高を減らす処理を同時に実施するトランザクションがあったとしよう。この場合、RDBMSならどちらか一方の処理が失敗すると、両方の処理をロールバックする(図1上)。分散KVSでは一般にこのような機能を標準で備えておらず、アプリケーション側で作り込む必要がある。
RDBMSでは更新処理が終了するまで、他の参照処理を受け付けない仕組みもある(図1下)。いわゆる排他制御の仕組みだ。分散KVSでは、このような仕組みも備えていない。もし更新処理の途中でそのデータを参照してしまうと、間違った内容を読み取ってしまう恐れがある。RDBMSならデータの読み取り一貫性が保証される。
対策打つと分散KVSの利点が失われる
機能を備えていないと書いたが、分散KVSの中には、設定次第でこうした機能を実現できる製品もある。しかし、それらの設定を有効にすると、分散KVSの魅力が薄れてしまう。RDBMSのようにスケーラビリティーに限界が生じるほか、レイテンシーも長くなる。こうなると、分散KVSを利用する意味がなくなってしまいかねない。
データの不整合が発生する可能性もある。分散KVSのデータは通常、二つ以上のサーバーに配置される。このためすべてのデータに更新処理が行きわたるまで時間がかかり、各データの内容にギャップが生じるケースがある。製品によってはこのギャップが発生しないように制御できるものもあるが、これを使うとやはり分散KVSの利点が失われてしまう。