[Aws Ubuntu] MongoDB 설치 (tistory.com)


서버의 문제 혹은 접속이 불가능한 상황을 대응하기 위해 주 1회 mongodb 데이터를 S3로 백업할 수 있는 방법에 대해서 정리를 해보았습니다.

 

1. s3 인입 권한을 가진 계정 생성하여 Access Token 발급

1) AWS Console IAM 접속

2) 사용자 추가
3) 직접 정책 연결
4) 정책 생성 클릭
5) JSON 인입

- 삭제 권한은 제거하고 인입 권한만 부여

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        },
        {
            "Effect": "Deny",
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}

6) 권한 정책 창에서 정책 세로고침 후 연결

7) 보안 자격 증명 창에서 엑세스 키 발급

 

2. aws cli 설치 및 연동

# AWS CLI 설치
sudo apt update
sudo apt install awscli

# AWS CLI 구성
aws configure

3. mongodb_backup_to_s3.sh 생성

sudo vi mongodb_backup_to_s3.sh
#!/bin/bash

# MongoDB 설정
DB_NAME="chat"  # 백업할 MongoDB 데이터베이스 이름
# 백업 파일을 저장할 실제 존재하는 경로로 변경하세요
OUTPUT_DIR="/path/to/backup/folder"
MONGO_URI="mongodb://user:password@주소:port/chat?authSource=admin"

# S3 설정
S3_BUCKET="db-backup-s3"
TODAY_DATE=$(date '+%Y-%m-%d')
S3_PATH="s3://${S3_BUCKET}/app-chat-db/${TODAY_DATE}"

# 백업 디렉토리 확인 및 생성
if [ ! -d "$OUTPUT_DIR" ]; then
    mkdir -p "$OUTPUT_DIR"
fi

# MongoDB 데이터베이스의 모든 컬렉션 이름 가져오기
COLLECTIONS=$(mongosh "$MONGO_URI" --quiet --eval "db.getCollectionNames().join(' ')")

# 각 컬렉션에 대해 백업 수행
for COLLECTION_NAME in $COLLECTIONS
do
    # MongoDB에서 지정된 컬렉션 백업
    mongodump --uri="$MONGO_URI" --collection=${COLLECTION_NAME} --archive=${OUTPUT_DIR}/${COLLECTION_NAME}.gz

    # 백업된 tarball을 S3로 업로드
    aws s3 cp ${OUTPUT_DIR}/${COLLECTION_NAME}.gz ${S3_PATH}/

    # JSON 형식으로 백업 데이터를 변환
    mongoexport --uri="$MONGO_URI" --collection=${COLLECTION_NAME} --out=${OUTPUT_DIR}/${COLLECTION_NAME}.json

    # 백업된 JSON 데이터를 S3로 업로드
    aws s3 cp ${OUTPUT_DIR}/${COLLECTION_NAME}.json ${S3_PATH}/

    # (선택적) 로컬에 저장된 백업 파일 삭제
    rm ${OUTPUT_DIR}/${COLLECTION_NAME}.gz
    rm ${OUTPUT_DIR}/${COLLECTION_NAME}.json

    echo "Backup for ${COLLECTION_NAME} completed!"
done

4. 백업 테스트

./mongodb_backup_to_s3.sh

 

5. 자동 스케줄러(cron)

crontab -e
# 월요일 새벽 2시에 실행
0 2 * * 1 /path/to/script/mongodb_backup_to_s3.sh

 

서버나 DB 이슈로 인해 데이터 롤백이 필요하거나 복구가 필요한 경우를 위해 mariadb를 백업하는 방법을 알아보겠습니다. 

백업은 Mariabackup을 사용해보려고 합니다.

 

Mariabackup이란?

- MySQL과 MariaDB 에서 사용하던 무료 백업 라이브러리인 Percona XtraBackup을 바탕으로 작성된 포크입니다.

- DB 데이터를 통째로 복사하는 물리적 백업입니다.

- 복사 작업 중에 데이터에 업데이트가 발생할 수 있으므로 일관된 백업을 수행하기 위해 특별한 주의를 기울여야 합니다.

- MariaDB 10.3 버전 이상부터는 Percona XtraBackup이 지원되지 않기 때문에, Mariabackup을 사용해야 합니다.

 

전체 백업(Full backup)이란?

- 증분 백업이 참조할 기본 백업 데이터 입니다.

- 증분 백업을 실행하기 이전에 반드시 전체 백업을 먼저 실행해야 합니다.

backup_type = full-backuped
from_lsn = 0 (시작 지점)
to_lsn = 22886365542 (종료 지점)
last_lsn = 22886365551

 

 

