2

私は現在、10 個のノードを持つクラスターで mysql に対して Java プロジェクトを作成しています。プログラムは単にデータベースからいくつかの情報を引き出し、いくつかの計算を行ってから、いくつかのデータをデータベースにプッシュします。ただし、テーブルには何百万もの行があります。ジョブを分割してクラスター アーキテクチャを利用する方法はありますか? 異なるノードでマルチスレッドを実行するには?

4

5 に答える 5

1

Gearmanを使用して mysql データベースで Map/Reduce スタイルの処理を行うという興味深いプレゼンテーションを見ました。それはあなたが探しているものかもしれません:こちらを参照してください。こちらの mysql Web ページに記録があります(ただし、mysql.com に登録する必要があります)。

于 2009-06-16T01:19:10.370 に答える
0

mysql サーバーは 1 つしかないため、innodb エンジンを使用して更新時のテーブル ロックを減らしていることを確認してください。

また、より多くのクエリを実行する必要がある場合でも、クエリをできるだけ単純に保つようにします。これにより、クエリ キャッシュ ヒットの可能性が高くなるだけでなく、バ​​ックエンドの全体的なワークロードが削減され、クエリ マッチングと作業の一部がフロントエンド (より多くのリソースがある場所) にオフロードされます。また、行ロックが保持される時間が短縮されるため、競合が減少します。

提案された Gearman ソリューションは、おそらくこの仕事に適したツールです。これにより、バッチ処理を mysql からクラスターに透過的にオフロードできるようになります。

各マシンで mysql を使用してシャーディングをセットアップすることもできますが、セットアップ時間、メンテナンス、およびデータベース アクセス レイヤーの変更は、ギアマン ソリューションに比べて大変な作業になる可能性があります。また、複数の mysql を一斉に使用できるようにする実験的なスパイダー エンジンを確認することもできます。

于 2010-05-04T12:28:12.923 に答える
0

処理するテーブル (A) に 1000 万行があるとします。データベースにテーブル B を作成して、ノードによって処理される行のセットを格納します。したがって、最初に他のノードによって処理された最後の行をフェッチし、次に同じテーブルにエントリを追加して、処理する行の範囲を他のノードに通知するような方法で Java プログラムを作成できます (これはユーザーが決定できます)。番号)。ここでは、各ノードが一度に 1000 行を処理できると仮定します。ノード 1 はテーブル B をフェッチし、それが空であることを確認します。次に、ノード 1 は行 ('Node1', 1000) を挿入し、A の主キーが <=1000 になるまで処理中であることを通知します (テーブル A の主キーが数値であり、昇順であると仮定します)。ノード 2 が来て、1000 個の主キーが他のノードによって処理されていることを発見します。したがって、行を挿入します ('Node2',

于 2009-06-16T06:45:02.010 に答える
0

計算が非常に複雑でない限り、ほとんどの時間は MySql からデータを取得し、結果を MySQl に送り返すことに費やされます。

単一のデータベースがあるため、アプリケーション側での並列処理やクラスタリングの量は大きな違いはありません。

したがって、可能な場合は純粋な SQL で更新を行うか、ストアド プロシージャを使用して、すべての処理が MySql サーバー内で行われ、データの移動が不要になるようにすることをお勧めします。

これが十分に高速でない場合は、データベースを MySql の複数のインスタンスに分割し、アプリケーション キーに基づいてデータを分割するスキーマを作成する必要があります。

于 2012-07-02T07:03:56.753 に答える
0

データベース サーバーのストアド プロシージャでその計算を行い、数百万行を中間層に移動することを検討します。回線上で多くのバイトを節約できます。計算の性質、スキーマ、インデックス作成などによっては、データベース サーバーがマルチスレッドに頼らなくてもその計算を実行できるようになっている場合があります。

間違っているかもしれませんが、試作品を見る価値はあります。

于 2009-06-16T01:12:45.253 に答える