RDS on AWS

2022. 5. 14. 03:45
  • RDS
    • 백업기능
    • Multi-Az / Read Replica
    • Elastic Cache
  • RDS실습
    • 파라미터 그룹 설정
    • rds 생성
    • mysql데이터복사 및 rds로 전송
    • ec2와 연결
    • 장고서버구동
    • read replica / multi-az / rds삭제

1. RDS

  • 관계형 DB
  • AWS에서 사용될 수 있는 DB의 종류는 다음과 같다
    • Microsoft SQL, Oracle, Mysql, Postgre, MariaDB
    • Aurora : AWS에서 제공하는 RDS. 프리티어가 없다.
  • 모든 RDS는 자기만의 고유한 endpoint를 가지며, 이를 통해 식별된다

 

Data warehousing

  • 방대한 양의 데이터를 로드할 떄 주로 사용
  • 따라서 Business Intelligence와 같이 방대한 양의 데이터를 기반으로 하는 분석 등에 사용된다.

 

OTLP vs OLAP

  • OLTP : Insert와 같이, 종종 사용되어지거나 규모가 작은 데이터를 실시간으로 불러올때 사용되는 SQL 쿼리가 필요할 때 유용
    • ex) Order #210에 해당되는 customer의 이름, 주소, 시간 정보를 DB에 삽입(insert)
  • OLAP : Data warehousing처럼 방대한 양의 데이터를 불러올 때 주로 사용. 주로 덩치가 큰 SELECT 쿼리가 사용됨
    • ex)특정 회사 부서 전체의 Profit, Products

2. DB back-ups

  • db의 백업기능
  • automated backups(자동백업)과 DB snapshots(데이터베이스 스냅샷)이 존재함

 

Automated Backups(AB)

  • Retention Period(1~35)일 사이의 어떤 시간으로든 DB를 돌아가게 할 수 있음
  • AB는 그날 생성된 스냅샷과 Transaction logs(TL)을 참고함
    • 예를 들어, 현재가 1월 5일이고 1월 2일의 어느순간으로 돌아가기를 원한다면, 1월 2일의 스냅샷과 log를 참조하여 DB를 복구한다. 굉장히 효율적인 방식
  • 디폴트로 AB기능이 설정되어 있으며 백업을 위한 정보는 S3에 저장한다.
    • 참고)S3는 프리티어의 한계가 존재하며, 그 한계는 RDS와 같다. 즉 RDS가 10GB짜리라면 S3도 10GB짜리
  • S3 bucket에 백업정볼르 넣는 동안 약간의 suspension(latency, 지연)이 존재할 수 있음
  • instance가 사라지면 백업정보도 모두 같이 사라진다.

 

DB snapshot

  • 마치 어떤 순간을 카메라에 담듯, DB의 특정 순간을 담아두는 것
  • 주로 사용자에 의해 특정 시점이 저장된다
  • 원본 RDS instance가 사라져도, 해당 RDS인스턴스의 스냅샷이 존재한다. 따라서 스냅샷 만으로 RDS인스턴스를 복원가능

 

백업을 통해 복원된 DB 특징

  • 원본 DB와 완전히 다른 인스턴스(객체)가 됨
  • 즉 완전히 다른 endpoint를 가진다.

3. Multi AZ / Read Replicas

Multi AZ(Availability Zone)

  • 문제가 발생했을 때 복구를 위한 기능(Disaster recovery). 성능과는 일절 상관이 없다.
  • 기존 RDS DB에 무언가 변화가 생기면, AZ존에 똑같은 복재본이 만들어지며, 마치 동기화가 된 것처럼 원본의 변화가 발생할 때 마다 그때그때 복재본에 반영됨
  • 원본 RDS DB에 문제가 생길 시, 자동으로 다른 AZ의 복제본을 사용하여 복원
    • 예를 들어, 세개의 EC2서버가 '가'라는 RDS를 참조하고 있을 때, '가-1'라는 '가' RDS의 복재본이 AZ존에 생성
    • '가-1'는 '가' RDS와 연동되어 모든 변화가 반영
    • '가' RDS에 문제가 발생시, '가' RDS는 자동으로 연결을 '가-1'로 넘김. 이러한 절차덕에 재해가 발생해도 복구속도가 매우빠르다.
  • 무엇보다 AWS에 의해 자동으로 관리가 이루어짐(우리가 뭘 할 필요가 없다)

 

