[MongoDB] 다른 서버로 데이터 이전하기

홍현지·3일 전
2

네이버 부스트캠프에서 개발한 BooLock이라는 서비스를 Naver Cloud Platform을 통해 배포하고 있었다.
부스트캠프측에서 지원해주는 서버 비용이 있었기에 이를 사용하고 있었는데, 서버를 4개(prod용 public/private(db) 2개, test용 2개) 돌리고 있다보니.. 생각보다 지출이 많아 지원해주신 크레딧을 거의 다 써서 서버를 이전할 필요성을 느꼈다.
서버 이전을 하며 아예 mongoDB를 새로 만들까도 생각해봤는데, BooLock에서 쓰고 있는 샘플데이터들이 있어서 DB를 아예 통째로 옮겨야겠다고 생각했다.


원래 서버에서 DB 백업파일 만들기 (mongodump)

먼저 잠깐 꺼두었던 DB를 다시 실행시킨다.

mongodump --host <MONGODB_IP> --port <MONGODB_PORT> -u <DB_USERNAME> -p <DB_USER_PASSWORD> --authenticationDatabase <AUTH_DB> --out <PATH>

그리고 위 명령어로 백업파일을 만들었다.

각 옵션에 대한 설명은 아래와 같다.

--host <MONGODB_IP> --port <MONGODB_PORT>
  • DB가 실행중인 IP와 port 번호를 입력한다. 나는 사실 아예 DB가 실행중이던 private 서버에 들어가서 거기서 백업파일을 만들고 가져오는 방법을 택하였으니 그냥 127.0.0.1 과 27017을 입력해주었다.

-u <DB_USERNAME> -p <DB_USER_PASSWORD>
  • DB를 백업할 때, 해당 MongoDB 서버에 접근권한이 있는 유저인지 확인하기 위한 옵션이다.
  • -u 대신 --username을 써도 된다. -p도 마찬가지로 --password로 써도 된다.
  • 만약 지금 실행중인 MongoDB 서버가 인증을 필요로 하지 않는다면 해당 옵션은 안 써도 된다. 실행중인 서버가 인증을 필요로 하는지 확인하려면 nano /etc/mongod.confmongod.conf 파일로 들어가서
    security:
      authorization: enabled
  • 나는 인증을 활성화해줬기에 해당 옵션을 사용하였다.

--authenticationDatabase <AUTH_DB>
  • --authenticationDatabase <AUTH_DB> 이 옵션은 해당 명령어에서 사용되는 user가 생성된 인증 데이터베이스를 지정해주는 것이다.
    • 안 써도 상관은 없다.
      • 만약 백업할 DB가 모든 DB가 아니라 하나로만 특정되어있다면, 그 특정되어있는 DB에서 생선된 사용자인지 자격 증명을 해준다고 가정하고 백업된다.
      • 만약 인증 DB도 지정 안 해주고, 백업할 DB가 지정되어있지도 않다면 admin DB에서 생선된 사용자인지 자격 증명을 해준다고 가정하고 백업된다.
  • 다만, 안 쓸 때 간혹 error connecting to db server: server returned error on SASL authentication step:Authentication failed 이런 오류 메세지가 출력되는 듯 하다. 그러니 -u <DB_USERNAME> -p <DB_USER_PASSWORD>을 쓸 것이라면 웬만해선 --authenticationDatabase <AUTH_DB> 도 같이 써준다.

--out <PATH>
  • 백업한 파일들을 저장하는 장소를 정해주는 것이다. 나는 backup/ 으로 하여 저장했다.

원래 서버에서 다른 서버로 백업 파일 옮기기

위 방식으로 백업한 파일을 옮겼다.

옮기는 건 scp 를 사용해서 옮겼다.

✏️ scp란?

Secure Copy Protocol
ssh 원격 접속 프로토콜을 기반으로 한 파일 전송 프로토콜이다. `copy`라는 단어를 보면 알 수 있든 ssh로 원격으로 다른 서버에 접속하여 그 서버에 파일을 복사해오거나, 보내줄 수 있는 것이다.

웬만하면 ssh 관련 패키지들은 깔려있다. 그래도 만약 없다면

sudo apt-get install openssh-server

이렇게 설치해준다.

그리고 이것만 기억하자. 무조건 파일이 보내질 위치가 뒤로 간다.

현재 서버(local)에서 다른 서버(remote)로 옮길 때

