월루를 꿈꾸는 대학생
6주차 - 데이터베이스 서비스 본문
DBMS
- 메모장이나 엑셀에도 저장 가능한데 왜 DB가 나왔을까??? 양이 너무 많아서!! 수천 수억명의 사용자 데이터를 메모장에 저장하는 것은 무리 ->> DBMS 등장
- DB 관리 운영하는 시스템
주기적으로 관리나 유명한 DB 엔진 랭킹사이트
현재 2위 MYSQL
MAIRA DB - MYSQL 개발자들이 무료로 만든 버전
DBMS 특징
- 데이터가 저장되면 정확히 저장 - 신뢰성 ! 무결성
- 웹 서비스들과 연동해서 사용자 데이터 가져오고 저장하는 것이 용이!
DBMS 분류
- 관계형 DBMS ( MYSQL ORACLE ) 이 주로 인기
관계형은
- 테이블 단위로 구성
- 행과 열로 구성
SQL 개요 -> DB 조작어
- 대부분의 SQL 표준을 따르기에 SQL 기본만 알면 다른 DB쓸 때 무리 없음
- 이식성이 좋음
- 대화식 언어
실습 !
EC2 웹 SERVER
EC2 DB SERVER
두개 만들어서 서로간의 상호 작용 확인
#WEB에서 접근
# IP확인 및 DBSrv ping 테스트
ip a
ping 10.1.2.10
# DBSrv 로 MySQL 접속 (계정 정보: root/qwe123)
mysql -h 10.1.2.10 -uroot -pqwe123
# DB에서 접근
# IP확인
ip a
# MySQL 접속 (계정 정보: root/qwe123)
mysql -uroot -pqwe123
web 에서 db로 접근
mariadb monitor tool !
m.blog.naver.com/nieah914/221815212859
mariadb monitor tool 도 있지만 mysql workbench tool 써도 됨
GUI 환경으로
# MariaDB monitor 접속
Welcome to the MariaDB monitor. Commands end with ; or \g.
...
# DB 서버의 상태 정보
MariaDB [(none)]> status;
# 데이터베이스(=스키마) 확인
SHOW DATABASES;
# employees 데이터베이스 선택 하기
USE employees;
MariaDB [(none)]> USE employees;
MariaDB [employees]>
# 테이블 확인
SHOW TABLES;
# 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';
db를 사용하려면 use 명령어를 사용해서 선택을 해야함 !
# 스키마 생성
CREATE SCHEMA `shopdb`;
USE shopdb;
# 테이블 생성 - (Workbench) GUI 설정 보여주기 - 아래 복붙해서 적용하기
CREATE TABLE `shopdb`.`memberTBL` (
`memberID` CHAR(8) NOT NULL,
`memberName` CHAR(5) NOT NULL,
`memberAddress` CHAR(20) NULL,
`age` INT NOT NULL,
PRIMARY KEY (`memberID`));
# 데이터 넣기 - (Workbench) GUI 설정 보여주기 - (카톡 멤버 정보 받기) - 아래 복붙해서 적용하기
SELECT * FROM memberTBL;
# 행(=데이터=레코드) 1개 넣기
INSERT INTO memberTBL VALUES ('Gasida', '가시다', '전북 전주시 송천동', '31');
-- 위 아래 명령어 동일
INSERT INTO `shopdb`.`memberTBL` (`memberID`, `memberName`, `memberAddress`, `age`) VALUES ('Gasida', '가시다', '전북 전주시 송천동', '31');
## 카톡 멤버 정보 받아서 넣기
INSERT INTO memberTBL VALUES ('User4', '유나', '경기 성남시 분당구', '27');
INSERT INTO memberTBL VALUES ('Minyoung', '민영', '경기도 부천시 중동', '30');
INSERT INTO memberTBL VALUES ('Eunji', '은지', '인천 남구 주안동', '28');
INSERT INTO memberTBL VALUES ('Yujeong', '유정', '서울 은평구 증산동', '29');
# 조회
SELECT * FROM memberTBL;
SELECT memberName, memberAddress FROM memberTBL;
SELECT * FROM memberTBL ORDER BY `age` ASC;
SELECT * FROM memberTBL WHERE age = 27;
# 행(=데이터=레코드) 삭제
DELETE from memberTBL where memberID='Gasida';
SELECT * FROM memberTBL;
# 행(=데이터=레코드) 변경(=업데이트)
UPDATE memberTBL SET memberID='Yuna' WHERE memberName='유나';
SELECT * FROM memberTBL;
DB 백업과 복원
# 예시
USE shopDB;
SELECT * FROM productTBL ;
-- 데이터를 백업 실행
-- 실수로 데이터 삭제함
DELETE FROM productTBL;
SELECT * FROM productTBL ;
-- 사용중인 DB를 복원하면 문제가 생길 수 있으니 우선 다른 DB로 변경한다
USE sys;
-- shopDB 데이터를 복원 실행
USE shopDB;
SELECT * FROM productTBL
sql 배워야 하는 이유
기획팀이나 마케팅팀에서 조회 좀 해주세요~ 이러면 백엔드팀 일 못한다... 그러니까 쏘카는 다 배우는 듯
즉 업무 몰입도가 높아짐
#send.html
<HTML>
<HEAD>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<FORM METHOD="get" ACTION="receive.php">
아이디 : <INPUT TYPE ="text" NAME="userID">
이름 : <INPUT TYPE ="text" NAME="userName">
<BR><BR>
<INPUT TYPE="submit" VALUE="전송">
</FORM>
</BODY>
</HTML>
html 전달 값을 php가 받아서 그걸 db에 전달
# receive.php
<?php
$userID = $_GET["userID"];
$userName = $_GET["userName"];
echo "전달 받은 아이디 : ", $userID, "<br>";
echo "전달 받은 이름 : ",$userName, "<br>";
?>
#combine.php
<?php
$num1 = 100;
$num2 = 200;
$sum = $num1 + $num2;
?>
<HTML>
<HEAD>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<h1> 계산 결과는 <?php echo $sum ?> 입니다. </h1>
</BODY>
</HTML>
<?php
$db_host="10.1.2.10"; # MySQL IP 주소
$db_user="root"; # MySQL 계정
$db_password="qwe123"; # MySQL 암호
$db_name=""; # 스키마 이름
$con=mysqli_connect($db_host, $db_user, $db_password, $db_name);
# 해당 위의 계정으로 연결시도 해서 되면 성공 구문 아니면 실패 구문 띄우기
if ( mysqli_connect_error($con) ) {
echo "MySQL 접속 실패 !!", "<br>";
echo "오류 원인 : ", mysqli_connect_error();
exit();
}
echo "MySQL 접속 완전히 성공!!";
mysqli_close($con);
?>
RDS는 대부분 AWS가 해주고 우리는 확장 . 증설 관리 그리고 어플리케이션 최적화만 사용자가하면 됨
Amazon RDS Multi-AZ
-멀티 AZ 켜놓으면 장애시 주된 DB 장애시 알아서 엔드포인트를 세컨드 DB로 꺽어줘서 서비스를 항상 제공할 수 있다 .
-real 시간으로 동기화됨
- secondary가 primary로 승격
READ Replica 옵션
-프라이머리 db에 사용자가 많이 몰려서 db 과부하가 걸리면 힘들다.
그리고 db 보니까 조회 처리가 많아서 .... 스펙 올리면 비용이 더 들어감 이럴 때 read replica를 생성해서
주 db에서 싱크를 해서 가져옴 일관성있게 유지
- 특징은 엔드포인트 주소가 다르다
- read replica는 별도의 주소가 있음 이 주소로 가면 조회만 읽기만 가능
- 즉 select 로 조회시에는 read replica에 가고 update나 생성 일 때는 주된 db로 가도록
- 이 걸 중간에 와스단에서 꺽는다
- 최대 5개까지 생성 가능
- 읽기 전용 복사본임 !!!!
amazon rds 실습
RDS 배포 및 Web 과 연동 실습 진행
엔진유형 mysql
템플릿 - 프리티어
db식별자는 리전에서 유일해야함! 즉 숫자 문자 섞는 게 좋음
프로덕션에서 사용한다면 무조건 다중az 해줘야 안전하다
db는 기본 외부 엑세스 금지
웹이나 와스에서만 접근
가용 2a
지금은 스키마가 없는데
추가구성에
백업 보존기간 0일 하면 백업 보존 x
0 하는 이유는 read replica 쓸 수 있는 게 백업이 활성화 해야하니까! 어쩔 수 없이 설정
액세스 가장 적은 월요일 새벽 등에 설정
t2.micro 인스턴스가 배포가 됨
4분 정도
# 스키마 생성
CREATE SCHEMA `shopdb`;
USE shopdb;
# 테이블 생성
CREATE TABLE `shopdb`.`memberTBL` (
`memberID` CHAR(8) NOT NULL,
`memberName` CHAR(5) NOT NULL,
`memberAddress` CHAR(20) NULL,
`age` INT NOT NULL,
PRIMARY KEY (`memberID`));
# 행(=데이터=레코드) 넣기
INSERT INTO memberTBL VALUES ('Gasida', '가시다', '전북 전주시 송천동', '31');
INSERT INTO memberTBL VALUES ('User4', '유나', '경기 성남시 분당구', '27');
# 조회
SELECT * FROM memberTBL;
위에는 프리티어 즉 멀티az 세팅 안 됨
해당은 az 장애나면 바로 서비스 불가 // 다중 az 불가니까
다중 az 하고 싶으면 상단 - 수정 -
나머지는 개발/테스트로 만든다
멀티 az 동작하도록 !!
생성
멀티az 랑 read replica는 별개의 동작
읽기복제본을 다른 리전으로 생성도 가능
그리고 다중 az는 굳이 하나만 만들거라
그리고 유럽에서 읽기 접근 많이 하면 리전을 유럽으로
마스터랑 슬레이브 2가지
primary secondary
- RDS 삭제
- CloudFormation 삭제
'Cloud > AWS' 카테고리의 다른 글
8주차 - EC2 Auto Scaling (0) | 2021.04.07 |
---|---|
7주차 로드밸런서 ELB (2) | 2021.04.04 |
3주차 네트워킹 서비스 (0) | 2021.03.03 |
2주차 컴퓨팅 서비스 (0) | 2021.02.24 |
1주차 AWS란 (0) | 2021.02.17 |