RDS 읽기 전용 복제본을 생성하고 서버에 트래픽을 분산할 수 있도록 해보자.
읽기 전용 복제본
읽기 전용 복제본 생성을 위해 RDS 콘솔의 데이터베이스로 이동, Actions을 보면 읽기 전용 복제본 생성이 비활성화 되어 있는데, 자동 백업이 비활성화되어 있기 때문이다. 읽기 전용 복제본은 자동 백업으로 생성된 스냅샷을 통해 생성되기 때문에 자동 백업이 활성화되어 있고 스냅샷이 되어 있어야한다.
자동 백업 활성화
자동 백업을 활성화 해주기 위해서 데이터베이스를 선택하고 수정을 해준다. 그럼 아래 쪽에 백업 보존 기간은 자동으로 생성된 스냅샷에 대해 얼마나 보관할지에 대한 설정을 할 수 있다. 기존 0으로 설정되어 있었는데, 최저 비용으로 백업을 하기 위해 1일을 선택해주고 업데이트 해주었다.
계속 버튼을 클릭하면 옵션을 선택할 수 있다.
데이터베이스가 메인 인스턴스 윈도우 기간에 업데이트를 진행하도록 할 수 있고, 즉시 수정하도록 할 수 있다. 만약 데이터 베이스가 중단되거나 성능에 영향을 미칠 수 있는 수정일 경우에는 메인 인스턴스 윈도우 수정 기간에 수정하도록 하고 지금은 즉시 수정해주도록 하였다.
이제 왼쪽 탭에 자동 백업으로 이동해보면 백업 설정에 대한 항목이 추가되어 있다. 또한, 스냅샷 탭에서 시스템으로 이동해 보면 백업 설정으로 스냅샷이 생성된 것을 확인할 수 있다.
읽기 전용 데이터베이스 생성
이제 스냅샷을 이용해 읽기 전용 데이터 베이스를 생성할 수 있다. 앞서 진행했듯 데이터 베이스의 액션을 눌러보면 읽기전용 데이터 베이스 생성 버튼이 활성화 되어 있는 것을 확인할 수 있을 것이다.
그럼 RDS 인스턴스를 생성할때와 비슷한 화면이 나온다. 이름을 입력해주고 오토 스케일링, 성능 인사이트는 꺼주었다. 추가적으로 가용성은 비용을 절감하기 위해 싱글 데이터 베이스 인스턴스를 설정하고 나머지는 그대로 두었다. 마지막으로 딜리션 프로텍션(삭제 방지)을 활성화 해주고 복제본을 생성하였다.
활성화가 되기까지 시간이 조금 걸린다.
시작 템플릿을 통해 읽기 전용 복제본에 읽기 트래픽을 보내도록 설정
EC2의 시작 템플릿 탭으로 이동해서 템플릿을 수정해준다. 버전에 대한 설명을 간단하게 적고 오토 스케일링 체크 Source 템플릿은 최신 버전으로 선택해주고 유저 데이터를 수정해준다.
나는 Django를 사용했고 아래처럼 유저 데이터 및 settings.py를 수정하였다.
사용자 데이터
#!/bin/bash
# 패키지 업데이트
sudo yum update -y
# 디렉토리 이동
cd /home/ec2-user/
# Git 레포지토리 클론 및 브랜치로 이동
git clone https://github.com/jong-seoung/TodoList.git
# 권한 변경
sudo chown ec2-user:ec2-user TodoList
sudo chmod 777 TodoList
cd TodoList/
# 가상환경 & 라이브러리 설치
python3.11 -m venv venv
source venv/bin/activate
sudo yum install postgresql-devel
pip install gunicorn
python3.11 -m pip install --upgrade pip
pip install -r requirements/prod.txt
# Django 설정 파일에 RDS 정보 추가 (.env 파일 생성)
cat <<EOF > .env
SECRET_KEY=django-insecure-example-secret-key
# RDS PostgreSQL 정보
# 쓰기 전용 데이터베이스 정보
DB_NAME=example_database
DB_USER=example_user
DB_PASSWORD=example_password
DB_HOST=example-rds-db.endpoint.amazonaws.com
DB_PORT=5432
# 읽기 전용 데이터베이스 정보
DB_READ_NAME=example_database
DB_READ_USER=example_user
DB_READ_PASSWORD=example_password
DB_READ_HOST=example-rds-db-read-replica.endpoint.amazonaws.com
DB_READ_PORT=5432
EOF
# Nginx 설정
sudo cat <<EOF > /etc/nginx/conf.d/django.conf
server {
listen 80;
server_name 3.38.252.139;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
location /static/ {
alias /home/ec2-user/TodoList/static/;
}
location /media/ {
alias /home/ec2-user/TodoList/media/;
}
}
EOF
# Nginx 재실행
sudo systemctl restart nginx
# 마이그레이션 실행
python3.11 manage.py migrate
# Gunicorn을 Systemd 서비스로 등록
sudo cat <<EOF > /etc/systemd/system/django.service
[Unit]
Description=Django Gunicorn Server
After=network.target
[Service]
User=ec2-user
WorkingDirectory=/home/ec2-user/TodoList
ExecStart=/home/ec2-user/TodoList/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 TodoList.wsgi:application
[Install]
WantedBy=multi-user.target
EOF
# Nginx 설정 테스트 및 재 시작
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx
# Django 서버 실행
sudo systemctl daemon-reload
sudo systemctl start django
sudo systemctl enable django
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_WRITE_NAME'),
'USER': os.getenv('DB_WRITE_USER'),
'PASSWORD': os.getenv('DB_WRITE_PASSWORD'),
'HOST': os.getenv('DB_WRITE_HOST'),
'PORT': os.getenv('DB_WRITE_PORT'),
},
'replica': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('DB_READ_NAME'),
'USER': env('DB_READ_USER'),
'PASSWORD': env('DB_READ_PASSWORD'),
'HOST': env('DB_READ_HOST'),
'PORT': env('DB_READ_PORT'),
}
}
DATABASE_ROUTERS = ['path.to.your.DatabaseRouter']
이제 오토스케일링 그룹의 시작 템플릿을 업데이트 해준다.
테스트
읽기 전용 복제본에 읽기 요청이 분산되는지 확인해보자.
확인 방법은 애플리케이션의 요청에 따른 연결된 RDS의 엔드포인트를 로그 파일에출력 하도록 설정해놨다.
'BackEnd > 인프라' 카테고리의 다른 글
[AWS] 연결 최적화를 위한 RDS Proxy (0) | 2024.10.11 |
---|---|
[AWS] RDS 고가용성 확보를 위한 Multi AZ (1) | 2024.10.11 |
[AWS] RDS - 관계형 데이터 베이스 (0) | 2024.10.10 |
[AWS] AMI 만들기 & Launch Template (1) | 2024.10.08 |
[AWS] RDS 인스턴스 생성, 연결 (0) | 2024.10.07 |