source

ssh를 통해 MongoDB 동기화

manycodes 2023. 6. 30. 22:29
반응형

ssh를 통해 MongoDB 동기화

는 Mysql과는 달리 파일 동기화를 하는 것이 .
그들은 다시 를 사용할 수 .
(제가 올바르게 이해했다면).

그래서, 저는 다른 방법을 찾고 있어요, 그것은 두 번의 SSH 통화를 포함하지 않습니다.
해야 할 일은 다음과 같습니다.

  • SSH 서버에 로그인합니다.
  • 모든 MongoDB 파일 내보내기
  • gzip으로 압축합니다.
  • 로컬 컴퓨터로 다시 보냅니다.
  • 추출 및 가져오기

않는 입니다. - 지만여중것하흔은남것않다입니는기지적을기요서한▁the다하▁leaving것니입▁behind,▁is▁trace▁no.
시스템에 있는 않습니다.
일반적으로 다른 SSH 로그인이 필요합니다.
"아카이브로 "과이 있습니다
나중에 로컬 기계로 원활하게 파이프를 연결할 수 있다면 말입니다.

MongoDB에는 mongodump를 사용하여 서버 자격 증명에 연결하는 방법이 있는 것으로 알고 있습니다만, 포트가 atm이 닫혀 있어서 SSH 방법이 필요합니다.다른 어떤 아이디어라도 환영해, BTW.

편집 - 11.06.14

이 질문이 어느 정도 인기가 있는 것 같기 때문에 이 질문의 답변에서 발전한 스크립트와 지난 1년 동안의 다른 리소스(신용은 신용이 있어야 하는 부분)를 공유하고자 합니다.
이 스크립트는 기본적으로 가능한 모든 유형의 DB에 대해 원격 서버와의 동기화를 관리합니다.postgres, mysql, mongo).
루트 사용자가 DB에 대한 암호를 가지고 있지 않은 것과 같은 몇 가지 가정이 있지만 필요에 따라 변경할 수 있습니다.

스크립트는 https://github.com/iwfmp/zsh/blob/master/scripts/db/db-sync 에서 확인할 수 있습니다.

SSH 터널링을 사용하여 로컬 포트 중 하나에서 실행되도록 원격 MongoDB 인스턴스를 설정할 수 있습니다.기본적으로 MongoDB는 27017에서 실행되므로 아래 예제에서는 원격 MongoDB 인스턴스를 로컬 27018 포트에 매핑하기로 선택했습니다.

SERVER1에서 LOCALHOST로 데이터베이스를 복사하려는 경우 LOCALHOST에서 다음 명령을 실행할 수 있습니다.

ssh -L27018:localhost:27017 SERVER1

(분명히 SERVER1을 실제 서버 또는 SSH 별칭으로 대체)

그러면 SERVER1에 대한 SSH 연결이 열리지만 LOCALHOST의 포트 27018이 SERVER1의 원격 포트 27017에 매핑됩니다.SSH 연결을 닫지 말고 다음과 같이 포트 27018을 사용하여 로컬 호스트 시스템의 MongoDB에 연결해 보십시오.

mongo --port 27018

로컬 컴퓨터에서 액세스하는 경우를 제외하고는 SERVER1의 데이터입니다.

MongoDB를 정상적으로 실행하는 중:

mongo(또는)mongo --port 27107)

로컬 컴퓨터가 될 것입니다.

이제 기술적으로 (SSH 터널을 실행한 LOCAL HOST에서) 다음을 수행했습니다.

  • 27017의 MongoDB(LOCAL HOST)
  • 27018의 MongoDB(SERVER1)

그사용수있다니습할냥▁use▁the를 사용하면 됩니다.db.copyDatabase()MongoDB(LOCAL HOST) 내부의 기능을 사용하여 데이터를 복사할 수 있습니다.

포트 27017의 LOCAL HOSTER로부터(라이브에서 실행하면 데이터가 삭제됨)

// 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() 함수를 사용하면 덤프/zip/restore를 수행할 필요가 없습니다.물론, 여전히 그 길을 가고 싶다면, 달리는 것은 그리 어렵지 않을 것입니다.mongodump데이터를 "targ/gzip"을 합니다.scp TARGETSERVER:/path/to/file /local/path/to/file그것을 끌어내리고 뛰어가다mongorestore그 위에

