네이버 부스트캠프에서 개발한 BooLock
이라는 서비스를 Naver Cloud Platform
을 통해 배포하고 있었다.
부스트캠프측에서 지원해주는 서버 비용이 있었기에 이를 사용하고 있었는데, 서버를 4개(prod용 public/private(db) 2개, test용 2개) 돌리고 있다보니.. 생각보다 지출이 많아 지원해주신 크레딧을 거의 다 써서 서버를 이전할 필요성을 느꼈다.
서버 이전을 하며 아예 mongoDB를 새로 만들까도 생각해봤는데, BooLock
에서 쓰고 있는 샘플데이터들이 있어서 DB를 아예 통째로 옮겨야겠다고 생각했다.
먼저 잠깐 꺼두었던 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>
-u <DB_USERNAME> -p <DB_USER_PASSWORD>
-u
대신 --username
을 써도 된다. -p
도 마찬가지로 --password
로 써도 된다.nano /etc/mongod.conf
로 mongod.conf
파일로 들어가서 security:
authorization: enabled
--authenticationDatabase <AUTH_DB>
--authenticationDatabase <AUTH_DB>
이 옵션은 해당 명령어에서 사용되는 user
가 생성된 인증 데이터베이스를 지정해주는 것이다.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란?
웬만하면 ssh 관련 패키지들은 깔려있다. 그래도 만약 없다면
sudo apt-get install openssh-server
이렇게 설치해준다.
그리고 이것만 기억하자. 무조건 파일이 보내질 위치가 뒤로 간다.
# 파일 하나만 옮길 때
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]
# 파일 하나만 옮길 때
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]
백업파일을 복원하기 위해선 미리 해야하는 일이 있다.
나는 -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
옵션을 써주면 된다.
![]() |
![]() |
shell에서도, 실제 서비스로 샘플데이터를 불러와봤을 때도 문제가 없는 것을 보니 잘 복원된 걸 확인할 수 있다~