(W2D2) 데이터베이스(2)

MySQL

MySQL 종류와 버전

  • MariaDB

    • 오픈 소스로 무료이다.
    • MySQL 5.5에 기반해서 개발되었다.
    • MySQL과 인터페이스는 동일하나 성능은 더 좋다.
  • MySQL

    • MySQL Community Server : 오픈 소스로 무료이다.
    • MySQL Enterprise Server : 유료 버전. 다양한 플러그인을 제공한다.

MySQL 특징

  • 한동안 웹개발 표준 기술 스택 중의 하나였다.

    • LAMP : Linux, Apache, MySQL, PHP
  • 지금도 Postgres와 함께 가장 널리 쓰이는 프로덕션용 관계형 데이터베이스이다.
  • 용량 이슈 -> 용량 증대(Scaling) 방식

    • (1) Scale-Up : 서버에 CPU와 Memory 추가 (서버 사양 증대) - 한계가 있다.
    • (2) Scale-Out : Master-Slave 구성 (Slave는 읽기 전용, Slave를 로드밸런서로 묶는 방식)
    • 일반적으로 클러스터 구성을 이야기하나 MySQL은 이를 지원하지 못한다.
    • 한계 : 쓰기 작업은 Slave에 하지 못한다. (모든 쓰기 작업은 Master) 읽기 용량만 증대시킬 수 있는 방법이다.

클라우드 / AWS

클라우드 정의

  • 컴퓨팅 자원(하드웨어, 소프트웨어 등)을 네트워크를 통해 서비스 형태로 제공하는 것이다.
  • No Provisioning (준비를 할 필요가 없다) / Pay As You Go
  • 자원을 필요한만큼 (거의) 실시간으로 할당하여 사용한만큼 지불한다.

    • 자원을 필요한만큼 탄력적으로 유지하는 것이 중요하다.

클라우드 컴퓨팅의 장점

  • 초기 투자 비용이 크게 줄어든다.

    • CAPEX (Capital Expenditure) vs OPEX(Operating Expense)
  • 리소스 준비를 위한 대기시간이 대폭 감소한다.
  • 노는 리소스 제거로 비용이 감소한다.
  • 글로벌 확장이 용이하다.
  • 소프트웨어 개발 시간이 단축된다.

    • Managed Service (SaaS) 이용

AWS

가장 큰 클라우드 컴퓨팅 서비스 업체

EC2 - Elastic Cloud Compute

  • AWS의 서버 호스팅 서비스

    • 리눅스, 맥, 윈도우 서버를 론치하고 로그인이 가능하다.
    • 가상 서버들이라 선용 서버에 비해 성능이 떨어진다.
  • 다양한 종류의 서버 타입을 제공한다.

S3 - Simple Stroage Service

  • 아마존이 제공하는 대용량 클라우드 스토리지 서비스
  • 데이터 저장 관리를 위해 계층적 구조를 제공한다.

Database Services

  • RDS(MySQL/MariaDB, PostgreSQL, Aurora, Oracle, MS SQL server), DynamoDB, …

AL&ML Services

  • SageMaker, Lex, Polly, Recognition

기타 서비스

  • Amazon Alexa, Amazon Connect, Lambda

MySQL 설치 - Docker

Docker

특정 프로그램과 (그 프로그램을 실행하는데) 필요한 기타 소프트웨어들을 하나의 패키지로 만듦으로써 해당 프로그램의 개발과 사용을 도와주는 오픈소스 플랫폼이다.

  • 소프트웨어 설치를 쉽게 해준다.
  • 패키지를 먼저 파일 시스템 형태로 만드는데 이를 Docker Image라고 한다.

    • Image는 다른 사람들과 공유가 가능하다.
    • Docker Image 공유소 - Docker Registry(Docker Hub)
  • Docker Image를 실행시킨 것을 Docker Container라고 부르며, 응용프로그램에 해당한다.
  • Docker Engine 설치
  • MySQL docker image 다운로드

    • $ docker pull mysql/mysql-server:8.0
  • 다운로드 받은 이미지로 Docker container 실행

    • $ docker run —name=mysql_container —restart on-failure -d mysql/mysql-server:8.0
  • MySQL root 계정의 패스워드 찾기

    • $ docker logs mysql_container 2>&1 | grep GENERATED
  • MySQL shell 실행하기

    • $ docker exec -it mysql_conatiner mysql -uroot -p

