2016-09-13 8 views
2

すべてのノードでデータが分割される分散システムを作成したいと考えています。私はあなたのために仕事をするHazelcastやApache Igniteのような図書館があることを知っています。私の場合、シャーディングキーごとに、別のシステムへのソケットサブスクリプションを作成する必要があります。そのため、データの分散方法だけでなく、実際にこれらのサブスクリプションを分散して作成する方法もあります。文字列の値に基づいてノードのクラスタを分割する方法は?

シャーディングキーごとに、他のシステムへのサブスクリプションを作成することです。各サブスクリプションは、ソケット接続からのすべての更新をチェックするためのデータを含むエントリのリストを保持します。

私が気づいていたのは、保存する新しいエントリごとに、シャーディングキーとデータを含むメッセージをトピックに送信することでした。次に、各ノードはシャーディングアルゴリズムを適用して、メッセージの処理を担当するノードを決定し、ソケット接続のサブスクリプションをまだ作成していない場合は作成し、それにデータを追加します。

複雑さは、クラスタトポロジの変更を処理することです。私は、これらの接続を手作業で再バランスする必要があります。これは、1つのノードをリーダーとして機能させ、データベースからデータを再ロードし、データを再送信することです。ノードは、サブスクリプションをクリアするこれらの変更にも対応する必要があります。そのためには、すべての変更に伴って増加するデータと並行して、ノードがこれらの変更を識別できるようにするバージョン番号を使用することを考えました。もう1つの解決策は、すべてのノードがイベントを通じてトポロジの変更を認識するようにすることですが、これらは非同期なので、購読をクリアするときに競合状態に陥る可能性があります。

これを行う方法は他にも良い方法がありますか?おそらく、Igniteが提供する機能のいくつかとは? (私はこの場合にはキャッシュのためにIgniteを使用しています)

ありがとうございました。

答えて

0

これは連続クエリの使用例のようです:https://apacheignite.readme.io/docs/continuous-queries

+0

これについて詳しく説明できますか?私がドキュメントを読んで理解することのために、私は作成する必要があります:現在のデータをロードするシャーディングアルゴリズムを使ったクエリ。 2-新しいエントリのための同じシャージングアルゴリズムを持つフィルタ。 3すべてが既に開始されたら、フィルタを渡すエントリのリスナ。最初のクエリを渡すエントリを処理するための4つのコードこれで、すべてのエントリに対して1つのノードだけが自分のロジックを実行するようにします。これは正しいです?トポロジの変更はどのように扱いますか?私はクラスタ内のすべての変更について最初からやり直す必要があります。 – Kilian

+0

まず、Igniteはシャーディングをしません。親和性関数に基づいてキーごとのレベルに基づいてデータを分割します。継続的なクエリは、ノードがクラスタ内の任意の場所で発生するキャッシュ更新をリッスンできるようにします。オプションのフィルタはサーバー側にあります(そこに好きなロジックを置くことができます)。トポロジの変更は、バックアップがある場合に自動的に処理されます。 –

関連する問題