2009-06-16 14 views
2

私は現在、10ノードのクラスタにmysqlに対してjavaプロジェクトを書いています。このプログラムは、データベースからいくつかの情報を取り出し、何らかの計算を行い、データをデータベースに戻します。ただし、表には何百万行もあります。ジョブを分割してクラスタアーキテクチャを利用する方法はありますか?別のノードでマルチスレッドを行う方法は?mysqlの速度アップ操作

答えて

0

私は、データベース・サーバー上のストアドプロシージャにその計算をやって考えると、中間層に数百万行をもたらすことを伝えたいです。あなたはワイヤー上にたくさんのバイトを保存します。計算の性質、スキーマ、索引付けなどによっては、マルチスレッドに頼らなくてもデータベースサーバーがその計算を実行できることがわかります。

私は間違っている可能性がありますが、見て試作する価値があります。

+0

彼は1台のmysqlサーバしか持っていないように聞こえるので、クラスタを使用して問題を分散するのではなく、単一のリソースにボトルネックが生じます。 – NeuroScr

1

私はマップ/ mysqlデータベースにスタイル物事を削減するために行うGearmanの使用に関する興味深いプレゼンテーションを見ました。それはあなたが探しているものかもしれません:hereを参照してください。 mysqlウェブページhere(mysql.comに登録する必要があります)に記録があります。

+0

ギアマンとUDFを使用することは、MySQLから他のマシンに問題を配布するのに最適です。 – NeuroScr

0

処理したいテーブル(A)に1,000万行があるとします。データベースにテーブルBを作成し、ノードによって処理された行のセットを格納します。したがって、Javaプログラムを最初に他のノードによって処理された最後の行をフェッチし、同じテーブルに追加して処理する行の範囲を他のノードに通知するような方法でJavaプログラムを書くことができます(これを決めることができます数)。ここでは、各ノードが一度に1000行を処理できると仮定します。ノード1はテーブルBを取り出し、それが空であると判断する。次に、ノード1は、Aの主キーが< = 1000(テーブルAの主キーが数字であり、昇順であると仮定する)までの処理であることを知らせる行( 'Node1'、1000)を挿入する。ノード2が来て、1000の主キーが他のノードによって処理されていることがわかります。したがって、1001から2000までの行を処理していることを他の人に知らせる行( 'Node2'、2000)を挿入します。テーブルBへのアクセスは同期している必要があります。

+0

可能であれば、私は2つのテーブルを避けるでしょう、私はいくつかの追加のトラッキングフィールドを現在のテーブルにお勧めします。それが不可能な場合は、一時テーブルがあります。 – NeuroScr

0

あなたが唯一のMySQLサーバーを持っているので、あなたはアップデートのテーブルロックを減らすためにInnoDBエンジンを使用していることを確認してください。

また、もっと多くのクエリを実行する必要がある場合でも、クエリをできるだけシンプルに保つようにしています。これにより、クエリーキャッシュヒットの可能性が増し、バックエンドのすべての作業負荷が軽減され、クエリーの照合の一部がオフロードされ、フロントエンド(リソースが豊富)で作業が可能になります。行ロックが保持される時間も短縮され、競合が減少します。

提案されているGearmanソリューションは、おそらくこの仕事のための適切なツールです。バッチ処理をmysqlからクラスタに透過的に戻すことができます。

あなたがgearmanソリューションに比べて多くの仕事であるかもしれない各マシン上でMySQLが、設定した時間、メンテナンスおよびデータベースアクセス層への変更をシャーディングを設定することができます。また、複数のmysqlsを一度に使用できるようにする実験的なスパイダーエンジンを見たいかもしれません。

0

あなたの計算は非常に複雑である場合を除き、ほとんどの時間は、MySQLからデータを取得し、MySQLへ戻って結果を送信して過ごします。あなたは、単一のデータベースを持っていたよう

は、アプリケーション側での並列処理やクラスタリングのない量が大きな違いをしないでしょう。

これは可能な限り純粋なSQLで更新するか、ストアドプロシージャを使用してすべての処理がMySqlサーバー内で実行され、データの移動は不要です。

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