DDL과 예제 데이터

웹서비스 사용자/세션 정보

  • 사용자 ID : 보통 웹서비스에서 등록된 사용자마다 부여하는 유일한 ID
  • 세션 ID : 세션마다 부여되는 ID

    • 세션 : 사용자의 방문을 논리적인 단위로 나눈 것
    • 사용자가 외부 링크(보통 광고)를 타고 오거나 직접 방문해서 올 경우 세션을 생성
    • 사용자가 방문 후 30분간 interaction이 없다가 뭔가를 하는 경우 새로 세션을 생성
    • 하나의 사용자는 여러 개의 세션을 가질 수 있다.
    • 세션의 경우 세션을 만들어낸 접점(경유지)를 채널이란 이름으로 기록해둔다.
    • 세션이 생긴 시간도 기록한다.
  • 이 정보를 기반으로 다양한 데이터 분석과 지표 설정이 가능하다.

    • 마케팅 관련, 사용자 트래픽 관련
    • DAU, WAU, MAU등의 일/주/월별 Active User 차트
    • Marketing Channel Attribution 분석
    • 어느 채널에 광고를 하는 것이 가장 효과적인가?
  • 데이터 수집은 백엔드 엔지니어가 한다.
  • 첫 번째 채널 - first touch / 상품 구매를 이끌어낸 채널 - last touch / 방문했던 모든 채널 - multi touch

데이터베이스와 테이블 요약(1)

  • prod 데이터베이스 (스타 스키마 형식의 데이터 모델링)

    • session 테이블
    컬럼 타입
    id (primary key) int
    user_id int
    created timestamp
    channel_id (foreign key) int
    • channel 테이블
    컬럼 타입
    id (primary key) int
    channel varcher(32)

테이블 필드의 중요 속성

  • Primary key

    • 테이블에서 레코드의 유일성을 정의하는 필드
    • Composite primary key : primary key가 두 개 혹은 그 이상의 필드로 정의되는 경우
    • Primary key로 지정된 필드가 있는 경우 데이터베이스단에서 중복된 값을 갖는 레코드가 생기는 것을 방지한다. - primary key uniqueness constraint
  • Foreign key

    • 테이블의 특정 필드가 다른 테이블의 필드에서 오는 값을 갖는 경우
  • NOT NULL

    • 필드의 값이 항상 존재해야 한다는 것을 의미한다. (Null : 존재하지 않음)
  • DEFAULT value

    • 필드에 값이 주어지지 않는 경우 기본값을 정의해준다.
    • timestamp 타입 : CURRENT_TIMESTAMP를 사용하면 현재 시간으로 설정된다.

데이터베이스와 테이블 요약(2)

  • session 테이블

    컬럼 타입 속성
    id int NOT NULL
    AUTO_INCREMENT
    PRIMARY KEY
    user_id int NOT NULL
    created timestamp NOT NULL
    DEFAULT CURRENT_TIMESTAMP
    channel_id int NOT NULL
    FOREIGN KEY
  • channel 테이블

    컬럼 타입 속성
    id int NOT NULL
    AUTO_INCREMENT
    PRIMARY KEY
    channel varcher(32) NOT NULL

channel table DDL

CREATE TABLE channel (
	id int not null auto_increment primary key,
	channel varchar(32) not null
);
-- composite primary key 지정이 가능하다.(범용적이다.)
CREATE TABLE channel (
	id int not null auto_increment,
	channel varchar(32) not null,
	primary key(id)
);

session table DDL

CREATE TABLE session (
  id int not null auto_increment primary key,
  user_id int not null,
  created timestamp not null default current_timestamp,
  channel_id int not null,
  foreign key(channel_id) references channel(id)
);

Written by@Myunghwan
Nothing changes if nothing changes

GitHub