더 많은 일이 있는 것 같아요!

편집 - SH 및 JS 파일을 함께 사용하여 셸 스크립트를 만들 수 있습니다.LOCAL HOST에서 실행합니다. 라이브에서 실행하지 마십시오. 그렇지 않으면 db.drop 데이터베이스가 라이브로 실행됩니다.이 두 파일을 같은 폴더에 넣고 서버 이름을 바꿉니다.pull-db.sh별칭을 "/IP/"로 표시됩니다.pull-db.js합니다.DBNAME HERE는 데이터베이스 이름입니다.

보통다폴만듭다니를더라는 .scripts제 프로젝트에서, 그리고 텍스트메이트를 사용해서, 저는 그저 치기만 하면 됩니다.⌘+R 동안에pull-db.sh실행하기 위해 편집할 수 있습니다.

pull-db의

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

pull-db.js

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

셸 스크립트에 추가 코드를 추가하여 셸 스크립트가 수행하는 작업을 반향했습니다(소르타).스크립트의 절전 타이머는 다음 줄이 실행되기 전에 SSH 연결에 연결할 시간을 주기 위한 것입니다.기본적으로 다음과 같은 일이 발생합니다.

  1. 코드의 첫 번째 줄은 시스템에 터널을 만들고 ECHO, SLEEP, EXIT를 원격 SSH 세션으로 보냅니다.
  2. 그런 다음 5초 동안 대기하여 1단계의 SSH 세션을 연결할 수 있습니다.
  3. 그런 다음 pull-db.js 파일을 로컬 mongo 셸에 파이프로 연결합니다. (1단계는 5초 이내에 완료되어야 합니다...)
  4. pull-db.js는 지금 mongo에서 실행되고 있어야 하며, #1 단계의 SSH 터미널은 연결이 열린 후 10초 동안 실행되고 EXIT가 해당 세션으로 전송됩니다.명령이 실행되지만 3단계의 활동이 완료될 때까지 SSH 세션은 실제로 열린 상태로 유지됩니다.
  5. pull-db.js 스크립트가 원격 서버에서 모든 데이터를 가져오는 것을 마치자마자 원격 서버의 #1 단계에서 실행된 EXIT 명령이 마침내 연결을 닫을 수 있게 되어 로컬 호스트에서 27108의 바인딩이 해제됩니다.

이제 원격 데이터베이스의 모든 데이터를 로컬 호스트에 저장해야 합니다.

Jesta 응답을 완료하려면 로컬 데이터베이스에서 원격 데이터베이스로 복사하려면 -L 명령 대신 -R 명령을 사용하여 포트를 반대 방향으로 바인딩해야 합니다.

ssh - R27018:localhost:27017 YOURSERVERNAME

이제 원격 서버에 기록되면 로컬 데이터베이스에서 db를 복사할 수 있습니다.

몽고

> db.copyDatabase('test', 'test', 'localhost:27018')

하나의 데이터베이스를 다른 데이터베이스에 연결하는 것을 별로 좋아하지 않습니다. IMHO는 환경의 분리를 방해하고 이러한 스크립트를 자동화하는 것을 복잡하게 만듭니다.

제 솔루션은 "dump directory"를 사용하는 mongo dump/restore를 사용하고 파일 스트리밍에 tar를 사용하는 것입니다.한 원격에서 다른 원격으로 복사하기 위한 간단한 구현은 다음과 같습니다.

ssh remote1 'mongodump > /dev/null && tar -zc dump && rm -rf dump' | \
  ssh remote2 'tar -zx && mongorestore dump && rm -rf dump'

주의:

  1. 그 둘 다mongodump그리고.mongorestore출력은 매우 장황하지만,mongodump둘 다 타르 스트리밍을 엉망으로 만들 것이고 또한 분명히.mongodump유사 터미널 없이 실행되고 출력 리디렉션 없이 실행되는 경우 실제로 작동을 거부합니다.
  2. mongodump하는지 알 stdout을 가져오는 .mongorestore그것을 싣기 위해.

언급URL : https://stackoverflow.com/questions/16619598/sync-mongodb-via-ssh

반응형