복붙노트

[MONGODB] 동기화 MongoDB를 통해 ssh를

MONGODB

동기화 MongoDB를 통해 ssh를

MySQL의 달리, 나는 그것이 매우 MongoDB의 파일을 동기화하려고 도전 발견 - 그들은 표준 출력에 데이터를 전송하지 않기 때문에 그들은 파이프 돌아올 수 없다 (내가 제대로 이해하고).

그래서, 난이 ssh를 호출을 포함하지 않는 다른 방법을 찾기 위해 노력하고있어. 어떤 일을해야하는 것은 이것이다 :

여기서 중요한 점은, 그러나, 더 추적 뒤에 떠나 없습니다 - 나는, 압축 된 파일이 원격 시스템에 머물 싶지 않아 이는 일반적으로 다른 ssh를 로그인에 저를 필요로한다. "아카이브로 이동 파일"의 라인을 따라 뭔가 그래서 이상적인 솔루션이며, 그는 될 수 있으면 나중에 완벽하게 로컬 컴퓨터에 다시 파이프.

나는 MongoDB를가 mongodump를 사용하여 서버 자격 증명에 연결하는 방법을 가지고 실현,하지만 난 SSH 방법을 필요로하므로 포트, 기압 닫힙니다. 다른 아이디어 BTW, 환영받을 것입니다.

이 질문에 다소 인기가있을 것으로 보인다 때문에 (신용 어디 예정이다 신용이다), 나는 지난 한 해 동안이 질문에 '답변 및 기타 리소스에서 진화 스크립트를 공유하는 걱정 것입니다. 이 스크립트는 기본적으로 DB 가능한 중 하나 유형, 원격 서버에 /에서 동기화를 관리 (아마. 그레스, MySQL과 당분간 몽고). 그것은 DB에 대한 암호가없는 루트 사용자와 같은 몇 가지 가정을 가지고 있지만, 필요에 따라 변경 될 수 있습니다.

이 스크립트는 여기에서 찾을 수 있습니다 : https://github.com/iwfmp/zsh/blob/master/scripts/db/db-sync