Read replica

  • 원본 DB의 읽기 전용 복제본으로, 성능극대화를 위해 사용됨. 재해복구와는 일절 상관이 없다
    • 수많은 유저가 DB를 읽으려 할때, 유저들을 여러개의 읽기전용 복제본DB로 분배하여 서버의 부하를 감소시킴
    • ex) 세개의 EC2가 하나의 RDS를 참조할 때, 두개의 read replica를 더 만들어서 read기능을 RDS&Replica 하나씩에 분배해준다
  • rds당 최대 5개의 read replica가 생성될 수 있음
  • read replica의 read replica도 생성이 가능하다(물론 이런 경우 latency가 좀 생기긴함)
  • 각각의 replica는 자기만의 고유한 endpoint가 존재함

4. Elastic Cache

  • rds의 더 효율적인 퍼포먼스를 위함(사실은 별개의 기능이긴 함)
  • 클라우드 내에 in-memory 캐시를 만들어줌
    • DB에서 데이터를 읽어오는 게 아니라 캐시에서 데이터를 읽어옴. 당연히 그 속도는 훨씬 빠름
    • Read-Heavy 어플리케이션에서 상당한 Latency 감소 효과를 누림
  • 실시간 검색어 탑10 처럼, 많은 사람들에게 동시다발적으로 읽히기 쉬운 대상을 캐쉬로 만들어 데이터의 빠른 로딩을 도움
  • Memcached와 Redis두가지의 Elastic Cache가 존재

 

Memcached

  • Object 캐쉬 시스템으로 꽤나 훌륭한 퍼포먼스를 가짐
  • Elastic Cache는 Memcached의 프로토콜(규칙,규약)을 디폴트로 따름
  • EC2 Auto Scaling처럼 데이터의 사용량에 따라, 크기가 자동으로 커졌다 작아졌다 함 
  • 오픈소스(무료)
  • 가장 단순한 캐싱 모델이 필요하거나, 캐시 크기가 자동으로 조절되어야 할때 주로 사용

 

Reddis

  • key-value, set, list와 같은 형태의 데이터를 in-memory에 저장 가능(memcached에 비해 데이터의 구조가 있다)
  • 오픈 소스
  • Multi-AZ 지원(즉 재해복구기능이 있다!)
  • List,Set과 같은 데이터셋이 필요하거나 랭킹의 정렬이 필요하거나 Multi Az기능이 필요할 경우 사용

5. RDS 실습 : RDS접속 / EC2연결 

  • rds를 직접 생성하고 써봄
  • 참고) 모든 프로젝트마다 db를 계속 생성할 필요가 없다. 하나의 db가 있으면 그 안에서 database를 늘려주면 되는 것임

 

파라미터 그룹 생성

  • rds생성의 사전작업 같은 느낌
  • 생성할 rds의 환경설정(언어..)에 관해 정리하고, 해당 환경설정의 값을 나중에 rds를 생성할 때 적용시켜줌
  • 생성된 파라미터 그룹 선택
    • 파라미터 값에 chracter_set입력 > 나오는 모든 파라미터의 값을 utf8mb4로 변경
    • collat 입력
      • collation_connection : utf8mb04_general_ci
      • collation_server : utf8mb04_unicode_ci

 

