[VPS] mongodb 및 postgresql dbs를 S3 Object Storage에 백업하는 방법

이것은 mongodb 및 postgresql 데이터베이스 모두에서 효율적인 방법으로 백업하기 위해 cron 작업을 설정하는 방법에 대한 간단한 가이드입니다.
모든 백업은 7z로 암호화되며 만료 시간이 있습니다.

전제 조건


  • Linux 기반 서버
  • 설치 p7zip-full,curl, mongodb-tools, postgresql-client
  • 일부 S3 호환 스토리지(이 가이드에서는 OVH Object Storage를 사용했습니다)

  • 몽고DB 백업


    mongodump 도구의 도움으로 전체 컬렉션을 쉽게 다운로드하고 압축한 다음 stdout을 7z로 파이핑하고 암호로 db를 암호화할 수 있습니다.

    mongodump \
    --uri="${db_host}/${db_name}?authSource=admin" \
    --archive \
    --gzip \
    | 7z a -si -t7z -p${password} ${file_name}
    

    db_host > mongodb에 연결하기 위한 uridb_name > 백업할 컬렉션의 이름password > 7z 파일을 암호화(복호화도 포함)하는 데 사용되는 암호file_name > 출력 파일(*.7z 확장자일 수 있음)

    PostgreSQL 백업


    pg_dump 도구의 도움으로 전체 db를 쉽게 다운로드하고 압축한 다음 stdout을 7z로 파이핑하고 db를 암호로 암호화할 수 있습니다.

    pg_dump \
    --dbname=${db_host}/${db_name} \
    | 7z a -si -t7z -p${password} ${file_name}
    

    db_host > psql에 연결하기 위한 uridb_name > 백업할 db명password > 7z 파일을 암호화(복호화도 포함)하는 데 사용되는 암호file_name > 출력 파일(*.7z 확장자일 수 있음)

    S3 호환 서비스에 업로드



    이제 압축 및 암호화된 파일을 S3 스토리지로 보낼 준비가 되었습니다. curl 를 사용하여 이를 달성할 수 있습니다. 이것은 ${file_name}을 본문으로 사용하는 PUT 요청의 예입니다.

    curl -i ${bucket}/${file_name} \
    -X PUT \
    --data-binary "@${file_name}" \
    -H "Content-Type: application/x-7z-compressed" \
    -H "X-Auth-Token: ${token}" \
    -H "X-delete-after: ${delete_after}"
    


    in this example I've used OVH Object Storage


    bucket > 버킷에 대한 완전한 urifile_name > 업로드된 파일을 저장할 파일 이름token > OVH를 사용하여 요청을 인증하기 위해 X-Auth-Token 헤더를 추가해야 합니다.delete_after > 이것은 선택적 헤더입니다. 일정 시간이 지나면 파일을 삭제할 수 있습니다.

    오토메이션



    이 3가지 명령은 백업 스크립트의 핵심입니다. 이제 일부 bash 논리로 래핑하고 파일에 모두 넣을 수 있습니다.

    #!/bin/bash
    
    # pass args to script
    if [ $# -eq 0 ]; then
        echo "Missing args: db_name or delete_after"
        exit 1
    fi
    
    while [ $# -gt 0 ]; do
      case "$1" in
        --db_name=*)
          db_name="${1#*=}"
          ;;
        --delete_after=*)
          delete_after="${1#*=}"
          ;;
        *)
          printf "***************************\n"
          printf "* Error: Invalid argument.*\n"
          printf "***************************\n"
          exit 1
      esac
      shift
    done
    
    if [ -z "${delete_after}" ]; then 
        delete_after=`expr 60 \* 60 \* 24 \* 30`; # one month
    fi
    
    # db env
    db_host=mongodb://user:password@host:port
    #db_name=db_name
    file_name=${db_name}_$(date +%d-%m-%Y_%H-%M-%S).gzip.7z;
    
    #ovh env
    bucket=bucket_url;
    token=personal_token;
    password=password;
    
    
    # Create a crypted backup
    if mongodump \
    --uri="${db_host}/${db_name}?authSource=admin" \
    --archive \
    --gzip \
    | 7z a -si -t7z -p${password} ${file_name}; then
        echo 'mongodb dump created'
    else
       echo 'mongodump return non-zero code'
       exit 1;
    fi
    
    content_length=$(cat $file_name | wc -c);
    # send file to ovh switf 
    http_response=$(curl -i ${bucket}/${file_name} \
    -X PUT \
    --data-binary "@${file_name}" \
    -H "Content-Type: application/x-7z-compressed" \
    -H "Content-Length: ${content_length}" \
    -H "X-Auth-Token: ${token}" \
    -H "X-delete-after: ${delete_after}" \
     | head -n 1 | cut -d \  -f2);
    
     if [ $http_response = 201 ] || [ $http_response = 100 ]; then
        echo "complete";
        rm ${file_name}; 
     else
        echo "error sending file to ovh";
     fi
    


    이 파일은 두 개의 인수를 허용합니다.db_name > 필수, 백업할 컬렉션/db의 이름delete_after > 선택 사항, 몇 초 후에 파일을 삭제해야 함

    example of how to manually execute
    bash script_name.sh --db_name=db_to_backup


    크론



    crontab을 사용하면 백업을 실행할 시기를 예약할 수 있습니다.

    add this row to crontab -e file to run the script every night at 2:00am and save the result to backup_script.logs



    0 2 * * * ~/script_name.sh >> ~/backup_script.logs 2>&1
    

    좋은 웹페이지 즐겨찾기