해결법

  1. ==============================

    1.당신은 당신의 로컬 포트 ​​중 하나를 실행하는 원격 MongoDB의 인스턴스를 설정, SSH 터널링으로이 작업을 수행 할 수 있습니다. 기본적으로 MongoDB를 너무 아래의 예, 나는 내 로컬 27018 포트에 내 원격 MongoDB의 인스턴스를 매핑 선택한, 27017에서 실행됩니다.

    당신은 당신의 로컬 포트 ​​중 하나를 실행하는 원격 MongoDB의 인스턴스를 설정, SSH 터널링으로이 작업을 수행 할 수 있습니다. 기본적으로 MongoDB를 너무 아래의 예, 나는 내 로컬 27018 포트에 내 원격 MongoDB의 인스턴스를 매핑 선택한, 27017에서 실행됩니다.

    당신은 LOCALHOST에 SERVER1에서 데이터베이스를 복사하는 시도에 경우에, 당신은 당신의 LOCALHOST에서이 명령을 실행할 수 있습니다 :

    ssh를 -L27018 : 로컬 호스트 : 27,017 SERVER1

    (물론 실제 서버 또는 ssh 별명 SERVER1 교체)

    이 SERVER1에 SSH 연결을 엽니 다, 또한 SERVER1에 원격 포트 27017에 localhost의 포트 27018을 매핑합니다. 과 같이, 포트 27018으로 로컬 호스트 시스템에서 MongoDB를 연결하려고 지금 닫지 그 SSH 연결을 수행하고 :

    몽고 --port 27018

    당신이 당신의 로컬 컴퓨터에서 액세스하고를 제외하고 당신이 지금 SERVER1의 데이터입니다 알 수 있습니다.

    그냥 일반적으로 MongoDB를 실행 :

    몽고 (또는 몽고 --port 27,107)

    로컬 시스템이 될 것입니다.

    이제부터 당신은 기술적으로 (당신이 SSH 터널을 실행하여 LOCALHOST에)있다 :

    당신은 데이터를 통해 복사하여 MongoDB (LOCALHOST) 내부의 db.copyDatabase () 함수를 사용할 수 있습니다.

    로컬 호스트 포트 27017 FROM (데이터를 떨어질 것 라이브에 실행)

    // Use the right DB
    use DATABASENAME; 
    // Drop the Existing Data on LOCALHOST
    db.dropDatabase();
    // Copies the entire database from 27018
    db.copyDatabase("DATABASENAME", "DATABASENAME", "localhost:27018");
    

    당신은 당신을 위해이 모든 명령을 실행할 수있는 쉘 스크립트로이 모든 것을 마무리 할 수 ​​있어야한다. 나는 하나를 자신을 가지고 있지만, 실제로는 아마 조금 더 혼란을 만들 수있는 몇 가지 추가 단계가 있습니다 :

    이렇게, 덤프에있는에서 당신을 방지 할 수 MongoDB를의 기본 db.copyDatabase () 함수를 사용하여 / 압축 / 복원 할 수 있습니다. / 경로 /로 / 파일 / 지역 / 경로 /로 / : 당신은 아직도 그 경로를 이동하려는 경우 물론, 타르 / gzip으로는, 다음 SCP에 대상 서버를 사용하여 데이터를 내보낼, mongodump을 실행하는 데 너무 어렵지 않을 것 파일을 아래로 끌어와 그 위에 mongorestore를 실행합니다.

    그냥 더 많은 작업처럼 보인다!

    편집 - 다음은 이것을 실행할 수있는 쉘 스크립트를 만들기 위해 함께가는 SH와 JS 파일입니다. 라이브에 그들을 실행하지 않는, 로컬 호스트에서이 프로그램을 실행하거나 라이브에 db.dropDatabase을 다하겠습니다. 같은 폴더에 두 파일을 넣고 도메인 / IP / SSH 별명 pull-db.sh의 경우 yourservername을 교체 한 다음 풀 db.js에 데이터베이스 이름이 무엇이든에 DBNAMEHERE을 변경합니다.

    나는 일반적으로 내 프로젝트의 폴더를라는 스크립트를 작성하고이를 실행하기 위해 편집에 pull-db.sh 개방을하면서 TextMate를를 사용하여, 난 그냥 히트에 ⌘ + R이있다.

    pull-db.sh

    ssh -L27018:localhost:27017 YOURSERVERNAME '
        echo "Connected on Remote End, sleeping for 10"; 
        sleep 10; 
        exit' &
    echo "Waiting 5 sec on local";
    sleep 5;
    echo "Connecting to Mongo and piping in script";
    cat pull-db.js | mongo
    

    풀 db.js

    use DBNAMEHERE;
    db.dropDatabase();
    use DBNAMEHERE;
    db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
    

    나는 (그렇다고) 무엇을하고 있는지 알아 에코 쉘 스크립트에 몇 가지 추가 코드를 추가했습니다. 스크립트 슬립 타이머는 다음 줄이 실행되기 전에 연결 얻을 수있는 SSH 연결 시간을 제공한다. 기본적으로, 여기에 무슨이다 :

    이제 로컬 호스트에서 원격 데이터베이스에서 모든 데이터가 있어야합니다.

  2. ==============================

    2.당신이 역 (원격 데이터베이스에 로컬 데이터베이스의 사본)을 수행하려는 경우, Jesta 좋은 대답을 완료하려면, 대신 -L 명령의 -R 명령으로 포트를 다른 방법으로 결합해야한다 :

    당신이 역 (원격 데이터베이스에 로컬 데이터베이스의 사본)을 수행하려는 경우, Jesta 좋은 대답을 완료하려면, 대신 -L 명령의 -R 명령으로 포트를 다른 방법으로 결합해야한다 :

    지금, 원격 서버에 기록되고, 로컬 데이터베이스에서 DB를 복사 할 수 있습니다 :

  3. ==============================

    3.다른 연결 하나 개의 데이터베이스를 가지고처럼 정말하지 않습니다 - 이럴 그것은 환경의 분리를 중단하고 같은 스크립트를 자동화 복잡합니다.

    다른 연결 하나 개의 데이터베이스를 가지고처럼 정말하지 않습니다 - 이럴 그것은 환경의 분리를 중단하고 같은 스크립트를 자동화 복잡합니다.

    내 솔루션 /를 몽고 덤프를 사용하는 파일을 스트리밍하는 사용 "덤프 디렉토리"및 사용에 타르를 복원하는 것입니다. 다음과 같을 수 (다른 원격으로 하나의 원격에서 복사 용) 사소한 구현 :

    ssh remote1 'mongodump > /dev/null && tar -zc dump && rm -rf dump' | \
      ssh remote2 'tar -zx && mongorestore dump && rm -rf dump'
    
  4. from https://stackoverflow.com/questions/16619598/sync-mongodb-via-ssh by cc-by-sa and MIT license