RDS 생성

  • rds > 대쉬보드 > 데이터베이스 생성
  • 데이터베이스 생성방식 선택
    • 표준생성
  • 엔진옵션
    • MySQL선택
    • 버전은 적당히 선택(영상에서는 5.7.26을 사용하였음)
    • 참고)엔진으로 아마존 오로라를 사용한다면 프리티어를 사용할 수 없다
  • 템플릿
    • 프리티어
  • 설정
    • 인스턴스 식별자  : RDS이름
    • 자격증명설정 : 이름과 비밀번호 설정. mysql의 계정명&비밀번호 같은 것임
  • DB인스턴스 크기
    • 버스터블 t클래스 
    • t2와 t3를 고를 수 있는데 t2(db.t2.micro)선택
    • 참고)t2와 t3의 차이
      • t시리즈는 기본 성능을 default로 유지하다가 트레픽이 과하게 몰리는 등 기준 이상의 성능이 필요할 때 버스트 기능이 동작한다.
      • 버스트 기능이 동작되면 인스턴스마다 가지고 있는 '크레딧'을 소모하여 기준 이상의 성능을 발휘할 수 있게 된다.
      • 크레딧을 다 소모할 경우에도 비용을 추가적으로 지불하면 버스트 모드를 계속사용할 수 있다.
      • t2는 크레딧이 다 소모되면 추가적인 과금없이 버스트모드가 종료되도록 기본설정이 되어 있음
      • t3는 크레딧이 다 소모될 경우 자동으로 비용을 추가지불하여 버스트모드가 계속 실행되도록 설정되어 있음.
  • 스토리지
    • 범용SSD
    • 할당된 스토리지 defualt이자 최소인 20 선택
    • 스토리지 자동 조정 사용(default)
    • 최대 스토리지 임계값 1000
  • 가용성 및 내구성
    • multi-AZ에 권한
    • 프리티어일 경우 권한X
  • 연결
    • VPC : 선택되어 있는 default값 선택
    • 서브넷 그룹 : 기본값 선택
    • 퍼블릭 엑세스 가능
      • 아니요(인프런 실습)
      • 예(위코드 실습) > 다른 사람들이 접속할 수 있게 하려면 이걸 선택해야 함!
    • vpc보안그룹 생성
      • 이름 : RDS-SG
    • 가용영역 : 기본설정없음
    • DB포트 : 3306(기본값)
  • 인증
    • 암호인증
  • 추가구성
    • 적당히 이름지어주고 패스
  • 그외 나머지는 패스하고 데이터베이스 생성 선택

 

RDS접속(터미널에서)

  • 포트를 우선 열어줘야 한다
  • 생성된 rds는 각각의 엔드포인트가 있음. 마치 ip주소와 같이 rds를 식별해주는 역할을 하며, 엔드포인트로 rds에 접속도 가능
  • 다음과 같이 터미널에 입력하여 접속이 가능하다
    • mysql -h 'rds의 엔드포인트' -u root -p
#형식
mysql -h 'rds의 엔드포인트' -u root -p

#예시
mysql -h terrabox-8028.c5l6i4hlmljq.ap-northeast-2.rds.amazonaws.com -u root -p

 

RDS접속(장고서버에서)

  • 장고서버에서 RDS에 접속하려면, settings(my_settings)에서 db관련된 부분을 손봐야 한다.
  • 참고로 장고서버가 EC2에 띄워진다고 해도, EC2서버에 있는 장고서버가 RDS에 접속하므로 똑같이 설정해줘야 함
  • 암튼 아래와 같이 settings.py를 수정하기만 rds에 접속됨
#형식
DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db이름',
        'USER': '마스터 사용자 이름',
        'PASSWORD': 'rds 서버접속암호',
        'HOST': 'rds 엔드포인트',
        'PORT': '3306',
    }
}


#예시
DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'TerraBox',
        'USER': 'root',
        'PASSWORD': 'password~',
        'HOST': 'terrabox-8028.c5l6i4hlmljq.ap-northeast-2.rds.amazonaws.com',
        'PORT': '3306',
    }
}

 

MySQL 데이터복사

  • 온라인 환경에 db를 띄웟으면 이제 로컬 my sql에서 데이터를 덤프파일로 만들어서 가져와야 함
  • 다음과 같이 입력하면 덤프 파일이 생성된다.
    • mysqldump -u root -p '덤프뜰테이블명' > '덤프 파일명'
#예시
mysqldump -u root -p TerraBox > TerraBox.sql
  • 그 후, 덤프파일을 넣어주려는 db(aws에 띄운 db)에 database를 만들어준다. (그래야 덤프파일을 넣어줄 수 있음)
mysql> create database TerraBox character set utf8mb4 collate utf8mb4_general_ci;

 

  • 이제 데이터를 넣어주면 끝
    • mysql -h 엔드포인트 -u root -p 'DB명' < 덤프파일명
mysql -h terrabox-8028.c5l6i4hlmljq.ap-northeast-2.rds.amazonaws.com -u root -p TerraBox < TerraBox.sql

 

