分散データベースとは?
別々の拠点にあるシステム及び、データベースのことです。呼び出す側のシステムを主システム、別拠点のシステムのことを従システムと呼びます。
分散データベースの難しい点
トランザクションの内容によっては別の場所同士にあるデータベースを同時に更新しなければならない点。同じデータベースを使っている場合に比べてそれぞれの場所のシステムの状態がわからないというデメリットが発生します。そこで分散データベースの場合は、2相コミットメント制御という仕組みが使われます。
2相コミットメントとは?
データベース更新時に、「診断」と「実行」という2つのフェーズを設けます。
ステップ1:診断(更新準備要求)
更新の可否を従側の各システムに問い合わせます。(更新準備要求)
更新OKの場合
更新対象の該当行をロックします。(これを「更新準備中状態」や「セキュア状態」と呼びます。)、その後OK回答を行います。
更新NGの場合
すでに該当行がロックがかかっており更新が不可能な場合は何もせずにNG回答をします。
ステップ2:実行(コミット要求、ロールバック要求)
診断で更新OKの応答をもらった場合は再度各システムに更新の指示(コミット要求)をします。一つのシステムからでも更新拒否や無通知を受け取った場合は更新取り消し(ロールバック要求)を行います。
コミット要求
状態が「更新準備中」の行の場合はコミット要求を受け取ると、データベースを更新してOK回答をします。そして該当行のロックを開放します。
ロールバック要求
状態が「更新準備中」の行の場合はロールバック要求を受け取ると、データベースをロールバックしてOK回答をします。そして該当行のロックを開放します。
障害が発生した場合
なお、主システム側で「更新準備中状態(セキュア状態)」で障害が発生してしまった場合は従システム側で管理しているDBはロック中のままとなってしまいます。それを防ぐために従システム側で更新準備要求がきた後に、コミット要求等が来るまでの時間をタイムアウト時間を設定しておきタイムアウトした場合はロールバックによってロックを解除するように設計すると良いでしょう。
昨今の開発では
分散データベース自体は古くからある概念にはなりますが、近年もクラウドが主流になってきておりマイクロサービスという分散開発が主流になってきています。
マイクロサービスでは「分散データベース」や「2相コミット」をするよりも「サーガ」という概念を使ってデータの整合性を担保する仕組みを採用するようになっています。以下の記事でも解説しています。
この記事へのコメントはありません。