[실습 목표]
- EC2를 이용하여 Web Server와 DB Server를 배포
- RDS를 통한 DB 배포
- 개발/테스트 버전의 RDS를 이용하여 2가지를 실습
- Multi - AZ를 통한 내결함성
- Read Replica를 이용한 분산 서비스
구성 : 1개의 웹서버 인스턴스 + 1개의 DB 서버 인스턴스
# IP확인 및 DBSrv ping 테스트
ip a
ping 10.1.2.10
# DBSrv 로 MySQL 접속 (계정 정보: root/qwe123)
mysql -h 10.1.2.10 -uroot -pqwe123
# IP확인
ip a
# MySQL 접속 (계정 정보: root/qwe123)
mysql -uroot -pqwe123
1. 사용자는 DB에 접근하기 위해 HTML을 이용하게 된다. HTML파일에 태그 사용하여 입력한 정보가 서버의 PHP 파일에 전달된다.
2. 사용자가 입력한 값은 웹 서버(PHP)로 전달이 된다. MySQL과 다른 으용프로그램과 연계
3. PHP 스크립트는 MySQL에 데이터로 입력된다.
# 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 검색 > 데이터베이스 생성
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가 재부팅이 되거나 혹은 업데이트를 받게될 수도 있음
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가 재부팅이 되거나 혹은 업데이트를 받게될 수도 있음
# 변수 지정
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를 제공하지 않습니다. 이를 사용하기 위해서는 DB를 '다중 AZ 배포'로 수정해야 합니다.
# 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=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