6주차. 데이터베이스 서비스 (실습)

송현아·2021년 10월 5일
0
post-thumbnail

[실습 목표]

  1. EC2를 이용하여 Web Server와 DB Server를 배포
  2. RDS를 통한 DB 배포
  3. 개발/테스트 버전의 RDS를 이용하여 2가지를 실습
    • Multi - AZ를 통한 내결함성
    • Read Replica를 이용한 분산 서비스

⚙️ CloudFromation으로 환경 배포

  • CloudFormation 스택 생성 - 링크 클릭 후 템플릿 파일로 기본 환경 자동 배포 됩니다.
  • 1개의 VPC 내부에 4개의 Subnet

📌 WebSrv에서 DBSrv 접근

구성 : 1개의 웹서버 인스턴스 + 1개의 DB 서버 인스턴스

  • WebSrv 인스턴스 연결

# IP확인 및 DBSrv ping 테스트
ip a
ping 10.1.2.10
# DBSrv 로 MySQL 접속 (계정 정보: root/qwe123)
mysql -h 10.1.2.10 -uroot -pqwe123
  • DBSrv 인스턴스 연결

# IP확인
ip a
# MySQL 접속 (계정 정보: root/qwe123)
mysql -uroot -pqwe123

🔎 HTML과 PHP, MySQL 관계

1. 사용자는 DB에 접근하기 위해 HTML을 이용하게 된다. HTML파일에 태그 사용하여 입력한 정보가 서버의 PHP 파일에 전달된다.
2. 사용자가 입력한 값은 웹 서버(PHP)로 전달이 된다. MySQL과 다른 으용프로그램과 연계
3. PHP 스크립트는 MySQL에 데이터로 입력된다. 
  • MariaDB monitor 에서 기본적인 SQL 문 사용 (WebSrv 인스턴스)

# DB 서버의 상태 정보
MariaDB [(none)]> status;

# 데이터베이스(=스키마) 확인
SHOW DATABASES;

# employees 데이터베이스 선택 하기
USE employees;
MariaDB [(none)]> **USE employees;**
MariaDB [**employees**]>

# 테이블 확인
SHOW TABLES;

# 테이블 필드와 타입 등 정보 확인
DESC employees;

# employees 테이블 조회 하기
SELECT * FROM employees;
SELECT * FROM employees LIMIT 10;
SELECT * FROM employees LIMIT 100;

# 특정 열(컬럼=필드) 기준 오름/내림차순으로 정렬 조회 하기
# -- 공백이 있는 개체의 이름 사용 시는 백틱(backtick) `` 으로 묶어줘야 하나의 이름으로 인식함
SELECT * FROM employees ORDER BY `emp_no` DESC LIMIT 100;
SELECT * FROM employees ORDER BY `birth_date` ASC LIMIT 100;

# 특정 열(컬럼) 만 출력
SELECT first_name, last_name, gender FROM employees LIMIT 50;

# 특정 행(=로우=레코드)만 출력 - Mary 이름(first_name) , Baba 성(last_name)
SELECT * FROM employees WHERE first_name = 'Mary';
SELECT * FROM employees WHERE last_name = 'Baba';

📌 RDS(MySQL) 배포

RDS 검색 > 데이터베이스 생성

[첫번째 RDS]

1. 데이터베이스 생성방식 선택 - 표준생성
2. 엔진유형 - MySQL
3. 템플릿 - 프리티어
4. 설정
DB 인스턴스 식별자 - hyun-test1
마스터사용자 이름 - root
마스터 암호(암호확인) : qwe12345
5. DB 인스턴스 클래스 : 버스터블 클래스(t 클래스 포함) db.t2.micro
6. 스토리지 - 디폴트
7. 다중 AZ 배포 X(프리티어 버전이라 선택이 안됨)
8. 연결
VPC : DB-VPC1
퍼블릭액세스 - 아니요
VPC 보안 그룹 : ##-VPC1SG3-## 포함된것 선택 , 기본 default 는 제거
Database 접근을 위해 만든 DB port(3306) 전용의 정책이 들어가있음
가용 영역 : ap-northeast-2a
추가 구성 : 클릭
9. 추가구성
초기 데이터베이스 이름 : sample
DB 파라미터 그룹 : ##-mydbparametergroup-## 포함된것 선택
백업 보존 기간 : 0일(백업을 하지 않겠다라는 의미)
모니터링 - 활성화 X
유지 관리 기간 : 선택 기간 → 일요일 , 01 :00 , 0.5시간
지정하지 않으면 업무 중에 aws RDS가 재부팅이 되거나 혹은 업데이트를 받게될 수도 있음