# 파일 하나만 옮길 때
scp [LocalSourceFile] [username]@[remotehost]:[TargetPath]

# 파일 여러개 옮길 때
scp [LocalSourceFile1] [LocalSourceFile2] [LocalSourceFile3] [...] [username]@[remotehost]:[TargetPath]

# 폴더 자체를 옮길 때
scp -r [LocalSourceFolder] [username]@[remotehost]:[TargetPath]

# 폴더를 압축해서 옮길 때
scp -c [LocalSourceFolder] [username]@[remotehost]:[TargetPath]

# ssh 연결할 때 사용하는 포트를 따로 지정해주고 싶을 때 (기본 22)
scp -P [port] [LocalSourceFile] [username]@[remotehost]:[TargetPath]

다른 서버(remote)에서 현재 서버(local)로 가져올 때

# 파일 하나만 옮길 때
scp [username]@[remotehost]:[RemoteSourceFilePath] [LocalTargetPath]

# 파일 여러개 옮길 때
scp [username]@[remotehost]:[RemoteSourceFilePath1] [username]@[remotehost]:[RemoteSourceFilePath2] [...] [LocalTargetPath]

# 폴더 자체를 옮길 때
scp -r [username]@[remotehost]:[RemoteSourceFolderPath] [LocalTargetPath]

# 폴더를 압축해서 옮길 때
scp -c [username]@[remotehost]:[RemoteSourceFolderPath] [LocalTargetPath]

# ssh 연결할 때 사용하는 포트를 따로 지정해주고 싶을 때 (기본 22)
scp -P [port] [username]@[remotehost]:[RemoteSourceFilePath] [LocalTargetPath]

scp 방식도 결국 ssh 원격 접속이기반인지라 ssh key나 비밀번호가 필요하다. 키를 사용한다면 ssh 연결할 때랑 똑같이 scp 명령어 다음에 바로 옵션으로 넣어주면 된다.

scp -i [keyPath] [username]@[remotehost]:[RemoteSourceFilePath] [LocalTargetPath]

백업파일 복원하기 (mongorestore)

백업파일을 복원하기 위해선 미리 해야하는 일이 있다.

나는 -u <DB_USERNAME> -p <DB_USER_PASSWORD> --authenticationDatabase <AUTH_DB> 이 옵션을 써서 백업파일을 만들었기에, 복원을 할때에도 똑같은 AUTH_DB 위치에 똑같은 유저도 생성해놓고, 그걸로 사용자 인증을 하여 복원해주어야한다.

{
  user: 'boolockAdmin',
  db: 'admin',
  roles: [
    { role: 'userAdminAnyDatabase', db: 'admin' },
    { role: 'readWriteAnyDatabase', db: 'admin' }
  ],
  mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}

admin DB에 boolockAdmin 유저를 만들었기에 똑같이 새로운 서버에다가 admin DB에 boolockAdmin 유저를 만들어주고 복원해주었다.

(왜인지는 모르겠지만 새로운 서버에 유저를 만들 때, mechanisms 설정을 별도로 안해주고 role만 부여한 채로 만들었는데, 복원하려니까 오류가 나더라. 다시 유저를 만들며 mechanisms 설정을 명시적으로 해주니 복원이 잘 되었다. 기본이 SCRAM-SHA-1로 설정되어 사용되는 것 같던데 왜 설정되지 않았는지 잘 모르겠다 ㅎㅎ..)


mongorestore --host <MONGODB_IP> --port <MONGODB_PORT> -u <DB_USERNAME> -p <DB_USER_PASSWORD> --authenticationDatabase <AUTH_DB> <DUMP_FILE_PATH>

복원하는 방법은 간단하다 mongodump 명령어를 mongorestore로만 변경해주면 된다.

특정 DB만 복원하고 싶다면 --db <DB_NAME>,

기존 DB를 다 없애고 복원할 DB로 덮어쓰고 싶다면 --drop 옵션을 써주면 된다.

터미널 mongosh db 조회 이미지 boolock 사이트에서 샘플데이터 불러온 사진

shell에서도, 실제 서비스로 샘플데이터를 불러와봤을 때도 문제가 없는 것을 보니 잘 복원된 걸 확인할 수 있다~


참고

MongoDB 도구를 사용하여 자체 관리형 배포서버 백업 및 복원
Secure copy protocol

0개의 댓글

관련 채용 정보