5장 확장 가능한 데이터베이스 서버 만들기
1. 데이터베이스(Database)
데이터베이스(Database)
- 여러 사람에 의해 공유되어 사용 될 목적으로 통합하여 관리되는 데이터의 집합
- Database → ‘DB’라 한다.
- 특정 다수의 사용자들에게 필요한 정보를 제공하는 작업을 하거나
- 조직내 필요한 정보를 체계적으로 저장 및 보관하여 사용자들에게 제공하는 필요한 핵심 서비스
2. RDBMS(Relational Database Management System)
RDBMS(Relational Database Management System)
- 관계형 데이터베이스란, 가장 많이 사용되고있는 데이터베이스의 종류이다
- 데이터 간 사전에 정의된 관계가 있고, 연관 관계가 있는 항목들의 모음
- 열과 행으로 이루어진 테이블(Table)로 이루어져 있다.
- 데이터의 각 행은 기본키(Primary Key)라 부르는 고유의 식별자로 구분
- 여러 테이블에 있는 행들은 외래키(Foreign Key)를 사용하여 상호 연결
- 사용자와 관계형 데이터베이스를 연결시켜주는 표준 검색어를 SQL이라 한다.
- SQL 문장은 관계형데이터베이스에 있는 데이터를 직접 조회, 보고서 추출에 사용
대표적인 관계형 데이터베이스 관리시스템(RDBMS)
- Oracle - MySQL, Microsoft SQL Sever, PostgreSQL, Maira DB 등
- AWS에서는 RDS(Relational Database Services)라는 서비스를 통해 RDBMS 제공
- Oracle, MySQL, MSSQL, Amazon Aurora(오로라)와 같은 다양한 RDBMS 서비스 형태 제공
3. RDS(Relational Database Services)
RDS(Relational Database Services)
- 클라우드에서 관계형 데이터베이스를 더욱 간편하게 설정, 운영 및 확장할 수 있는 서비스
- 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같은 시간 소모적인 관리 작업 자동화하여 비용 효율적이고 크기 조정가능한 데이터베이스 서비스 제공
Amazon RDS
- 여러 데이터베이스 인스턴스 유형(메모리, 성능 또는 I/O 최적화)으로 제공
- Amazon Aurora, PostgreSQL, MySQL, MariaDB, Oracle, Microsoft SQL Server를 비롯하여 6개의 익숙한 데이터베이스 엔진 중에서 원하는 DBMS 선택 가능
- AWS Database Migration Services를 사용하여 기존 Amazon RDS로 손쉽게 마이그레션 가능
구분 | 내용 |
서비스명 | Amazon RDS(Relational Database Services) |
설명 | 주로 사용되는 6개의 데이터베이스 엔진 중에서 선택할 수 있는 아마존 관계형 데이터베이스 서비스 |
주요 특징 | - 관리 용이성 : 인프라의 프로비저닝/DB 설치 및 유지 관리 불필요 - 뛰어난 확장성 : 서비스 중단 없이 서버 및 스토리지 확장 가능 - 가용성 및 내구성 : 안정성이 뛰어난 인프라 제공 (멀티 AZ) - 빠른 속도 : SSD 지원 스토리지 옵션 및 고성능 OLTP에 최적화된 옵션과 비용 효율적 범용 사례에서 옵션 선택 가능 - 보안 : 데이터베이스와 네트워크에 대한 액세스를 손쉽게 제어 |
프리티어 (Free Tier) |
- MySQL, PostgreSQL, MariaDB, Oracle BYOL, SQL Server 지원 - RDS 단일 AZ db.t2.micro 인스턴스를 750시간 무료 사용 - 가입 후 12개월 후 종료됨 |
4. RDS의 주요 특징
4-1 Amazon 클라우드 데이터베이스 서비스의 선택 사항
- AWS에서 데이터베이스 서비스를 사용하는 방법은 두가지로 구분 가능하다
첫번째, 직접 EC2에 데이터베이스를 설치하여 이용하는 것
- 본인이 사용하기 원하는 DB를 EC2 인스턴스에 직접 설치하여 운영하는 방법
- 기존 On-Premise에서 사용하는 DB를 그대로 사용 가능, 이질감 없음
- 다만 DB 제공 벤더사에 따라서는 클라우드용 라이선스를 운영하는 경우 있음
- EC2에 설치 운영 전 미리 파트너사를 통해 기존 라이선스를 사용 할 수 있는지 체크
두번째, AWS에서 직접 제공해주는 데이터베이스 서비스를 이용 하는 것
- AWS 관계형 데이터 베이스 서비스인 Amazon RDS
- NoSQL 기반의 중단 없는 확장성을 제공하는 Amazon DynamoDB
- 대용량 병렬 페타바이트급 데이터웨어(DataWare) 서비스 제공할 수있는 Amazon Redshift와 같은 서비스 제공
- 이러한 서비스 특징은 데이터베이스의 설치 및 운영/관리를 Amazon에서 직접 제공하므로
- 별도의 운영/관리 필요 없으며, 서비스의 용도 및 사용량에 따라 원하는 형태의 리소스 선택
- Amazon RDS의 경우 라이선스가 포함된 서비스, BYOL 라이선스용 서비스 같이 기존라이선스를 사욜할수 있는 서비스도 제공
4-2 Amazon RDS의 주요 특징
- Amzon RDS는 뛰어난 확장성, 빠르게 확장 가능한 가용성과 높은 보안성 제공
첫번째, 유연한 인스턴스 및 스토리지 확장
- RDS는 다양한 CPU/메모리 옵션을 제공한다.
- Cloudwatch와 연계를 통해 트래픽에 따른 증설 및 사용의 축소가 가능하다.
- DB의 데이터 저장 공간인 스토리지는 필요에 따라 유연하게 확장 가능하다.
- 일반적인 워크로드의 경우 General Purpose(SSD)를 사용
- 빠른 속도와 대용량의 처리가 필요한 경우 Provisioned IOPS(SSD)를 사용하여 최대 30,000 IOPS까지 I/O 성능을 조정하여 서비스를 할 수 있다.
- 접속이 빈번하지 않은 작은 워크로드의 경우 Magnetic을 사용하여 저렴한 비용으로 서비스가 가능하다.
두번째, 손쉽게 사용 가능한 백업 및 복원 기능
- RDS는 자동 백업 설정을 통해 손쉽게 백업이 가능하며, 특정 시점으로 손쉽게 복구할 수 있는 기능을 제공한다.
- 데이터베이스는 최대 35일까지 데이터를 보존할 수 있으며, 이렇게 백업된 **스냅샷(Snapshot)**을 통해 Database를 생성할 수도 있다.
세번째, 멀티 AZ(Availability Zone)를 통한 고가용성 확보
- **가용 영역(Availability Zone)**은 상호 간 물리적으로 분리된 독립적인 인프라를 제공한다.
- RDS는 멀티 AZ 기능을 활용하여 Region 내 AZ 간 데이터베이스 동기화(Synchronization) 구성이 가능하며, 주요 장애 상황 발생 시 자동으로 데이터베이스 Failover를 수행할 수 있도록 고가용성을 지원한다.
- MySQL은 읽기 트래픽을 자동 관리하는 Read Replica로 분산 서비스를 제공할 수 있다.
- 이를 통해 워크로드로 발생되는 읽기 서비스(Database Select)에 대한 부하를 분산처리 할 수 있다.
- 데이터베이스의 장애 발생 시 빠른 장애 복구가 가능하며, 리전 간 데이터 이전이 손쉽게 가능하다.
네번째, RDS 암호화(Encryption) 옵션을 통한 보안성 강화
- 모든 RDS는 옵션을 통한 One-Click을 통해 데이터에 대한 암호화 기능을 제공하며, 이는 데이터 백업, 스냅샷(Snapshot), Read Replica에도 적용된다.
- KMS를 통해 사용자가 생성하고 관리하는 키(Key) 사용이 가능하다.
- 다만 RDS DB 생성 시, 암호화 Enable 이후 암호화 Disable은 불가능하며, 암호화 DB에서만 암호화 Read Replica를 생성할 수 있다.
- 암호화되지 않은 백업을 암호화된 DB로의 데이터 복구는 불가능하다.
다섯 번째, Database Migration 서비스
- RDS는 AWS Database Migration Services를 통해 동족 혹은 다른 DB 엔진으로부터 RDS 로 데이터에 대한 Migration을 지원한다.
- 또한 EC2 또는 RDS 간의 데이터 리플리케이션을 통해 원하는 시점에 비용 효율적인 데이터베이스에 대한 데이터 이전을 지원한다.
5. 실습 : MySQL용 DB 인스턴스 생성, 클라이언트를 통한 DB 연결 및 삭제하기
5-1. MySQL용 DB 인스턴스 생성, 클라이언트를 통한 DB 연결 및 삭제하기
1. AWS 사이트에서 [서비스] → [데이터베이스] → [RDS] 로 이동한다.
2. RDS 페이지 접속 후, 왼쪽 [데이터베이스] 메뉴를 클릭한다.
3. 화면에서 [데이터베이스 생성] 버튼을 클릭한다.
4. [데이터 베이스 생성 방식] 선택 항목에서 [표준 생성]을 선택하고 하단의 [엔진 옵션]에서 MySQL 을 선택 후, 하단의 옵션 선택 목록으로 이동
5. [템플릿] 선택 항목에서 [프리티어] 선택 후 하단의 옵션 선택 항목으로 이동.
6. [설정] 항목에서 "DB 인스턴스 식별자", "마스터 사용자 이름", "비밀번호"를 입력 후 하단의 옵션 항목으로 이동
7. [DB 인스턴스 크기] 항목에서 "DB 인스턴스 클래스"의 "버스터블클래스(t클래스 포함) 선택 후 "db.t2.micro"를 선택한다.
8. [데이터베이스 생성] 페이지에서 추가 옵션을 구성하기 위해 다음 항목에 대해 구성 작업을 수행한다.
9. 5~10분 후, [데이터베이스] 메뉴를 눌러 신규 생성한 RDS 인스턴스를 클릭하면 다음과 같이 생성 완료된 인스턴스를 확인할 수 있다.
5-2. SQL 클라이언트 다운로드 및 DB 연결하기
1. MySQL Workbench를 다운로드 받기 위해 아래 링크로 이동하여 본인 PC의 플랫폼과 사양에 맞는 프로그램을 선택 후 [Download] 버튼을 클릭한다.
2. [로그인] 페이지에서 하단의 "No thanks, just start my download"를 클릭한다.
3. PC로 다운받은 프로그램 설치 작업을 수행한다.
4. 설치 완료된 프로그램을 실행 후 [MySQl Connections] 버튼을 클릭한다.
5. [Setup New Connection] 페이지에서 RDS 연결을 위한 IP 확인을 위해 [AWS RDS] 페이지로 이동한다.
6. [AWS Console의 RDS] 페이지에서 RDS 연결을 위한 "엔드포인트"를 확인한다.
7. MySQL Workbench Connection 화면에서 [Hostname] 항목에 RDS 엔드포인트의 정보를 입력 후, [Username]에 RDS 생성 시 사용한 마스터 계정 정보와 비밀번호를 입력 후 [Test Connection] 버튼을 눌러 연결 테스트를 수행한다.
5-3. DB 인스턴스 삭제
1. [데이터베이스] 페이지에서 [작업] → [삭제]를 클릭
2. 삭제 확인 페이지에서 "최종 스냅샷 생성 여부"의 체크를 해지하고, "인스턴스 삭제 시 시스템 스냅샷 및 특정 시점으로 복구를 포함한 자동화된 백업을 더 이상 사용할 수 없다는 점을 인정합니다." 체크 후, 아래 항목에 "delete me"를 입력하고 [삭제] 버튼 클릭
3. 데이터베이스의 상태가 "삭제중"으로 변경되고 삭제 작업이 진행된다.
6. 실습 : 웹 서버에서 실행되는 PHP 애플리케이션에 MySQL 데이터 베이스 연결하기
6-3. PHP가 포함된 Apache 웹 서버 설치
- 2장에서 생성한 EC2, 4장에서 생성된 VPC 사용
1. [서비스] → [컴퓨팅] → [EC2] → [인스턴스 시작] 버튼을 클릭하여 다음 페이지에서 Amazon Linux 2 AMI (HVM), SSD Volume Type 의 [선택] 버튼을 클릭
2. 다음 페이지에서 "t2.micro"를 선택 후, [다음: 인스턴스 세부 정보 구성] 버튼을 클릭
3. [인스턴스 세부 정보 구성] 페이지 [네트워크] 항목에서 "tutorial-vpc" 를 선택하고 [서브넷]은 "tutorial public", [퍼블릭 IP자동 할당] 은 "활성화"를 선택 후 [검토 및 시작] 버튼을 클릭한다.
4. [인스턴스 시작 검토] 페이지에서 [시작] 버튼을 누르고 [키 페어 선택] 페이지에서 "기존 키 페어 선택"을 누른 후 하단 체크박스 선택 후 [인스턴스 시작] 버튼 클릭
5. 인스턴스 생성 완료 후 마우스 오른쪽 버튼 클릭 후 [네트워크] → [보안 그룹 변경] 을 클릭한다.
7. PuTTy를 실행 후 EC2의 IP를 입력하여 접속 후 "login as: ec2-user"를 입력하여 로그인 한다.
8. 최신 버그 수정 및 보안 업데이트를 얻으려면 다음 명령을 사용하여 EC2 인스턴스의 소프트웨어를 업데이터한다.
sudo yum update -y
9. 업데이트 완료 후 "yum install" 명령을 사용하여 PHP 소프트웨어 패키지가 포함된 Apache 웹 서버를 설치한다.
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo yum install -y httpd mariadb-server
10. 다음 명령을 사용하여 웹 서버를 실행
sudo systemctl start httpd
11. [인스턴스 접속] 페이지로 이동 후, [퍼블릭 DNS(IPv4)] 항목의 DNS 정보를 복사 후 웹 사이트 접속 여부를 확인
12. 웹 브라우저에서 EC2의 Apache 웹 서버가 정상적으로 설정되면 다음과 같이 [Test Page]가 출력
13. SSH Console로 이동 후 다음과 같이 "chkconfig" 명렬을 사용하여 서버 부팅 시 웹 서버가 자동으로 시작될 수 있도록 설정한다.
sudo chkconfig httpd on
14. 지금 로그인 중인 ec2-user 로 웹 서버의 기본 루트 페이지 파일을 수정 변경 가능하도록 설정하기 위해 /var/www 디렉터리의 소유권 및 권한을 변경해야 한다.
다음의 명령을 사용해서 www 라는 그룹을 추가하고 /var/www 에 대한 소유권과 권한을 부여한다.
이후 EC2 를 SSH console로 다시 접속한다.
sudo groupadd www
sudo usermod -a -G www ec2-user
exit
15. EC2에 재접속 후 다음 명령어를 입력하여 ec2-user 가 group 에 추가되었는지 확인 한다.
16. /var/www 디렉터리 및 해당 콘텐츠의 그룹 소유권을 www 그룹으로 변경한다.
sudo chown -R root:www /var/www
17. /var/www 및 그 하위 디렉터리의 권한을 변경해서 그룹 쓰기 권한을 추가하고, 나중에 생성될 하위 디렉터리에서 그룹 ID를 설정한다.
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} +
18. /var/www 및 하위 디렉터리의 파일 권한을 계속 변경해서 그룹 쓰기 권한을 추가한다.
find /var/www -type f -exec sudo chmod 0664 {} +
6-4. RDS DB 인스턴스에 Apache 웹 서버 연결
1. EC2 인스턴스에 계속 연결되어 있을 때 디렉터리를 /var/www 로 변경하고 inc 라는 새로운 하위 디렉터리를 생성한다.
cd /var/www
mkdir inc
cd inc
2. dbinfo.inc 라는 inc 디렉터리에서 새 파일을 생성한 다음 nano 또는 선택한 편집기를 호출하여 파일을 편집한다.
dbinfo.inc
nano dbinfo.inc
3. 다음의 콘텐츠를 dbinfo.inc 파일에 추가한다.
<? php
define('DB_SERVER', 'tutorial-db-instance.cz2pmcwnb9cz.ap-northeast-2.rds.amazonaws.com'); define('DB_USERNAME', '마스터이름');
define('DB_PASSWORD', '마스터비밀번호');
define('DB_DATABASE', 'sample');
?>
본인의 MySQL 접속 정보를 추가하여 입력 후 Ctrl + X 후, Y를 눌러 정보를 저장한다.
4. 디렉터리를 /var/www/html 로 변경한다.
cd /var/www/html
5. SamplePage.php 라는 html 디렉터리에서 새 파일을 생성한 다음 nano 또는 선택한 편집기를 호출하여 파일을 편집한다.
SamplePage.php
nano SamplePage.php
6. 다음의 콘텐츠를 SamplePage.php 파일에 추가한다.
- ex
<?php
include
"../inc/dbinfo.inc"; ?>
<html>
<body>
<h1>Sample page</h1>
<?php
/* Connect to MySQL and select the database. */
$connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD);
if
(mysqli_connect_errno())
echo
"Failed to connect to MySQL: " . mysqli_connect_error();
$database = mysqli_select_db($connection, DB_DATABASE);
/* Ensure that the Employees table exists. */
VerifyEmployeesTable($connection, DB_DATABASE);
/* If input fields are populated, add a row to the Employees table. */
$employee_name = htmlentities($_POST['Name']);
$employee_address = htmlentities($_POST['Address']);
if
(strlen($employee_name) || strlen($employee_address)) {
AddEmployee($connection, $employee_name, $employee_address);
}
?>
<!-- Input form -->
<form action="<?PHP echo $_SERVER['SCRIPT_NAME'] ?>" method="POST">
<table border="0">
<tr>
<td>Name</td>
<td>Address</td>
</tr>
<tr>
<td>
<input type="text" name="Name" maxlength="45" size="30" />
</td>
<td>
<input type="text" name="Address" maxlength="90" size="60" />
</td>
<td>
<input type="submit" value="Add Data" />
</td>
</tr>
</table>
</form>
<!-- Display table data. -->
<table border="1" cellpadding="2" cellspacing="2">
<tr>
<td>ID</td>
<td>Name</td>
<td>Address</td>
</tr>
<?php
$result = mysqli_query($connection, "SELECT * FROM Employees");
while
($query_data = mysqli_fetch_row($result)) {
echo
"<tr>";
echo
"<td>",$query_data[0], "</td>",
"<td>",$query_data[1], "</td>",
"<td>",$query_data[2], "</td>";
echo
"</tr>";
}
?>
</table>
<!-- Clean up. -->
<?php
mysqli_free_result($result);
mysqli_close($connection);
?>
</body>
</html>
<?php
/* Add an employee to the table. */
function
AddEmployee
($connection, $name, $address) {
$n = mysqli_real_escape_string($connection, $name);
$a = mysqli_real_escape_string($connection, $address);
$query = "INSERT INTO `Employees`(`Name`, `Address`) VALUES('$n', '$a');";
if
(!mysqli_query($connection, $query))
echo
("<p>Error adding employee data.</p>");
}
/* Check whether the table exists and, if not, create it. */
function
VerifyEmployeesTable
($connection, $dbName) {
if
(!TableExists("Employees", $connection, $dbName))
{
$query = "CREATE TABLE `Employees`(
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(45) DEFAULT NULL,
`Address` varchar(90) DEFAULT NULL,
PRIMARY KEY(`ID`),
UNIQUE KEY `ID_UNIQUE`(`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1";
if
(!mysqli_query($connection, $query))
echo
("<p>Error creating table.</p>");
}
}
/* Check for the existence of a table. */
function
TableExists
($tableName, $connection, $dbName) {
$t = mysqli_real_escape_string($connection, $tableName);
$d = mysqli_real_escape_string($connection, $dbName);
$checktable = mysqli_query($connection,
"SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t' AND TABLE_SCHEMA = '$d'");
if
(mysqli_num_rows($checktable)> 0)
return
true
;
return
false
;
}
?>
7. 웹 서버를 열고, /SamplePage.php 주소에서 한번 이용한다
퍼블릭 IP주소 뒤에 SamplePage.php
'Clould > 아마존 웹 서비스' 카테고리의 다른 글
아마존 웹 서비스 (AWS Discovery Book) #8 (0) | 2022.08.29 |
---|---|
아마존 웹 서비스 (AWS Discovery Book) #7 (0) | 2022.08.29 |
아마존 웹 서비스 (AWS Discovery Book) #4 (0) | 2022.08.28 |
아마존 웹 서비스 (AWS Discovery Book) #3 (0) | 2022.08.27 |
아마존 웹 서비스 (AWS Discovery Book) #2 (0) | 2022.08.26 |