2009-06-25 2 views
2

시스템을 "마스터 서버"에 앉아 있습니다. 즉, 정기적으로 MySQL DB에서 웹의 다른 서버로 많은 양의 정보를 전송합니다.MySQL 테이블을 다른 서버로 전송하는 최선의 방법은 무엇입니까?

두 서버 모두 MySQL 서버와 Apache가 실행 중입니다. 나는 이것을 위해 사용하기 쉬운 솔루션을 원합니다.

은 현재 내가으로 찾고 있어요 :

  • XMLRPC
  • 편안한 서비스
  • 처리 스크립트에 대한 간단한 POST
  • 소켓 전송

내 마스터의 응용 프로그램입니다 TurboGears 앱을 좋아해요. 그래서 나는 "파이썬적인"일명 덜 추악한 솔루션을 선호합니다. FTP/SCP 같은 것을 통해 다른 서버에 덤프 된 테이블을 복사하는 것은 빠를 수 있지만 내 눈에는 매우 (빠르고) 더러워서 더 좋은 솔루션을 원합니다.

"베스트 프랙티스"방법을 곧 어떻게 설명 할 수 있습니까?

데이터베이스에 반드시 포함될 필요는 없습니다. Server1에서 테이블을 덤프하고 구조화 된 방식으로 원시 데이터를 전송하면 server2가 파싱하지 않고도 처리 할 수 ​​있습니다. 하나의 요구 사항 : 데이터가 server2에 도착하자마자 처리되도록하고 싶습니다. 따라서 전송이 완료되면 일종의 알림이 있어야합니다. 물론 두 번째 컴퓨터의 소켓에 앉아 전체 서버를 작성하고 자체 코드로 파일을 수락하고 처리하는 등의 작업은 매우 큰 시스템의 아주 작은 조각 일 뿐이므로 이것을 구현하는 데 반나절을 보내고 싶다. 단순히 한 서버에서 다른 서버로 MySQL의 연결을 여는 :

감사합니다,

톰 상황을 가정

답변

2

서버 (1) : JSON 데이터

서버 2 번째의 API를 호출하여 RESTful, JSON 행을 변환하십시오 URI 예에서 청취 POST/데이터, json 데이터를 사전 또는 ORM 객체로 변환하여 db로 삽입

sqlalchemy/sqlobject 및 simplejson이 필요합니다.

0

당신은 하나의 전송 메커니즘을 잊고,이 보안이 많다는 수 있습니다.

필자는 쓰기 서버에서 정기적으로 실행되는 한 스크립트에 대해 생각하고 읽기 전용 서버에 대한 읽기 전용 db 연결 (보안 추가)과 자체 데이터베이스 서버에 대한 전체 연결을 엽니 다.

다음 진행 방법은 데이터에 따라 다릅니다 (삭제를 미러링해야합니까? 업데이트 수와 얼마나 많은 수를 삽입해야합니까?)하지만 기본적으로 읽기 서버에서 데이터를 가져온 스크립트를 작성할 수 있습니다 즉시 쓰기 서버로 처리합니다.

또한 mysql 서버 복제가 작동합니까 아니면 솔루션으로 과장 될 것입니까?

0

MySQL의 데이터 포트에 액세스 할 수 있고 지속적인 네트워크 트래픽에 신경 쓸 필요가없는 경우 replication을 사용할 수 있습니다.

1

테이블이 작 으면 전체 테이블을 보내고 이전 데이터를 삭제 한 다음 원격 서버에 새 데이터를 삽입하면 쉬운 일반 솔루션이 될 수 있습니다. 테이블 데이터로 긴 문자열을 만들 수 있습니다 웹 서비스를 통해 보내십시오. 다음은이를 구현하는 방법입니다.당신이 큰 테이블이있는 경우

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

관련 문제