42Statistics / 42Stat-Backend

42Stat Backend Repository 🌌
https://stat.42seoul.kr
13 stars 2 forks source link

dev db 백업 주기 자동화 설정 #322

Closed niamu01 closed 1 year ago

niamu01 commented 1 year ago

dev 인스턴스에 2GB 이상 여유를 두기 어려워 8GB 에서 10GB 로 확장하였습니다.

방식: prod 용 db 인스턴스

  1. mongodump --port=11900
  2. scp -r -i <.pem 경로> ./dump ubuntu@<dev private ip>:dump
  3. rm -rf dump

dev 인스턴스

  1. mongorestore --uri="mongodb://<username>:<password>@<dev pricate ip>:<db port>/<db name>" ./dump/42stat/
  2. rm -rf dump +) 이렇게 해도 중복 _id 는 업데이트 되지 않긴 하지만 prod 처럼 마지막 업데이트 시점이 기록되면 좋을 것 같네요...

todo: 인스턴스가 강제 종료 될 경우 -> db 를 나눠서 restore, Elastic IP 등록

jpham005 commented 1 year ago

이거 나중에 진행할때 primary secondary 구조로 할 수 있을지 알아보세요

niamu01 commented 1 year ago
niamu01 commented 1 year ago

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
jpham005 commented 1 year ago

@niamu01

  1. getSiblingDB 를 사용한 이유가 뭔가요?
  2. sleep 을 넣어주는 이유가 뭔가요?
jpham005 commented 1 year ago

pdf 업로드 할 때 충돌하지 않나요? production db 그대로 가져가면 project 에 production url 이 들어갈 것으로 보입니다.

niamu01 commented 1 year ago

pdf 충돌은 이전에 한 번 겪었던 일인데 깜박했네요... 어떻게 해결할지 고민해보겠습니다... 🤔

jpham005 commented 1 year ago

근데 dev db 의 collection 을 받아와야 하는 이유를 잘 모르겠고, sleep 은 빼는게 낫겠네요. pdf 충돌은 그냥 dev 에서도 prod cdn 쓰는거 상관없지않나 하는 생각입니다.

jpham005 commented 1 year ago

더 정확히 말하자면 백엔드가 dev s3 와 상호작용하는 일이 없는게 맞지 않나 라는 생각입니다.

niamu01 commented 1 year ago

하긴 dev s3 에 pdf 올리던 게 예전에 dev 에서 먼저 테스트하느냐고 올라간 거긴 하죠 s3 주소 자체를 db 에서 꺼내서 주는 방식으로 결정됐으니 이젠 prod cdn 을 같이 사용하는 게 더 편리할 것 같습니다.

dev db 의 collection 을 받아오고 있나요?

jpham005 commented 1 year ago

getSibling 함수가 그런 역할을 하는게 아니였나요?

niamu01 commented 1 year ago

getSiblingDB 은 prod db 에서 collection 별로 dump 하기 위해서 사용합니다 dev 에서는 안사용해용

jpham005 commented 1 year ago

collections=$(mongosh --port $port --quiet --eval "db.getSiblingDB('$database').getCollectionNames()" | tr -d "[],'") prod db script 중에 이런 부분이 있던데요, getCollectionNames() 을 바로 호출해도 되지 않나요? Dev db collection 불러온다고 생각했던 것은 제 착각인듯 하네요.

niamu01 commented 1 year ago

db.getCollectionNames() 를 하면 db 를 특정하지 못해 빈 배열이 나오고, --eval "use 42stat; db.getCollectionNames()" 은 42stat 데이터베이스로 바뀌었다는 문구만 뜨고 collection 배열은 출력이 안되더라구요 🤔

jpham005 commented 1 year ago

collections=$(mongosh --quiet --eval "db.getCollectionNames()" mongodb://localhost:$port/42stat | tr -d "[],'") getSiblingDB 는 인스턴스의 여러개의 db에 동시에 접근해야 하는 경우 사용하는 것 같습니다.

niamu01 commented 1 year ago

그냥 use @@ 대체용이라 생각했는데 그렇군요 url에서 db 적어주고 바로 getCollectionNames() 사용하는걸로 변경하겠습니다.

+) 수요일에 돌아가는것 확인 후 이슈 닫겠습니다