SAMBA
- 윈도우용NFS
- 리눅스용이다.DATABASE
- 구축을 해놓는다.
현재 우리 강의실과 우리의 PC는 강의실의 실제 NAT와 PC에서의 가상NAT 이렇게 두개가 존재한다.
이 네트워크는 AWS의 VPC의 형태와 유사한 네트워크이며, 이 스타형 네트워크는 실무에서 많이 쓰이는 중요한 네트워크이다.
실제 강의실도 internal과 external이 존재한다.
브릿지라는 장치는, 가상랜카드(Vbox)와 실제랜카드(PC)를 이어주는 것이다.
- 이 다리로, IP가 다닌다. IP공유기가 뿌려주는 IP를 Bridge가 가상 랜카드로 옮겨준다.만약 내부 서버들의 네트워크를
내부네트워크
가 아닌,bridge
로 바꾸면 가상NAT에서 IP를 받고 통신하는 것이 아니라 실제 공유기에서 바로 통신이 가능하다. 또, 내부 네트워크에서 벗어나 강의실의 공유기의 컨트롤을 받는다.그러나 내부 네트워크로 만드는 이유는, 보안 때문이다. 또, AWS VPC에서도 Isolated (독립적)으로 만드는 것이 이 내부 네트워크를 뜻하고, 역시 보안의 이유이다.
Load Balancing (부하 분산)서버가 두개 이상일 때, 서버 한쪽에만 작업이 몰리지 않도록 부하를 분산하는 시스템
서버의 가용성 때문이다.
Fail Over두대의 서버중 하나가 문제가 생기면, 다른 서버가 그 일을 이어받는다.
보통 Load Balancing(부하분산)과 동시에 존재한다. 이 또한, 서버의 가용성 때문이다.
클러스터위와 같은 서버들의 관리를 위해 서버들을 하나로 묶은 것을 클러스터라고 한다.
헬스체크각 서버의 신호를 보내, 기간안에 응답을 하지 못하면, 서버가 다운되었다고 판단하면, 클러스터 그룹에서 제외하고 FailOver를 시킨다.
그 후에도 계속 신호를 보내, 응답을 하게 된다면 다시 클러스터 그룹에 포함시키고 작동시킨다.
- 실제 물리적인 스위치를 가지고 네트워크를 구성하게 된다.
- 네트워크 파일 시스템(Network File System, NFS)은 1984년에 썬 마이크로시스템즈가 개발한 프로토콜입니다.
- 클라이언트 컴퓨터의 사용자가 네트워크 상의 파일을 직접 연결된 스토리지에 접근하는 방식과 비슷한 방식으로 접근하도록 도와 줍니다.
- 다른 수많은 프로토콜과 마찬가지로 ONC RPC 시스템을 기반으로 합니다.
- 네트워크 파일 시스템은 RFC에 정의된 오픈 표준이므로 누구나 구현할 수 있습니다.
yum install -y nfs-utils
: nfs 도구 설치mkdir /share && cd $_
: /share폴더를 만들고 그 폴더로 바로 이동echo "Hello~ It's me." > test.txt
: 공유가 되는것을 확인하기위해 txt파일을 만들어 준다.
->
: 표준출력재지정, echo는 화면에 출력해주는 명령어지만,>
으로 출력을 입력으로 바꾸었다.vi /etc/exports
: nfs 접근 제어, 아래/share
폴더를 172.31.0.1~172.31.0.254 (0:네트워크, 255:브로드캐스트 제외)의 IP주소들에게 허용하겠다./share 172.31.0.0/24(rw, sync) #/share *(rw, sync) 여기서 *는 anyware, 모든 주소를 허용한다는 뜻이다.
chmod 707 /share
: 접근권한을 소유자와 접근자에게 7을 준다. 만약 다운로드만 하게 하려면r, 4
, 업로드를 하려면w, 2
를 주게 된다.systemctl enable --now nfs-server
: 잊지말고 start와 enable해준다.exportfs -v
: nfs /share설정 확인
- firewall-cmd --permanent --add-service=nfs : nfs방화벽 허용
- firewall-cmd --permanent --add-service=rpc-bind : rpc-bind 방화벽 허용
- firewall-cmd --permanent --add-service=mountd : mountd 방화벽 허용
- firewall-cmd --reload : 방화벽 설정 변경 후, 새로고침
rqm -qa | grep nfs-utils
: 내가 지금 설치한 패키지들 중, nfs-utils가 있는지확인yum install -y nfs-utils
: 클라이언트서버에서도 nfs-utils설치showmount -e [NFS서버IP address]
: mount할 수 있는지 확인한다.mkdir share
: 서버의 /share폴더를 마운트해서 사용할 share폴더를 만들어주겟다.mount -t nfs [NFS서버IP address]:/share /root/share
- mount하는데, nfs방식으로 마운트 한다.
- 서버의 /share를 클라이언트의/root/share폴더에 마운트한다.
df -f
: 확인vi /etc/fstab
: 이후에도 자동으로 마운트하도록 vi에서 설정을 추가할 수 있다.
- vi하지 않고도,echo "172.31.0.100:/share /root/share nfs defaults 0 0" >> /etc/fstab
이렇게 추가할 수 있다.df -h
: 마운트 된것을 확인한다.
blkid
: block storage id
- MariaDB는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)입니다.
- MySQL과 동일한 소스 코드를 기반으로 하며, GPL v2 라이선스를 따릅니다.
- 오라클 소유의 현재 불확실한 MySQL의 라이선스 상태에 반발하여 만들어졌습니다.
- 우리는 DBMS를 설치할 것이다.
- AWS의 RDS를 실습할 수 있는 환경을 구축하고, 또 실습할 것이다.
- repo = repository(저장소)
- repository를 왜 써야 하는가/
- yum으로 설치하면 최신버전이 아닐 수 있다. (CentOS7은 버전관리가 잘 안된다.)
- 그래서 최신버전, 원하는 버전으로 설치하기 위해 , 별도의 repository를 만들고, 설치한다.
- docker나 kubernates에서도 쓰일 수 있다.
vi /etc/yum.repos.d/MariaDB.repo
[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.4/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
yum install -y MariaDB
: 마리아 DB설치rpm -qa | grep MariaDB
: 마리아DB패키지 확인
- 서버, 클라이언트, 그리고 두가지 유틸리티 해서 4가지를 다운받았다.
mariadb --version
: 버전확인으로 설치가 되었는지 확인한다.systemctl enable --now mariadb
: 설치가 제대로 되었다면, start와 enable설정을 해준다.mysql_secure_installation
: mariadb는 mysql과 비슷하기 때문에 보안관련 다운로드 및 설정도 mysql설정으로 진행할 수 있다.
-Enter current password for root
: 현재 비밀번호 없으니 엔터를 누른다.
Switch to unix_socket authoentivation
: 잘 모르는 세팅은 기본값 (대문자 표시) Y를 누른다.Change the root password?
: root비밀번호를 새로 설정한다.Remove anonymous users
: 익명유저 삭제Disallow root login remotely
: 루트의 원격접속 허락여부, Y누른다.Remove test database and access to it?
: 테스트데이터베이스 삭제Reload privilege tables now?
: privilege 테이블 새로고침systemctl restart mariadb
: mariadb설치 후 재시작 한번 해준다.mysql -u root -p
: mksql-u
유저 root로-p
하겠다.CREATE USER '[ID]'@'%' IDENTIFIED BY '[PW]'; #[ID]'@'%' : `@`는 ssh root@~~~ 처럼 주소를 표현하는 것이고, `%`는 Anywhere 를 뜻한다. 즉, `%` 어디서든 접속하는 유저를 받아준다는 뜻이다. #반대로, [ID]@`'localhost'`로 바꿔주면 CREATE DATABASE IF NOT EXISTS wordpress; # wordpress라는 DB가 존재하지 않는다면 생성한다. GRANT ALL PRIVILEGES ON wordpress.* TO '[ID]'@'%'; #권한을 부여한다. #wordpress라는 database에서 #ALL Privileges모든 권한을 준다 quit
firewall-cmd --permanent --add-service=mysql
: 다른 서버에서 접속하기 위해, 방화벽을 열어준다.firewall-cmd --reload
mysql -h 172.31.0.101 -u wpuser -p
: 접속이 안된다.
- 이것은 mysql이 설치되어있지 않기 때문이다
- 똑같이 mariaDB를 repo를 만들어 설치 할 수 있지만 우리는 mysql명령어만 필요하다.
- 따라서 mysql만 yum으로 설치해본다.
yum install mysql -y
: mysql설치mysql -h 172.31.0.101 -u wpuser -p
: 다시 접속해본다.
- 이 명령어에서 어느 서버에 접속할지 어떻게 아는가??
-h
옵션은 호스트의 서버에 접속하는 옵션이다.mysql -h ns.cocudeny.shop -u wpuser -p
: IP주소가 아닌 도메인 주소로 해도 된다.
- 만약 접속이 안된다면 방화벽에 추가 했는지 확인한다.
- 아래 모습이 접속한 화면이다.
- 윈도우 서버 (IIS) : 전세계 1위의 점유율을 가지고 있는 서버
- 여러 프로토콜이 네트워크의 세션, 프레젠테이션 및 응용 프로그램 계층과 겹친다. 아래 나열된 프로토콜은 잘 알려진 몇 가지이다.
- DNS - 도메인 이름 시스템 - 네트워크 주소를 사람이 이해할 수 있는 용어로 변환, 또는 그 반대로 변환한다.
- DHCP = 동적 호스트 구성 프로토콜 - 컴퓨터의 IP를 자동으로 부여하는 프로토콜
대용량의 데이터 집합을 체계적으로 구성해 놓은 것
- 혼자가 아닌 여러명의 사용자나 시스템이 서로 공유할 수 있어야한다.
- 데이터베이스 관리 시스템 (DBMS : Datavase Management System)은 이러한 데이터베이스를 관리해 주는 시스템 또는 소프트웨어이다.
- 데이터베이스는 '데이터의 저장공간' 자체를 의미하기도 한다.
- DB서버는 테이블 관련 정보만 존재하고,
- Web서버에 웹 관련 정보가 들어가있다, 착각하기 쉬운 부분이다.
- 아무나 접근하는 것이 아닌 허가된 사람만 접근할 수 있어야한다.
- 동일한 데이터가 중복으로 저장되는 것을 방지해야한다.
- 데이터베이스에 통합하면 하나의 테이블에 저장하고 이를 공유함으로 중복을 방지할 수 있다.
- 통일된 방식으로 응용프로그램 작성이 가능해지고, 유지보수가 쉬워진다.
- 계층적 데이터베이스 모델
- root -> lv1 -> lv2 ..... 로 트리구조로 만들어져있는 모습
- 현재의 폴더 시스템 같은 모습이다.
- 데이터베이스를 저장하는데, 테이블(표)을 사용한다.
데이터베이스 용어- 열(column) : 세로, 각 테이블은 열로 구성되고, 속성을 표현한다.
- 열 이름 : 각 열을 구분하기 위한 이름이며, 테이블 내에서 고유해야한다.
- 행 : 가로, 각 열의 정보를 가지고 있는 실질적인 데이터, 각 행의 데이터와 열은 관계(Relation)을 맺고 있다.
- 테이블 : 열과 행으로 표형대로 표현한 데이터가 담긴 것을 말한다.
- 데이터베이스 : 테이블이 저장되는 저장소를 말한다.
- DBMS : 데이터베이스를 관리하는 시스템 또는 소프트웨어를 말한다.
- 데이터형식 : 문자 형식, 숫자 형식이며, 테이블을 생성할 때 지정해야 한다.
- 기본 키(Primary Key, PK) : 각 행을 구분하는 유일한 열(속성)을 말하며, 식별자로 이용된다. 구분할 수 있기위해 중복이 없을 수 있고, 있을 수 있다.
- 외래 키(Foreign Key, FK) : 두 테이블의 관계를 맺어주는 키를 말한다.
- SQL(= Query, Structured query Language, '에스큐엘', '시퀄')은 구조적 쿼리 언어를 나타낸다. SQL은 데이터베이스와 통신하는 데 사용됩니다.
- ANSI(American National Standards Institude)에 따르면 관계형 데이터베이스 관리 시스템의 표준 언어이다.
- 관계형 데이터베이스가 아닌 것은NoSQL (Key <-> Value)
이라 한다.- SQL문은 데이터베이스에서 데이터 업데이트 (수정) 또는 데이터베이스에서 데이터 검색과 같은 작업을 수행하는데 사용된다.
- SQL을 사용하는 일반적인 관계형 데이터베이스 관리 시스템은 Oracle, Sybase, Microsoft SQL Server, Access, ingres, MySQL, PostgreSQL, MariaDB 등이 있다.
- 대부분의 데이터베이스 시스템이 SQL을 사용하지만 대부분은 일반적으로 시스템에서만 사용되는 고유한 추가 독점 확장을 가지고 있다. (Oracle, MS-SQL)
- 그러나
"Select"
,"insert"
,"Delete"
,"Create"
및"Drop"
과 같은 표준 SQL 명령을 사용하여 데이터베이스로 수행하는 데 필요한 거의 모든 작업을 수행할 수 있습니다.
- User가 SQL명령어를 통해 DBMS에게 명령을 내리면 DBMS에서 DB를 컨트롤하며 명령을 처리한다.
- MariaDB설치 파일을 웹사이트에서 다운로드 해서 실행파일을 실행한다.
- Next -> Accept -> next -> next (HeidiSQL : SQL GUI관련 tool)
- PW입력, root 사용자의 remote접근 허용 (실습용으로 허락한다.)
- UTF8을 기본 문자 셋으로 사용한다. 체크- MYSQL은
3306Port
를 사용한다.- 이후 체크하지 않고, next -> install
- 신규버튼을 눌러 새로운 Session을 만들어준다.
- 세션이름을 localhost로 하고 password에 root의 password를 입력해준다.
- 열기를 눌러 새로운 세션을 열어본다.
- PowerWindow에 들어가,
-SETX PATH "C:\Program Files\MariaDB 10.3\bin;%PATH%" /M
: 입력해서성공 : 지정한 값을 저장했습니다.
가 나오면 성공이다.
- 강사님이 나눠주신
employees.zip
파일로 실습을 진행.- 내컴퓨터(C드라이브)에 바로 employees를 압축해제 해준다.
cd C:\employees\
: 로 현재 작업위치 이동mysql -u root -p
: 로 MYSQL에 접속한다.source employees.sql
: mysql에 데이터를 읽어온다.show databases
: 로 읽음을 확인한다.
- DBMS 설치
- 데이터베이스 구축 절차
- 데이터베이스 생성
- 테이블 생성
- 데이터 입력
- 데이터 조회/활용
- localhost에서 오른쪽마우스 클릭(GUI) -> 데이터베이스 만들기
- 이름을 생성해준다. (어떻게 저장해도, 결국 저장은 소문자로 저장된다.)
- CREATE DATABASE
shopDB
: shopDB 양쪽에 백틱이 들어가야한다.- shopdb 오른쪽마우스 클릭 -> 새로생성 -> 테이블
- 테이블 이름 : member TBL (TBL == Table)
- 테이블 컬럼(열, cul)정의
- 아이디(Primary Key) : memberID | 문자(CHAR) | 8글자(영문) | NULL허용 X
- 회원 이름 : memberName | 문자(CHAR) | 5글자(한글) | NULL허용 X
- 주소 : memberAddress | 문자(CHAR) | 20글자(한글) | NULL허용 O
- 두번째 테이블 생성
- 테이블 이름 : productTBL (TBL == Table)
- 테이블 컬럼(열, cul)정의
- 제품이름(Primary Key) : productName | 문자(CHAR) | 4글자(한글) | NULL허용 X
- 가격 : cost | 숫자(INT) | 정수 | NULL허용 X
- 제조일자 : makeDate | 날짜(DATE) | 날짜형 | NULL허용 O
- 제조회사 : company | 문자(CHAR) | 5글자(한글) | NULL허용 O
- 남은수량 : amount | 숫자(INT) | 정수 | NULL허용 X
- 기본기(Primary Key)를 설정하려면 테이블 정의 탭에서 열의 오른쪽 마우스 클릭 -> 새 인덱스 생성 -> Primary Key로 저장
- 테이블 탭 오른쪽 데이터탭을 클릭하고, 아래 테이블 빈공간에 오른쪽마우스 클릭, 행삽입
회원 데이터 ( 아이디 / 이름 / 주소 ) Dang / 당탕이 / 경기 부천시 중동 Jee / 지운이 / 서울 은평구 중산동 Han / 한주연 / 인천 남구 주안동 Sang / 상길이 / 경기 성남시 분당구 제품데이터(제품명 / 비용 / 날짜 / 제조사 / 수량) 냉장고 / 5 / 2023-02-01 / 대우 / 22 세탁기 / 20 / 2022-09-01 / LG / 3 컴퓨터 / 10 / 2021-01-01 / 삼성 / 17
- SQL사용해보기
SELECT * FROM membertbl
: membertbl에서 *(모든) 열을 SELECT해서 검색하라.
- powershell에서도 검색 가능하다.
-use shopdb
: shopdb사용
SELECT * FROM membertbl;
- SELECT : FROM에서 정의된 테이블에서 검색할 열(속성)을 정의
- FROM : 작업할 Table을 정의한다. (위 이미지가 SELECT와 FROM의 예시이다.)
- WHERE : 표시할 데이터의 조건을 정의한다.
- 회원의 모든 정보 조회
-select * from memberTbl;
- 이름과 주소만 조회
-select memberName, memberAddress from memberTbl;
- 특정 이름만 검색
-select * from memberTbl where memberName = '치킨';
- 테이블 생성
- create tablemy testTBL
(id int); : 블럭모양에 백틱(~ - shift)가 들어가는 것이다.
- select * from
my testTBL
; 테이블이름 양쪽에 백틱이 들어간다.- 테이블 삭제
- drop tablemy testTBL
;
인덱스 (Index) : 대부분의 책의 제일 뒤에 붙어 있는 '찾아보기'와 같은 개념
CREATE TABLE indexTBL (first_name (varchar(14), last_name varchar(16), hire_date date); #테이블 생성 (이름, 성, 고용일) INSERT INTO indexTBL #indexTBL에 아래에서 찾은 데이터를 indexTBL에 넣겠다. 총 500개가 들어갈 것이다. SELECT first_name, last_name, hire_date date #(전체 열을 포함하니 *을 써도 될 것이다.) FROM employees.employees LIMIT 500; #최대 500줄까지만 표시하겠다. SELECT * FROM indexTBL; #나는 두번눌러서 1000개가 들어왔다.
SELECT * FROM indexTBL WHERE first_name = 'Mary'; #검색하면 나는 중복이라 Mary가 두명나온다. EXPLAIN SELECT * FROM indexTBL WHERE first_name = 'Mary'; #Mary를 찾을 떄 어떻게 찾았나? : type = All 을 보면 모든 행을 뒤져서 찾았다.
CREATE INDEX idx_indexTBL_firstname ON indexTBL(first_name); #indexTBL에서 (first_name)을 이용하여 idc_indexTBL_firstname 인덱스를 만든다. EXPLAIN SELECT * FROM indexTBL WHERE first_name = 'Mary'; #인덱스 생성 전과 다르게, type에 ref(참조)로 되어있다. 즉, 인덱스를 참조하여 빠르게 찾은 것이다. # 눈에 띄게 보이는 차이는 아니였지만 데이터가 더욱 많을 때, 눈에 띄는 차이가 될 것이다.
- 보안상의 이유 등 여러 이유로, 실제 테이블에서 부분을 떼어 가상 테이블을 만드는 것이다.
CREATE VIEW uv_memberTBL #뷰 생성 AS #아래 조건에서 출력으로 나오는 뷰를 생성하겠다. SELECT memberName, memberAddress FROM memberTBL; SELECT * FROM uv_memberTBL; #생성된 뷰를 살표본다.
- 여러 명령어를 하나로 묶어서 한번에 사용하게 해주는 기능
- 여러 명령어를 같은타이밍에 계속 사용해야한다면 미리 정의해서 간편하게 사용할 수 있다.
- 마치 코딩할 떄 함수와 같다.
SELECT * FROM memberTBL WHERE memberName = '앤제리'; SELECT * FROM productTBL WHERE productName = '몰왕검';
DELIMITER // ## 구분자, 구분시작 CREATE PROCEDURE myProx() #myProx이름으로 프로시져를 생성한다. BEGIN #프로시져 시작 SELECT * FROM memberTBL WHERE memberName = '앤제리'; SELECT * FROM productTBL WHERE productName = '몰왕검'; #프로시져 끝 END // DELIMITER ; CALL myProc() ;
- 어떤 작업에 의해, 일련 작업이 유발되어 실행되는 코드
- 아래는 삽입 -> 출력 -> 업데이트 => 출럭 =>삭제 -> 출력하는 코드이다.
# 데이터 입력 및 테이블 출력 INSERT INTO memberTBL VALUES ('Figure', '연아', '경기도 군포시 당정동'); SELECT * FROM membertbl;
UPDATE memberTBL SET memberAddress = '서울 강남구 역삼동' WHERE memberName = '연아'; SELECT * FROM membertbl;
DELETE FROM memberTBL WHERE memberName = '연아'; SELECT * FROM membertbl;
- 백업 테이블 생성
CREATE TABLE deletedMemberTBL ( memberID char(8), memberName char(5), memberAddress char(20), deletedDate date #삭제한 날짜 );
- 트리거 정의
DELIMITER // #구분자 CREATE TRIGGER trg_deletedMemberTBL #트리거 이름, #트리거 조건 설정 AFTER DELETE #삭제 후에 작동하게 지정 ON memberTBL #트리거를 부착할 테이블 FOR EACH ROW #각 행마다 적용시킴 BEGIN # OLD 테이블의 내용을 백업테이블에 삽입 # 트리거 실행시 할 일 정의 INSERT INTO deletedMemberTBL VALUES (OLD.memberID, OLD.memberName, OLD.memberAddress, CURDATE() ); #CURDATE: 현재 날짜. END // DELIMITER ;
- 트리거 작동 확인해보기
SELECT * FROM memberTBL; DELETE FROM memberTBL WHERE memberName = '앤제리'; SLELCT * FROM memberTBL; SELECT * FROM deletedMemberTBL;
deletedmembertbl에 제대로 들어온 것을 볼 수 있다.
- 만약 잘못 삭제한 계정을 다시 살리기 목적으로 사용할 수 있다.INSERT INTO memberTBL SELECT memberID, memberName, memberAddress FROM deletedMemberTBL; SELECT * FROM memberTBL;
- 백업과 복원 : 데이터베이스를 다른 매체에 보관과 문제 발생 시 원상태로 돌려놓는 작업
- 작업할 데이터베이스에 오른쪽 마우스 클릭 -> 유지보수 -> SQL내보내기로 백업파일을 만들 수 있다.
- productTBL 삭제
DELETE FROM productTBL;
- 는 데이터가 사라졌다.
- 메뉴바에 파일 -> SQL불러오기 -> 아까 저장한 SQL파일 가져오기
- 3306번으로 포트포워딩을 진행해야 한다.
- firewall-cmd --permanent --zone=external --add-forward-port=port=3306:proto=tcp:toport=3306:toaddr=DATABASE IP