EC2와 연결

  • EC2와 RDS를 연결시켜주려면, 보안그룹을 연결시켜줘야 한다.
    • RDS > VPC 보안그룹 클릭 > 인바운드 > 인바운드 규칙 편집 > 소스의 내용을 연결하려는 EC2가 속해있는 보안그룹과 동일하게 해줘야 함
    • '기존 IPv4 CIDR 규칙에 a 참조된 그룹 ID을(를) 지정할 수 없습니다.' 와 같은 에러가 발생하면서 인바운드 규칙이 편집되지 않을 수 있는데, 그때 인바운드 규칙자체를 삭제하고 새로 만들어주면 된다.

 

EC2환경세팅 for django

  • django를 실행시키기 위한 환경을 이것저것 설치
    • EC2서버 접속 
    • miniconda 설치
      • wget으로 miniconda 최신버전 파일 설치. wget뒤에 오는 부분은 miniconda 홈페이지에서 linux최신버전의 링크주소를 복사해서 들고온 것임
      • chmod +x 로 권한부여 > 해당 경로(./)에서 파일 실행
      • source 등록
      • 마지막으로 'sudo su' 를 입력해서 루트 유저가 되어야 base가 보임
    • sudo apt-get update / sudo yum update
    • gcc, mysqlclient 설치
      • gcc를 설치해야 mysqlclient가 설치됨
    • git 설치 이후 git clone
#miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-x86_64.sh
chmod +x Miniconda3-py39_4.11.0-Linux-x86_64.sh
./Miniconda3-py39_4.11.0-Linux-x86_64.sh
source .bashrc #이거 해야 base가 보임
sudo su

#apt-get / ym update
sudo apt-get update / sudo yum update

#gcc, mysqlclient설치 - ubuntu
sudo apt-get install gcc
sudo apt-get install mysqlclient

#gcc, mysqlclient설치 - amazon linux
sudo yum install gcc
sudo yum install mysql

#git 설치
sudo apt-get install git / sudo yum install git 

#git clone
git clone -b ProductListView-GET --single-branch https://github.com/wecode-bootcamp-korea/32-2nd-TerraBox-backend.git

 

  • 이제 그러면 장고 내부의 파일들을 설치 / 수정해줘야 함
    • 우선 requirements.txt파일 설치
    • 이때 아마존 리눅스라면 mysqlclient가 존재하지 않아(그래서 대신 위에서 mysql설치) requirements에 있는 모든 것들이 설치되지 않음. 따라서 requirements.txt에서 mysqlclient를 제거하고 설치해야 한다.
#requirements설치
pip install -r requirements.txt

 

  • settings.py에가서 ALLOWED_HOSTS에 EC2인스턴스의 퍼블릭 ipv4 주소입력
ALLOWED_HOSTS = ['*',"15.164.163.31","15.164.163.31:8000"]

 

  • my_settings.py 파일 생성 > 로컬의 my_settings.py내용을 복사해서 넣어줌
    • 이때 db내용의 host에 rds의 엔드포인트 값을  Name에 RDS이름을 넣어줘야 함

 

  • 그러면 이제 runserver를 돌리고 postman등으로 실행시켜보면 아무런 문제없이 작동된다
  • 혹시 여기서 안된다면, EC2의 보안그룹에 포트번호 8000을 추가했는지 확인해 볼 것

 

Gunicorn & nohup의 사용

  • django의 manage.py runserver는 단일스레드로 작동하므로, 개발단계에서 테스트용으로는 적합하나 request가 많은 환경에서는 부적합함
  • 멀티스레드를 지원하는 gunicorn을 설치하여 배포
  • ssh세션이 끊어져도(서버가 종료되어도) 서버를 동작시켜주기 위해 nohup이라는 툴을 써서 gunicorn을 백그라운드에서 계속 작동될 수 있게 함
  • 그냥 gunicorn으로 돌리든, nohup으로 돌리든 manage.py가 있는 경로에서 포트 뒤에 다음을 입력해줘야 한다. 
    • wsgi가 있는 폴더명.wsgi &
    • &는 백그라운드로 돌린다는 것을 의미함
  • ps -ef | grep python 명령어를 사용해 현재 잘 작동되는지를 확인할 수 있음

  • 작동을 멈추려면 ps -ef | grep python 결과 나오는 맨 위의 포트번호를(위의 사진에서는 8315) 'KILL 포트'명령어로 죽여주면 된다
    • ex)kill 8315
  • 추가) kill 해도 포트가 종료되지 않을 수 잇음
    • 만약 기존에 포트를 사용중이라, That port is already in Use에러가 날 경우, 해당 포트관련 실행된 것들을 제거할 수 있음
    • sudo lsof -t -i tcp:8000 | xargs kill -9
  • 추가)다음과 같은 에러가 있었음
