スケーラブルなデータベースシステム、Critiqueからのリクエスト
-
07-07-2019 - |
質問
ウェブサイトのバックエンド向けにスケーラブルなデータベースソリューションを構築したいと考えています。私は最近データベースの設計について読んでいますが、自分で機能するかもしれないアイデアを自分で開発したようです。これはn個のデータベースを同期データで維持する新しい方法だと思いますが、間違っている可能性があります。だから私はSOにアイデアを評価して、それがクレイジーかどうかを教えてくれるように頼んでいます。 (または既に存在し、実装されている場合)
このスキームには、サーバーノードのグループがあります。 1つのノードはクエリロードバランサーを実行し( A と呼びます)、残りは典型的なdbmsを実行しています。これらのノードをまとめて N と呼びましょう。
各Nは他のNから切断されます。つまり、 N のノードは、他のノードと通信する必要はありません。各 N には、 A のみへの接続があります。
プロセスは次のように動作します
- すべてのデータベースクエリは A を介して渡されます。 (今のところ、 A には無限のスループットと処理能力があると仮定しましょう)
- A は各クエリ( Q )を検査し、それがデータベースから読み取る操作なのか、データベースに書き込むクエリなのかを判断します。 (SQLでは、 read が選択され、 write が更新されます)
- Q が read 操作である場合、それを N 内のノードの に転送します>
- Q が write 操作の場合、 N のノードの all に転送します>
適切に実装されていると仮定すると、これにより、 N 内のすべてのノードでデータベースコンテンツが同期されます。データを読み取るだけのクエリは、1つのノードに送信する必要があります。
このアイデアは、私のシステムでは書き込み操作が非常に少なく、1%未満であるため、特にうまく機能しているようです。
このアイデアに関するいくつかの質問
- このようなスキームは、理論的な観点から理にかなっていますか?
- これが理にかなっている場合、既に実装されているソリューションは商用または無料のどちらですか?
解決
多くの読み取りと書き込みをほとんど行わない一般的なセットアップでは、読み取り/書き込みマスターデータベースと、読み取り専用のn個の複製スレーブデータベースを使用します。レプリケーションはRBDMSによって処理されます。読み取り専用クエリは、n個のすべての読み取り専用ノードで負荷分散でき、読み取り/書き込みマスターが一時的にダウンした場合、少なくともアプリは読み取り操作を処理できます。中央の「A」は必要ありません。クエリが読み取りか書き込みかを決定するプロキシ。クエリを発行するクライアントは、読み取りまたは書き込みのどちらであるかを知るのに十分スマートでなければなりません。そうすれば、「A」でボトルネックになることはありません。サーバー。
提案されたセットアップには、同時にn個のノードに書き込みを行う場合、それらの書き込みの1つ以上が失敗するとどうなるかという明確な欠陥があります。
他のヒント
このスキームは、無限に利用可能なノードでのみ機能します。ノードのダウンタイムにどのように対処しますか?ノードが任意の理由でダウンし、更新を見逃した場合、次回に要求されたときにダーティデータを提供します。
あなたの質問に対する直接的な答えではありませんが、SQL Server 2008はあなたが説明しているものと同等のものを既にサポートしています。そのピアツーピアトランザクションレプリケーションと呼ばれます。他のRDBMSも同様です。 MySQLはそれをマスターマスタレプリケーションと呼んでいます。