[두번째 RDS]

1. 데이터베이스 생성방식 선택 - 표준생성
2. 엔진유형 - MySQL
3. 템플릿 - 개발/테스트
4. 설정
DB 인스턴스 식별자 - hyun
마스터사용자 이름 - root
마스터 암호(암호확인) : qwe12345
5. DB 인스턴스 클래스 : 버스터블 클래스(t 클래스 포함) db.t2.micro (이전 세대 클래스 포함 체크)
6. 스토리지 - 디폴트
7. 다중 AZ 배포 - 스토리지 - 디폴트다중 AZ 배포(DB를 복제해 사용하기 위해 사용함)
8. 연결
VPC : DB-VPC1
퍼블릭액세스 - 아니요
VPC 보안 그룹 : ##-VPC1SG3-## 포함된것 선택 , 기본 default 는 제거
Database 접근을 위해 만든 DB port(3306) 전용의 정책이 들어가있음
가용 영역 : ap-northeast-2a
추가 구성 : 클릭
9. 추가구성
초기 데이터베이스 이름 : sample
DB 파라미터 그룹 : ##-mydbparametergroup-## 포함된것 선택
백업 보존 기간 : 35일(백업을 하지 않겠다라는 의미)
모니터링 - 활성화 X
유지 관리 기간 : 선택 기간 → 일요일 , 01 :00 , 0.5시간
지정하지 않으면 업무 중에 aws RDS가 재부팅이 되거나 혹은 업데이트를 받게될 수도 있음

[WebSrv와 RDS 연결]

# 변수 지정
RDS1=프리티어rds 엔드포인트
RDS2=개발/테스트버전RDS 엔드포인트

# 변수 지정 확인
echo $RDS1
echo $RDS2

# dig 질의 - 도메인 조회(subnet 주소 확인)
dig +short $RDS1
dig +short $RDS2

# mysql 접속 - exit로 나갈 수 있음
mysql -h $RDS1 -uroot -pqwe12345
mysql -h $RDS2 -uroot -pqwe12345

# 상태정보 및 데이터베이스 확인
status;
show databases;
WebSrv 의 index.php 수정 후 WebSrv 에서 AWS RDS1 DB 사용
원래는 EC2로 배포한 DBsrv를 참조하고 있었지만, RDS로 바꾸는 것
WebSrv 의 Public IP로 접근하면 사용 DB가 rds로 바뀜
# 상태정보 및 데이터베이스 확인 - 다 바꾼 후 ctrl+x > Y > enter
sudo su - 
nano /var/www/html/index.php

## 아래 DB 주소와 암호를 변경
<?php
define('DB_SERVER', '자신의RDS1 엔드포인트 주소');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'qwe12345');
define('DB_DATABASE', 'sample');
?>

📌 RDS Multi-AZ

기본적으로 프리티어 RDS의 경우에는 Multi-AZ를 제공하지 않습니다. 이를 사용하기 위해서는 DB를 '다중 AZ 배포'로 수정해야 합니다.

[개발/테스트 RDS에 적용하기]

  • WebSrv에서 index.php를 수정하여 WebSrv에서 AWS RDS2 DB를 사용하도록 수정
# RDS 확인하기
[root@WebSrv ~]# RDS2=swh-test2.ckm3nprg4gom.ap-northeast-2.rds.amazonaws.com
[root@WebSrv ~]# echo $RDS2
swh-test2.ckm3nprg4gom.ap-northeast-2.rds.amazonaws.com
[root@WebSrv ~]# dig +short $RDS2
10.1.4.233