#gunicorn설치
pip install gunicorn

#백그라운드로 안돌리고 그냥 gunicorn을 거처 장고서버를 돌림 > 서버가 꺼지면 꺼짐 > 사실상 장고로 돌리는 것과 다를바가 없다
gunicorn --bind=0.0.0.0:8000 폴더명.wsgi
gunicorn --bind=0.0.0.0:8000 Terrabox.wsgi

#백그라운드로 돌림 > 서버가 꺼져도 계속 실행
nohup gunicorn --bind=0.0.0.0:8000 폴더명.wsgi &
nohup gunicorn --bind=0.0.0.0:8000 TerraBox.wsgi &

#작동확인
ps -ef | grep python

#서버를 종료
kill "포트번호"
kill 8315

#해당 포트관련 실행된 것들을 제거할 수 있음
sudo lsof -t -i tcp:8000 | xargs kill -9

 

  • 추가)하나의 서버에서 여러개의 서버를 구동하고 싶을 수 있음
    • 이때는 포트를 추가로 열어주고, 열어준 포트번호로 gunicorn을 돌려주면 됨
    • 다음을 따라서 EC2서버에 원하는 포트를 생성
    • 그 후, 설정한 포트에 맞게 백그라운드로 gunicorn생성
      • 예를 들어, 8001번 포트를 EC2에 새로 열었다면 다음의 명령어를 입력
      • nohup gunicorn --bind=0.0.0.0:8001 TerraBox.wsgi &

 

 

 


6. 기타 : Read_replic, Multi-AZ, RDS삭제

Read replica 생성

  • 읽기작업의 성능을 개선시켜줄 수 있는 read replica
  • DB > DB선택 > 작업 > 읽기 복제본 생성
  • 생성하면서 딱히 뭔가 건드릴 설정은 없음. 생성하면 다음과 같이 복제본이 생성된다.

 

Multi-AZ 사용

  • 생성된 인스턴스 클릭 > 수정
    • 가용성 및 내구성 > 다중 AZ배포 > 예(대기 인스턴스 생성)
    • 이렇게 하면 RDS가 Multi-AZ를 사용하는 상태가 되며, 복구를 위한 기능이 추가된 것임

 

특정시점으로 복원(snapshot)

  • 특정 시점으로 복원을 위해 RDS는 스냅샷을 남김
  • 좌측에 있는 스냅샷 란으로 들어가면 스냅샷 내역을 볼 수 있다
  • RDS 선택 > 특정 시점으로 복원을 누르면 특정시점으로 복원할 수 있다
  • 만약 특정 시점을 저장하듯이 스냅샷을 찍고 싶다면
    • RDS선택 > 작업 > 스냅샷 생성 > 그러면 수동으로 snapshot을 생성할 수 있음

 

RDS 삭제

  • 작업 > 삭제
  • 만약 삭제 방지 기능이 활성화 되어 있다면, 해당 기능을 비활성화 해줘야 함
    • rds선택 > 수정 > 삭제 방지 기능 비활성화(맨 아래에 있음)

 

추가)인프런 실습하면서 발생한 에러

  • EC2접속 문제
    • EC2에 생성시 보안그룹에 http를 위한 보안그룹을 생성해줘야함(위치무관으로)
    • 그리고 가끔식 https로 접속되는데 http로 접속되도록 앞에 http://를 붙여줘야 함
    • 만약 https로 접속하고 싶으면 https를 위한 보안그룹도 열어줘야 함
  • 보안그룹 연결 문제
    • EC2와 RDS의 보안그룹을 연결할 때, '기존 IPv4 CIDR 규칙에 a 참조된 그룹 ID을(를) 지정할 수 없습니다.' 와 같은 에러가 발생함
    • 뭔진 모르겠는데 걍 인바운드 규칙자체를 삭제하고 새로 만들어주면 해결된다..
 

'서버 > AWS' 카테고리의 다른 글

S3  (0) 2022.05.15
EC2(Elastic Compute Cloud), EBS, ELB ,Route53  (0) 2022.05.10
IAM(identity and access management)  (0) 2022.05.07

BELATED ARTICLES

more