증분 백업(Incremental Backup)이란?

- 전체 백업 데이터의 LSN(로그 시퀀스 번호)을 참조하여 마지막으로 변경된 지점부터 백업을 시작합니다.

- LSN은 백업 데이터 디렉토리의 'xtrabackup_checkpoints' 파일에 표기됩니다.

- 첫 증분 백업은 전체 백업 데이터를 참조하지만, 이후에 추가로 진행되는 증분 백업은 가장 최근에 진행된 증분 백업 데이터를 참조합니다.

backup_type = incremental
from_lsn = 22886365542 (기본 백업 데이터의 'to_lsn'을 기준으로 백업을 실행)
to_lsn = 22886370181
last_lsn = 22886370190

 

0. AWS CLI 설치

aws s3에 백업을 하기 위해 aws cli를 설치하고,

AmazonS3FullAccess 권한을 가지고 있는 Access Key ID, Secret Access Key로 세팅을 해보겠습니다.

# 1. Python 및 pip 설치
sudo apt update
sudo apt install python3 python3-pip

# 2. AWS CLI 설치
pip3 install awscli --upgrade --user

# 3. 설치 확인
aws --version

# 4. aws cli 세팅 (Access Key ID, Secret Access Key 입력)
aws configure

 

 

1. 전체 백업 (Full backup) 하는 방법

원하는 위치에 fullbackup.sh를 만들어 주시고,

하단의 내용을 넣어주시면 됩니다.

YEAR=$(date '+%Y')     #ex) 2024
MONTH=$(date '+%m')    #ex) 01
DATE=$(date '+%Y%m%d') #ex) 20240116

# 해당 연월의 경로 생성
sudo mkdir -p /db-backup/fullbackup/${YEAR}/${MONTH}/${DATE}

