Closed niamu01 closed 1 year ago
이거 나중에 진행할때 primary secondary 구조로 할 수 있을지 알아보세요
prod-db: 매주 수요일 오전 4시에 cron 으로 실행됩니다.
백업용 폴더 생성 collection 리스트 받아오기 collection 들을 5초 텀으로 dump 하여 bson 파일 생성 scp 로 백업 폴더 전체 전달 백업 폴더 삭제
dev: 매주 수요일 오전 5시에 cron 으로 실행됩니다.
백업된 db 폴더가 있는 있는 경우, docker down bson 파일들을 collection 단위로 10초 텀으로 복원 docker up 백업된 db 폴더 삭제
prod-db
#!/bin/bash
BACKUP_DIR="$(date +'%Y%m%d')"
mkdir -p $BACKUP_DIR
port="11900"
ip="172.31.8.65"
database="42stat"
collections=$(mongosh "mongodb://localhost:$port/$database" --eval "db.getCollectionNames()" --quiet | tr -d "[],'")
collections_array=($collections)
count=${#collections_array[@]}
for ((i=0; i<$count; i++)); do
mongodump --port $port --db $database --collection ${collections_array[i]} --out $BACKUP_DIR
done
scp -r -i ./42stat.pem ./$BACKUP_DIR ubuntu@$ip:~/
rm -rf ./$BACKUP_DIR
dev
#!/bin/bash
username="statdevuser"
password="DevPassw0rd6373"
ip="172.31.8.65"
port="27017"
db_name="42stat"
MONGO_URI="mongodb://$username:$password@$ip:$port/$db_name"
BACKUP_DIR="$HOME/$(date +'%Y%m%d')/$db_name"
if [ ! -d "$BACKUP_DIR" ]; then
echo "$BACKUP_DIR does not exist. Exiting script."
exit 1
fi
cd $HOME/42Stat-Backend
docker-compose -f docker-compose.dev.yml down
cd $HOME
BSON_FILES=($(ls -1 "$BACKUP_DIR"/*.bson))
for FILE in "${BSON_FILES[@]}"; do
echo "Restoring $FILE..."
sudo mongorestore --uri="$MONGO_URI" --drop "$FILE"
echo "Restored $FILE!"
done
cd $HOME/42Stat-Backend
docker-compose -f docker-compose.dev.yml up -d
cd $HOME
rm -rf $BACKUP_DIR
@niamu01
pdf 업로드 할 때 충돌하지 않나요? production db 그대로 가져가면 project 에 production url 이 들어갈 것으로 보입니다.
pdf 충돌은 이전에 한 번 겪었던 일인데 깜박했네요... 어떻게 해결할지 고민해보겠습니다... 🤔
근데 dev db 의 collection 을 받아와야 하는 이유를 잘 모르겠고, sleep 은 빼는게 낫겠네요. pdf 충돌은 그냥 dev 에서도 prod cdn 쓰는거 상관없지않나 하는 생각입니다.
더 정확히 말하자면 백엔드가 dev s3 와 상호작용하는 일이 없는게 맞지 않나 라는 생각입니다.
하긴 dev s3 에 pdf 올리던 게 예전에 dev 에서 먼저 테스트하느냐고 올라간 거긴 하죠 s3 주소 자체를 db 에서 꺼내서 주는 방식으로 결정됐으니 이젠 prod cdn 을 같이 사용하는 게 더 편리할 것 같습니다.
dev db 의 collection 을 받아오고 있나요?
getSibling 함수가 그런 역할을 하는게 아니였나요?
getSiblingDB 은 prod db 에서 collection 별로 dump 하기 위해서 사용합니다 dev 에서는 안사용해용
collections=$(mongosh --port $port --quiet --eval "db.getSiblingDB('$database').getCollectionNames()" | tr -d "[],'")
prod db script 중에 이런 부분이 있던데요, getCollectionNames() 을 바로 호출해도 되지 않나요?
Dev db collection 불러온다고 생각했던 것은 제 착각인듯 하네요.
db.getCollectionNames() 를 하면 db 를 특정하지 못해 빈 배열이 나오고, --eval "use 42stat; db.getCollectionNames()" 은 42stat 데이터베이스로 바뀌었다는 문구만 뜨고 collection 배열은 출력이 안되더라구요 🤔
collections=$(mongosh --quiet --eval "db.getCollectionNames()" mongodb://localhost:$port/42stat | tr -d "[],'")
getSiblingDB 는 인스턴스의 여러개의 db에 동시에 접근해야 하는 경우 사용하는 것 같습니다.
그냥 use @@ 대체용이라 생각했는데 그렇군요 url에서 db 적어주고 바로 getCollectionNames() 사용하는걸로 변경하겠습니다.
+) 수요일에 돌아가는것 확인 후 이슈 닫겠습니다
dev 인스턴스에 2GB 이상 여유를 두기 어려워 8GB 에서 10GB 로 확장하였습니다.
방식: prod 용 db 인스턴스
mongodump --port=11900
scp -r -i <.pem 경로> ./dump ubuntu@<dev private ip>:dump
rm -rf dump
dev 인스턴스
mongorestore --uri="mongodb://<username>:<password>@<dev pricate ip>:<db port>/<db name>" ./dump/42stat/
rm -rf dump
+) 이렇게 해도 중복 _id 는 업데이트 되지 않긴 하지만 prod 처럼 마지막 업데이트 시점이 기록되면 좋을 것 같네요...todo: 인스턴스가 강제 종료 될 경우 -> db 를 나눠서 restore, Elastic IP 등록