MySQL과 Docker 실습

Jaeuk Oh·2021년 8월 16일

DataBase

목록 보기
2/4
post-thumbnail
  1. MySQL 소개
  • MySQL 역사

    • 1995년 스웨덴 회사 MySQL AB에 의해 개발된 관계형 데이터베이스

      • 오픈소스SW로 시작
      • My는 개발자 중 한 사람의 딸임
    • 자바를 개발한 썬마이크로시스템에서 인수

    • 오라클이 썬마이크로시스템을 인수하면서 MySQL 유료화 여부가 쟁점이 됨

    • 2010년에 MySQL의 초기 개발자였던 Monty가 MySQL과 호환되는 MariaDB라는 오픈소스 개발

      • MariaDB는 5.5에 기반해서 만들었고, 성능은 더 좋다


  • MySQL 특징

    • 한때 웹 개발 표준 기술 스택 중의 하나였음

      • LAMP : Linux, Apache, MySQL, PHP
    • 지금도 Postgres와 함께 가장 널리 쓰이는 프로덕션용 관계형 데이터베이스

    • MySQL 용량 증대(Scaling) 방식

      • Scale-Up

        • 서버에 CPU와 Memory 추가
      • Scale-Out

        • master-slave 구성
        • 일반적으로 클러스터 구성을 이야기한다 하지만 MySQL은 이를 지원하지 못함




  1. 클라우드와 AWS
  • 클라우드 컴퓨팅 소개

    • 컴퓨팅 자원(SW, HW 등)을 네트워크를 통해 실시간으로 할당하여 서비스 형태로 제공해서 사용한만큼 지불

    • IaaS, PaaS, SaaS


  • 클라우드 컴퓨팅이 없다면?

    • 서버/네트워크/스토리지를 직접 구매

    • 데이터센터 공간을 직접 확보

    • Peak time을 기준으로 Capacity Planning을 수행


  • 클라우드 컴퓨팅 장점

    • 초기 투자 비용이 크게 줄어듬

    • 리소스 준비를 위한 대기시간 감소

    • 여유 리소스 제거로 비용감소

    • 글로벌 확장 용이

    • SW 개발 시간 단축


  • AWS 소개

    • 세상에서 가장 큰 클라우드 컴퓨팅 서비스 업체

    • 2002년 아마존의 상품데이터를 API로 제공하면서 시작


  • EC2(Elastic Cloud Compute)

    • AWS의 서버 호스팅 서비스

      • 리눅스 혹은 윈도우 서버를 런칭하고 로그인 가능
      • 가상 서버들이라 전용서버에 비해 성능이 떨어짐
      • Bare-metal 서버도 제공함
    • 구매옵션

      • On-Demand : 시간당 비용지불

      • Reserved : 1년이나 3년 사용을 보장하고 1/3 정도 시점에서 40% 할인을 받는 옵션

      • Spot Instance : 일종의 경매방식으로 놀고있는 리소스를 싼 가격으로 사용하는 방법


  • S3

    • AWS에서 제공하는 대용량 클라우드 스토리지 서비스

    • 데이터 저장관리를 위해 계층적 구조

    • 글로벌 네임스페이스를 제공하기 때문에 디렉토리 이름 선정 시 주의해야함

    • S3에서 디렉토리를 버킷(Bucket)이라고 부름

    • 버킷이나 파일별로 접근 통제가 가능




  1. MySQL 설치와 Docker
  • Docker란?

    • Docker는 특정 프로그램과 (그 프로그램을 실행하는데) 필요한 다양한 SW들을 하나의 패키지로 만듦으로서 해당 프로그램의 개발과 사용을 도와주는 오픈소스 플랫폼

      • Docker Image : 패키지를 파일 시스템 형태로 만든 것, 타인과 공유가능

      • Docker Registry(Hub) : Docker Image 공유소

      • Docker Container : Docker Image를 실행시킨 것, 응용프로그램에 해당한다

    • 예를 들어, MySQL을 다른 OS에서 설치하려면 다양한 변수가 존재한다. 이를 해결하기 위한 방법이 Docker


  • Docker 구조

    • Virtualization VS Containerization



  • 설치 방법

    • 사전 작업(링크)

      • WSL2 커널 업데이트

        • 링크 들어가서 다운로드 받으면 끝
      • WSL2를 기본 버전으로 사용하도록 설정 : 시작 우클릭 > Windows PowerShell(관리자)

        • wsl --set-default-version 2
      • Ubuntu 설치 : Microsoft Store > "Ubuntu" 검색 > Ubuntu > 설치

      • Ubuntu 계정 설정 및 업데이트 : Ubuntu 실행 > ID/PW 설정 > 업데이트

        • sudo apt update -y
      • Ubuntu WSL 버전 확인

        • wsl -l -v


    • docker 데스크탑 설치

    • 터미널 실행

      • mysql 8.0버젼 이미지를 도커에 설치

        • docker pull mysql/mysql-server:8.0
      • 다운로드받은 이미지를 도커 컨테이너에 실행

        • docker run --name=mysql_container -- restart on-failure -d mysql/mysql-server:8.0
      • mysql 루트계정 패스워드 찾기

        • docker logs mysql_container 2>&1 || grep GENERATED
      • docker에서 mysql 쉘 실행하기

        • docker exec -it mysql_container mysql -uroot -p
      • 처음에 mysql을 사용하면 번호를 바꿔야한다

        • alter user 'root'@'localhost' identified with mysql_native_password by '1234';



  1. MySQL 설치와 AWS의 RDS
  • AWS RDS란?

    • AWS가 제공해주는 다양한 관계형 데이터베이스 서비스

    • 이후 실습은 여기서 만든 AWS RDS를 사용할 예정이고, 공용 계정을 사용할거니깐 계정 정보는 내일 준다

      • 돈낭비 하지말라는 것 같음




  1. DDL과 RDBMS 예제 데이터 소개
  • 웹 서비스 사용자/세션 정보 1

    • 사용자 ID

      • 웹 서비스에 등록된 사용자마다 부여하는 ID
    • 세션 ID (Session ID)

      • 세션마다 부여되는 ID

        • 사용자가 방문 후 30분간 interaction이 없다면 새로 세션을 생성할 수 있음(꼭 30분은 아니고 웹 사이트마다 다르다)
      • 사용자의 웹 사이트 방문을 논리적인 단위로 나눈 것을 세션(Session)이라고 한다

        • 사용자가 외부 링크를 타고 들어오가나 직접 방문하면 세션이 생성


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

    • 한 명의 사용자가 여러 세션을 만들 수 있고, 세션은 생성 시간도 기록한다

      • 세션을 만들어낸 접점(경유지)를 채널이라는 이름으로 기록한다. 그래서 마케팅 관련 기여도 분석을 할 수 있다.
      • 예를 들어, 세션 분석을 통해 어떤 사이트에서 한 광고로 인해 몇 명이나 접속했는지 등등
    • 세션에 대한 정보를 기반으로 다양한 데이터 분석과 지표 설정 가능


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

    • 사용자 ID 100이 총 3개의 세션을 갖는 예시 (사진 수정하자)



  • 관계형 데이터베이스(RDB) 예제

    • 초기 설정 (세션 정보)

      • 컬럼타입부가설명예시
        idint세션 ID101
        user_idint사용자 ID202
        createdtimestamp세션 생성시간2021-08-10 17:01:28
        channelvarchar(64)채널(접점) 이름Facebook

    • 테이블 두 개로 나누기

      • prod 데이터베이스의 session 테이블

        • 컬럼타입
          idint
          user_idint
          createdtimestamp
          channel_idint
      • prod 데이터베이스의 channel 테이블

        • 컬럼타입
          idint
          channelvarchar(32)

  • 테이블 필드의 중요 속성 1

    • Primary Key

      • 테이블에서 레코드의 유일성을 정의하는 필드(컬럼)
        • 예를 들면 주민번호
      • Composite Primary Key
        • 두 개 이상의 필드(컬럼)으로 만든 Primary Key
      • Primary Key로 지정된 필드가 있는 경우 DB에서 중복된 값을 갖는 레코드를 방지할 수 있다
        • 유일한 식별자
    • Foreign Key

      • 테이블의 특정 필드를 다른 테이블에서 가져오는 경우
    • 구현

      • CREATE TABLE Session ( 
            id int,
            user_id int,
            created timestamp,
            channel_id int,
            PRIMARY KEY(id)
            FOREIGN KEY(channel_id) REFERENCES Channel(channel)
        );
        
        CREATE TABLE Channel ( 
            id int,
            channel varchar(30),
            PRIMARY KEY(id)
        );

  • 테이블 필드의 중요 속성 2

    • NOT NULL

      • 비어있으면 안 된다는 속성

      • 필드값이 항상 존재해야하는 경우 사용한다

    • DEFAULT value

      • 필드에 값이 주어지지 않는 경우, MySQL이 알아서 기본값을 정의해줌
      • timestamp 타입은 CURRENT_TIMESTAMP를 사용하면 현재 시간으로 설정됨
    • 구현

      • CREATE TABLE Session ( 
            id int NOT NULL,
            user_id int,
            created timestamp,
            channel_id int,
            PRIMARY KEY(id)
            FOREIGN KEY(channel_id) REFERENCES Channel(channel)
        );
        
        CREATE TABLE Channel ( 
            id int NOT NULL,
            channel varchar(30),
            PRIMARY KEY(id)
        );

  • 최종 table Channel 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)
      );

  • 최종 table Session DDL

    • CREATE TABLE Session(
          id int not null auto_increment,
          user_id int not null,
          created timestamp not null default CURRENT_TIMESTAMP,
          channel_id int not null,
          primary key(id),
          foreign key(channel_id) references Channel(channel)
      );

0개의 댓글