2009-06-25 21 views
2

私はシステムを「マスターサーバー」に置いています。これは、定期的にMySQL DBからWeb内の別のサーバーに情報のチャンクを転送しています。MySQLテーブルを別のサーバに転送するためのベストプラクティス?

両方のサーバには、MySQLサーバとApacheが動作しています。私はこのための使いやすいソリューションが欲しいです。

は現在、私はに探しています:

  • XMLRPC
  • RESTfulサービス
  • 処理スクリプトに簡単なPOST
  • ソケット転送

が私のマスターのアプリがありますTurboGearsアプリであるので、私は「ピジョンソニック」という言葉があまりにも醜い解決法を好むだろう。ダンプされたテーブルをFTP/SCPなどを介して別のサーバにコピーするのは速いかもしれませんが、私の目にはそれも非常に(素早く)汚れています。

"ベストプラクティス"のやり方をすぐに説明できる人はいますか?

これは必ずしもデータベースを含む必要はありません。 Server1でテーブルをダンプし、生データを構造化された方法で転送すると、あまり解析することなくserver2で処理できるようになります。しかし、1つの要件:データがserver2に到着するとすぐに、そのデータを処理したいので、転送が完了すると何らかの通知が必要です。もちろん、私自身のサーバーを2台目のマシンのソケットに置いて、自分のコードでファイルを受け入れて処理することもできますが、これは非常に大きなシステムの非常に小さな断片なので、私はしませんこれを実装するのに半日を費やしたい。単純にあるサーバーから別のサーバーにMySQLの接続を開く:

おかげで、

トム自分の状況を想定し

答えて

2

サーバ1:JSONに行を変換し、JSONデータと第二のRESTfulなAPIを呼び出す

サーバ2は:例えばURIをリッスンPOST /データ、jsonデータを辞書またはORMオブジェクトに変換、dbに挿入

sqlalchemy/sqlobjectとsimplejsonが必要です。

0

あなたは一つのトランスポートメカニズムを忘れてしまった、このセキュリティ・ワイズができます。

私は、書き込みサーバーで定期的に実行され、読み取り専用サーバーとの接続(追加されたセキュリティのビット)とそれ自身のデータベースサーバーへの完全な接続を開くスクリプトを考えてみましょう。

どのように処理するかは、データに依存します(削除するとミラーリングする必要がありますか?挿入数と更新回数など)がありますが、基本的には読み込みサーバーからデータを取得したスクリプトを書くことができます直ちに書き込みサーバーに処理します。

また、mysqlサーバのレプリケーションは機能するのでしょうか、それとも解決策になるのでしょうか?

0

MySQLのデータポートにアクセスでき、一定のネットワークトラフィックを気にしない場合は、replicationを使用できます。

1

テーブルが小さく、古いデータを削除して新しいデータをリモートサーバーに挿入するだけの簡単な汎用ソリューションがある場合は、テーブルデータを使用して長い文字列を作成できますWebサービス経由で送信します。ここにその実装方法を示します。あなたは大きなテーブルを持っている場合は、私はあなたが新しいデータのみを送信する必要があると思い

function DumpTableIntoString($tableName, $includeFieldsHeader = true) 
{ 
    global $adoConn; 

    $recordSet = $adoConn->Execute("SELECT * FROM $tableName"); 
    if(!$recordSet) return false; 

    $data = ""; 

    if($includeFieldsHeader) 
    { 
    // fetching fields 
    $numFields = $recordSet->FieldCount(); 
    for($i = 0; $i < $numFields; $i++) 
     $data .= $recordSet->FetchField($i)->name . ","; 
    $data = substr($data, 0, -1) . "\n"; 
    } 

    while(!$recordSet->EOF) 
    { 
    $row = $recordSet->GetRowAssoc(); 
    foreach ($row as &$value) 
    { 
     $value = str_replace("\r\n", "", $value); 
     $value = str_replace('"', '\\"', $value); 
     if($value == null) $value = "\\N"; 
     $value = "\"" . $value . "\""; 
    } 
    $data .= join(',', $row); 

    $recordSet->MoveNext(); 

    if(!$recordSet->EOF) 
     $data .= "\n"; 
    } 

    return $data; 
} 

// NOTE: CURRENTLY FUNCTION DOESN'T SUPPORT HANDLING FIELDS HEADER, SO NOW IT JUST SKIPS IT 
// IF NECESSARRY 
function FillTableFromDumpString($tableName, $dumpString, $truncateTable = true, $fieldsHeaderIncluded = true) 
{ 
    global $adoConn; 

    if($truncateTable) 
    if($adoConn->Execute("TRUNCATE TABLE $tableName") === false) 
     return false; 


    $rows = explode("\n", $dumpString); 
    $startRowIndex = $fieldsHeaderIncluded ? 1 : 0; 

    $query = "INSERT INTO $tableName VALUES "; 
    $numRows = count($rows); 

    for($i = $startRowIndex; $i < $numRows; $i++) 
    { 
    $row = explode(",", $rows[$i]); 

    foreach($row as &$value) 
    { 
     if($value == "\"\\N\"") 
     $value = "NULL"; 
    } 

    $query .= "(". implode(",", $row) .")"; 
    if($i != $numRows - 1) 
     $query .= ","; 
    } 

    if($adoConn->Execute($query) === false) 
    { 
    return false; 
    } 

    return true; 
} 

:ここまで完璧なソリューション、私はウェブサイト間の小さなシンプルなテーブルを転送する方法を一例に過ぎないことに注意してください。リモートサーバーに最新のタイムスタンプを要求し、メインサーバーから新しいデータをすべて読み込み、一般的な方法(上記のように)または非汎用的な方法でデータを送信します(この場合は、別途各テーブルの機能)。

0

MyISAMまたはアーカイブテーブルを使用している場合は、お勧めしますmysqlhotcopy

関連する問題