# 해당 경로에 fullbackup 실행
sudo rm -rf /db-backup/fullbackup/${YEAR}/${MONTH}/${DATE}/*
sudo mariabackup --backup --binlog-info=OFF --target-dir=/db-backup/fullbackup/${YEAR}/${MONTH}/${DATE}/ --user=user --password=password

# 백업 파일 READ 권한 부여
sudo chmod +r -R /db-backup/fullbackup/${YEAR}/${MONTH}/${DATE}

# last-checkpoint로 최신 파일 복사
sudo rm -rf /db-backup/last-checkpoint/*
sudo cp -r /db-backup/fullbackup/${YEAR}/${MONTH}/${DATE}/* /db-backup/last-checkpoint/

# AWS S3 저장소 백업파일 업로드 : db-backup-s3
sudo aws s3 cp /db-backup/fullbackup/${YEAR}/${MONTH}/${DATE}/ s3://db-backup-s3/fullbackup/${YEAR}/${MONTH}/${DATE}/ --recursive

 

2. 증분 백업 (Incremental  backup) 하는 방법

원하는 위치에 increbackup.sh를 만들어 주시고,

하단의 내용을 넣어주시면 됩니다.

YEAR=$(date '+%Y')
MONTH=$(date '+%m')
DATE=$(date '+%Y%m%d')

# 해당 연월의 경로 생성
sudo mkdir -p /db-backup/increbackup/${YEAR}/${MONTH}/${DATE}

# 해당 경로에 incremental backup 실행
sudo rm -rf /db-backup/increbackup/${YEAR}/${MONTH}/${DATE}/*
sudo mariabackup --backup --target-dir=/db-backup/increbackup/${YEAR}/${MONTH}/${DATE}/ --incremental-basedir=/ddrive/db-backup/last-checkpoint --user=user --password=password

# 백업 파일 READ 권한 부여
sudo chmod +r -R /db-backup/increbackup/${YEAR}/${MONTH}/${DATE}

# last-checkpoint로 최신 파일 복사
sudo rm -rf /db-backup/last-checkpoint/*
sudo cp -r /db-backup/increbackup/${YEAR}/${MONTH}/${DATE}/* /db-backup/last-checkpoint/

# AWS S3 저장소 백업파일 업로드
sudo aws s3 cp /db-backup/increbackup/${YEAR}/${MONTH}/${DATE}/ s3://db-backup-s3/test-db/increbackup/${YEAR}/${MONTH}/${DATE}/ --recursive

 

3. 스케줄러 돌리는 방법

crontab -e를 실행시켜주시고

아래의 명령어를 입력 후 저장해주시면 됩니다 : >

# MariaDB Full Backup Upload 매주 월요일 새벽 3시 30분
30 3 * * 1 /home/ec2-user/backup-sh/fullbackup.sh >> /ddrive/db-backup/log/fullbackup/`date "+\%Y\%m\%d"`.txt 2>&1

# MariaDB Incremental Backup Upload 매주 화~일 새벽 3시 30분
30 3 * * 2-7 /home/ec2-user/backup-sh/increbackup.sh >> /ddrive/db-backup/log/increbackup/`date "+\%Y\%m\%d"`.txt 2>&1

#7일 지난 백업파일 삭제 (매주 월요일 새벽 3시 20분)
20 3 * * 1 sudo find /ddrive/db-backup/fullbackup/* -mtime +7 -exec rm -rf {} \;
20 3 * * 1 sudo find /ddrive/db-backup/increbackup/* -mtime +7 -exec rm -rf {} \;

# 로그파일 저장소와 동기화 (매일 3시 35분)
35 3 * * * sudo aws s3 sync /ddrive/db-backup/log/ s3://db-backup-s3/test-db/log/

[linux] MongoDB 설치하기 (tistory.com)

 

[linux] MongoDB 설치하기

저번 시간에는 aws ec2 centos linux에 MongoDB를 설치하기 위해 드라이브 공간을 추가해보는 작업을 진행하였습니다. [linux] AWS Centos EBS Volume 추가하기 (tistory.com) [linux] AWS Centos EBS Volume 추가하기 AWS Cento

nitpick92.tistory.com

서버의 문제 혹은 접속이 불가능한 상황을 대응하기 위해 주 1회 mongodb 데이터를 S3로 백업할 수 있는 방법에 대해서 정리를 해보았습니다.

 

1. s3 인입 권한을 가진 계정 생성하여 Access Token 발급

1) AWS Console IAM 접속

2) 사용자 추가
3) 직접 정책 연결
4) 정책 생성 클릭
5) JSON 인입

- 삭제 권한은 제거하고 인입 권한만 부여

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        },
        {
            "Effect": "Deny",
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}

6) 권한 정책 창에서 정책 세로고침 후 연결

7) 보안 자격 증명 창에서 엑세스 키 발급

 

2. aws cli 설치 및 연동

# AWS CLI 설치
sudo yum install awscli

# AWS CLI 구성
aws configure

3. mongodb_backup_to_s3.sh 생성

nano mongodb_backup_to_s3.sh
#!/bin/bash

# MongoDB 설정
DB_NAME="your-db"             # 백업할 MongoDB 데이터베이스 이름
COLLECTION_NAME="your-collection"  # 백업할 MongoDB 컬렉션 이름
OUTPUT_DIR="/path/to/backup/folder" # 백업 파일을 저장할 경로

# S3 설정
S3_BUCKET="your-bucket"
TODAY_DATE=$(date '+%Y-%m-%d')
S3_PATH="s3://${S3_BUCKET}/${TODAY_DATE}" # 원하는 경로

# MongoDB에서 지정된 collection 백업
mongodump --db=${DB_NAME} --collection=${COLLECTION_NAME} --out=${OUTPUT_DIR}

# 백업된 데이터를 tarball로 압축
tar -czvf ${OUTPUT_DIR}/${COLLECTION_NAME}.tar.gz -C ${OUTPUT_DIR} ${DB_NAME}

# 백업된 tarball을 S3로 업로드
aws s3 cp ${OUTPUT_DIR}/${COLLECTION_NAME}.tar.gz ${S3_PATH}/

# JSON 형식으로 백업 데이터를 변환
mongoexport --db=${DB_NAME} --collection=${COLLECTION_NAME} --out=${OUTPUT_DIR}/${COLLECTION_NAME}.json

# 백업된 JSON 데이터를 S3로 업로드
aws s3 cp ${OUTPUT_DIR}/${COLLECTION_NAME}.json ${S3_PATH}/

# (선택적) 로컬에 저장된 백업 파일 및 tarball, json 삭제
rm -rf ${OUTPUT_DIR}/${DB_NAME}
rm ${OUTPUT_DIR}/${COLLECTION_NAME}.tar.gz
rm ${OUTPUT_DIR}/${COLLECTION_NAME}.json

echo "Backup for ${COLLECTION_NAME} completed!"

4. 백업 테스트

./mongodb_backup_to_s3.sh

 

5. 자동 스케줄러(cron)

crontab -e
# 월요일 새벽 2시에 실행
0 2 * * 1 /path/to/script/mongodb_backup_to_s3.sh

 

'Server > AWS' 카테고리의 다른 글

[CentOS] Aws CloudWatch Memory 및 용량 확인  (0) 2023.04.13
[Windows] Aws CloudWatch Memory 및 용량 확인  (0) 2023.04.12
AWS Global Accelerator란?  (0) 2023.03.24

+ Recent posts