7

シャーディングを使用して、複数のデータベースサーバー間で信頼性の高いトランザクションを維持するにはどうすればよいですか?

たとえば、AccountLedgerあるデータベースサーバー(MySQLインスタンス)で名前が付けられたテーブルとUser別のデータベースサーバーで名前が付けられたテーブルがある場合、両方のデータベースインスタンス間でトランザクションを実行して、両方とも確実にコミットするか、失敗時にロールバックすることができますか?

トランザクションの例:

AccountLedgerデータベースサーバー:

START TRANSACTION;
INSERT INTO AccountLedger SET
    UserID = @UserID,
    Date = @Date,
    Debit = @Debit,
    Balance = @Balance;

ユーザーデータベースサーバー:

START TRANSACTION;
UPDATE User SET
    Balance = @Balance
WHERE UserID = @UserID;

AccountLedgerデータベースサーバー:

COMMIT;

ユーザーデータベースサーバー:

COMMIT; -- What happens if the COMMIT fails here (power goes out or whatever)

シャーディングについてはかなり読んだことがありますが、シャーディングでのトランザクションの使用に関する情報が見つからないようです。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

9

分散トランザクションでこれを行うことが可能です。これらは、InnoDBストレージエンジンによってサポートされています。それらとコマンドの構文についての詳細は、MySQLのドキュメント:XAトランザクションにあります。

直接使用しないことをお勧めします。一貫性がypurアプリケーションのほとんどの要件である場合は、それを処理できるトランザクションモニターを使用してください。JavaEEがそれを行います。

ただし、可用性が一貫性よりも重要である場合は、分散トランザクションを避ける必要があります。CAP定理がその理由を説明しています。

于 2012-04-07T08:01:38.270 に答える
5

各シャードがキーごとの線形化可能性と比較および設定をサポートしている場合は、クライアント側でクロスシャードのシリアル化可能なトランザクションを実装できます(これはMySQLに当てはまります)。このアプローチは、GoogleのPercolatorCockroachDBで使用されていますが、MySQLでの使用を妨げるものは何もありません。

私はそのようなトランザクションの段階的な視覚化を作成しました。それがあなたがそれらを理解するのに役立つことを願っています。

読み取りコミットされた分離レベルに問題がない場合は、PeterBailisによるRAMPトランザクションを確認するのが理にかなっています。また、シャーディングされたMySQL環境に実装することもできます。

于 2016-03-03T19:51:29.397 に答える
0

免責事項:私は、シャーディングの完全なソリューションのプロバイダーであるScaleBase(http://www.scalebase.com)で働いています。

ScaleBaseでは、InnoDBでXAトランザクションを使用することを選択できますが、パフォーマンスが高くつく可能性があることがわかりました...そして、データベースを最速にする必要がある場所(大量の挿入など)で正確に。したがって、「2フェーズコミットのバージョン」も有効にします。これは、より高速で、一貫性の点でXAに非常に近いと見なされ、トレードオフに十分である可能性があります...この「バージョン」には、 SELECT version()などの「利用可能ですか」クエリを参加しているすべてのデータベースにすばやく送信し、それらをコミットします。これは、「ScaleBaseデータベーストラフィックコントローラー」にある他のメカニズムへの追加であり、ほとんどのお客様(およびそうでないお客様)にとっては十分です。それでも完全なXAを選択できます。

于 2012-04-08T02:07:40.547 に答える