# 상태정보 및 데이터베이스 확인 - 다 바꾼 후 ctrl+x > Y > enter
sudo su - 
nano /var/www/html/index.php

## 아래 DB 주소와 암호를 변경
<?php
define('DB_SERVER', '자신의RDS1 엔드포인트 주소');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'qwe12345');
define('DB_DATABASE', 'sample');
?>
변경 조회를 위해 다른 콘솔창에 반복조회 돌려두기
# mysql 접속 후 데이터 확인 반복 → 아래 재부팅 시 동작 확인을 위함 (ctrl+c 로 탈출가능)
while true; do mysql -h $RDS2 -uroot -pqwe12345 -e "USE sample;SELECT * FROM EMPLOYEES;"; date; sleep 1; done

# (옵션) dig 조회 → IP 변경 확인을 위함
while true; do dig +short $RDS2; date; sleep 1; done
  • 변경 조회를 위해 다른 콘솔창에 반복조회 돌려두기
# mysql 접속 후 데이터 확인 반복 → 아래 재부팅 시 동작 확인을 위함 (ctrl+c 로 탈출가능)
while true; do mysql -h $RDS2 -uroot -pqwe12345 -e "USE sample;SELECT * FROM EMPLOYEES;"; date; sleep 1; done

# (옵션) dig 조회 → IP 변경 확인을 위함
while true; do dig +short $RDS2; date; sleep 1; done
  • 재부팅하기
    • RDS2 → 작업 → 재부팅 → '장애 조치로 재부팅 (Check)' → 확인
      • 백업서버를 사용할 것이냐는 물음과 같음
    • 약 2분 20초 정도 장애로 접근이 안되고 난 후 다시 접근이 됨
      • 다른 AZ에 있는 백업본으로 자동으로 대체됨
      • 반복조회에서 ip가 변경되는 것을 확인할 수 있음

📌 RDS Read Replica

  1. RDS2 작업 → 읽기 복제본 생성 ⇒ 10분 정도 시간 소요
    • DB 인스턴스 식별자 : swh-test2-readonly (현재 AWS 리전에서 AWS 계정이 소유하는 모든 DB 인스턴스에 대해 유일, 각자 편하게 설정)
    • AWS 리전 : Asia Pacific (Seoul)
    • 다중 AZ 배포 : 대기 인스턴스를 생성하지 마십시오
  2. ReadReplia Endpoint 확인 및 mysql 접속 후 확인
RDS2=gasidards2.cb79jlim4dyq.ap-northeast-2.rds.amazonaws.com
RDS2Read=gasidards2-readonly.cb79jlim4dyq.ap-northeast-2.rds.amazonaws.com

# mysql 접속 후 데이터 확인
while true; do mysql -h $RDS2 -uroot -pqwe12345 -e "USE sample;SELECT * FROM EMPLOYEES;"; date; sleep 1; done
while true; do mysql -h $RDS2Read -uroot -pqwe12345 -e "USE sample;SELECT * FROM EMPLOYEES;"; date; sleep 1; done

# 마스터 DB에서 정보 확인 : 마스터 DB에 바이너리 로그를 이용하여 복제를 구현
mysql -h $RDS2 -uroot -pqwe12345 -e "show master status;"
+----------------------------+----------+--------------+------------------+-------------------+
| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-changelog.000010 |      156 |              |                  |                   |
+----------------------------+----------+--------------+------------------+-------------------+

# 읽기 복제본 DB에서 정보 확인
mysql -h $RDS2Read -uroot -pqwe12345 -e "show slave status\G"
                  Master_Host: 172.23.1.176
                  Master_User: rdsrepladmin
              Master_Log_File: mysql-bin-changelog.000010 ⇒ 마스터 DB의 바이너리 로그
          Read_Master_Log_Pos: 156
               Relay_Log_File: relaylog.000009
                Relay_Log_Pos: 277
        Relay_Master_Log_File: mysql-bin-changelog.000010 ⇒ 복제 동기화를 실행하는 바이너리 로그
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
					Exec_Master_Log_Pos: 156

0개의 댓글