0부터 시작하는 Maria DB 공부 - 인스턴스 배포해보기

Jaehong Lee·2022년 7월 15일
2
post-thumbnail

1. 클라우드의 서비스

  • 클라우드 환경에서는 ' ON - DEMAND ' 서비스가 중요하다

    • ON - DEMAND : 요청에 따라 서비스를 바로 제공하는 것
  • 클라우드에서 DB와 같은 경우 사용자가 직접 OS를 설치하고, 서비스 애플리케이션을 설치하는 과정이 생략된 상태에서 주문 즉시 해당 서비스를 이용할 수 있어야 하는 ' 완전 관리형 서비스 '가 중요하다

    • 완전 관리형 서비스 : DB 서비스를 이용하는 것으로, 내부적으로 서버/OS가 있지만, 사용자에게는 드러나지 않으며, DV 솔루션 설치 또한 필요 없이 바로 DB를 사용할 수 있다
    • 대신 사용자는 OS, 애플리케이션 자체에 대한 접근 권한은 없다
  • 클라우드에서 제공하는 ServerLess 서비스

    • Python등과 같은 언어를 이용하여 일종의 트리거 ( 함수 ) 를 만들어두는 것
    • 실제로는 서버가 있지만, 해당 서버 자체에 대한 접근은 불가하며, 언어를 이용하여 서비스를 호출하는 방법

2. 인스턴스 실습 환경 구성 & 이미지 다운

  • 인스턴스를 생성하고, 생성된 인스턴스의 정보를 DB로 전송하기

  • 클라우드 또는 가상화 환경에서 사용하는 인스턴스는 일반 VM 과는 달리, 이미지 OS가 설치되어 있는 형태를 이미지화 한 것이다

  • 가상 머신 RAM 증가

  • 가상 머신 CPU 가상화 커널을 사용한다고 설정한다

  • 각 Directory를 확인해보자. 우리는 Cloud 실습에 필요한 Data를 cloud Directory에 저장할 것이다

  • VM 은 OS 설치에서 부터 패키지 설치까지 직접 모든걸 수동으로 해야하지만, 클라우드 용 이미지를 이용한 인스턴스는 배포하는 형식이다

  • 다음 사이트에 들어가자

  • 우리는 Cloud에 저장할 이미지를 CentOS 7로 설정할 것이다

  • 해당 파일을 우클릭해서 주소를 복사하자

  • 일반 CPU는 X86 계열이므로, X86에 해당하는 걸 다운 받아야한다

  • Cloud 폴더로 이동해서, 아까 복사한 링크를 wget을 통해 다운 받자

  • 다운이 끝났으니 실습을 진행하자

  • 확인해보면 잘 저장됬다. 이 파일은 xz ( xz는 파일 하나만을 압축 ) 형식으로 압축 ( compress ) 되어있으므로, xz -d ( decompress ) 를 통해 압축을 풀어준다

  • 압축을 풀었을 때, 용량이 해당 숫자와 똑같아야한다

  • 압축이 잘 풀렸다

  • 이름을 변경시킨다. ?는 잘못 친 것이니 CentOS.qcow2로 바꿔주자

3. 실습에 사용할 리눅스 명령어

  • 변수를 만들때 띄어쓰기하면 안된다. 띄어쓰기하면 해당 변수명을 명령어로 인식한다
  • echo는 출력해주는 명령어다. 뒤에 $를 통해 출력하고 싶은 것을 지정할 수 있다
  • 출력시 변수를 구분하고 싶으면 { } 안에 변수를 넣어준다. 뒤에 all은 그냥 글자다. { } 안에 있는 것만 변수 이름 인 것을 알려준다
  • 명령의 결과값을 변수에 담고 싶으면 $( ) 를 사용한다. 이는 괄호 안의 문자열을 명령으로 처리하여, 결과를 변수에 담으라는 뜻이다
  • ( ) 없이 그냥 쓰면, 밑에와 같이 해당 명령어 자체를 문자열로 인식해서 변수에 저장해버리기에 명령의 결과값을 담고 싶으면 $( 명령어 ) 를 사용해야 한다
  • %y, %m, %d를 통해 연/ 월/ 일만 2글자씩 뽑아서 저장할 수 있다
  • 직전에 실행된 명령의 실행 결과코드를 출력해준다. 0이면 잘 실행된거다. 나머지는 모두 error 다
  • 명령 실행에 error가 생기면 위처럼 다른 코드가 출력된다
  • 결과를 화면에 출력하는 것이 아닌, 파일에 결과를 저장하고 싶으면 > 를 통해 저장할 파일의 이름을 명시해서 쓰면 된다
  • cat을 통해 파일의 내용을 출력하면, date의 결과 값이 잘 저장된 것을 확인할 수 있다
  • 만약 명령어에서 error가 나면 저장이 안된다. 부등호는 명령이 정상 실행됬을 때의 결과값만을 저장한다
  • 위와 같이 에러 코드 ( 2 ) 로 지정하면 에러가 걸렸을때만 저장한다. 파일을 확인해보면 에러 메세지가 파일에 잘 저장됬다
  • 정상 실행을 한다면, 에러가 발생하지 않았으므로 저장되지 않고, 실행 결과를 출력한다. 파일을 열어보면 저장이 안됬으므로, 아무것도 출력되지 않는다
    • 표준 입력 코드 : 0
    • 표준 출력 코드 : 1
    • 표준 에러 코드 : 2

4. 가상화 환경 구성

  • 가상화 환경을 만들기 위한 설정들을 진행할 것이다

1. 하이퍼 바이저 설치

yum update -y
yum -y install @virt ( 가상화 관련 도구들을 패키지로 묶어 설치해 준다 )
yum -y install libguestfs-tools ( 클라우드용 이미지를 커스터마이징 할 수 있는 도구 )

  • && 를 통해 앞에 작업이 완료되면, 바로 뒤에 작업이 실행되게 할 수 있다
  • -y는 설치 중 나오는 y/n 에 대해 무조건 yes 하겠다는 설정이다
  • 관리 도구를 설치한다
  • 관리 도구를 실행한다

2. 하이퍼 바이저 설정

  • sed -i는 지정한 파일에 해당 문자열이 있다면, 지정한 문자열을 변경시키는 것이다. 즉, 설정을 변경시킨 것 이다
  • 확인하면 잘 변경되었다
    • 리눅스의 보안
    1. FWD : 외부에서 서버에 접근하는 것에 대한 보안
    2. selinux : 서버 내부의 보안
  • 즉, 보안을 비활성화 했다. enforcing은 당장 비활성화 하라는 뜻 이다

이제 서버 가상화 서비스를 실행하자

  • 편집기로 해당 파일을 연다
  • 이렇게 #만 제거하여 수정해준다. 이를 통해 가상화 서버에 대한 권한을 root에게만 준다
  • 시스템 부팅시 자동 실행되게 설정하고, libvirtd를 실행한다

3. 클라우드용 이미지의 내용을 요구사항에 맞게 변경시키기

요구사항
1. 기존 이미지를 복사하여 gildong.qcow2 를 생성
2. 해당 이미지에는 루트 패스워드가 없다. 우리는 root / test123 으로 지정하자
3. 기본적으로 웹서비스를 제공할 수 있어야한다. httpd 를 이용한다. 즉, httpd 를 설치하고, OS 부팅시 자동 실행되게 설정한다
4. "3"에서 만든 이미지를 이용하여 배포하기

  • CP는 복사하는 명령어다. 이미지를 복사해서 gildong.qcow2를 생성한다 - 1
  • 이미지에서는 httpd를 바로 실행시킬 수 없다. 따라서 run-command를 통해 부팅시 httpd가 실행되게 설정하면 된다 - 2
  • 생성한 이미지 파일을 커스텀한다. 루트 패스워드를 설정하고, httpd를 이미지 파일에 설치하여, 부팅시 실행되게 하며, selinux도 설정했다 - 2,3
  • cp gildong.qcow2 chulsoo.qcow2 로 이미지를 복사하자
    • rhel7은 centos7의 배포판 이름이다
    • disk는 이미지 파일 자체가 disk이다
    • virt-install을 설치해주고, 설정한대로 가상머신을 만들어준다. 단, 실행 결과는 보기 싫으므로, null에 저장한다. null에 저장하면 자동으로 실행 결과 메세지를 삭제해준다
  • 배포가 완료됬다

5. 배포한 인스턴스 살펴보기

  • 확인하면 gildong이 생성됬고, 실행중인 것을 확인할 수 있다
  • VMM에서도 확인 가능하다
  • 더블 클릭해서 실행하면 가상 머신에 들어가진다. 로그인 해주자
  • IP를 확인해주자
  • HTTPD가 잘 실행중이다. 허나, 방화벽을 찾을 수 없다. 왜일까?
    • 이는, 클라우드 이미지이기 때문이다. 클라우드 이미지에서는 방화벽을 사용하지 않고, ACL과 보안 그룹으로 관리하기 때문이다

  • 바깥 리눅스에서 방화벽을 끄고, 해당 IP에 접속하면 웹 서비스가 잘 실행 중인 것을 확인 가능하다
  • 가상머신의 정보를 확인하자. 대규모 서비스에서는 이를 일일이 확인할 수 없으므로, 반복문을 통해 각 가상머신의 정보를 뽑아서, 스크립트를 통해 DB에 저장한다
  • grep를 통해 필요한 행만 가져오자. | 뒤에 grep 옵션을 주면 된다
  • ipv4라고 써져있는 행을 가져오게 한다
  • '{print $n}' 는 위치 변수다. 이를 0으로 설정하면 전부 가져오고, 그 이외의 숫자는 n번째 위치를 의미한다

    Shell In A Box : Markus Gutschke가 만든 웹 기반 터미널 에뮬레이터로 지정된 포트에서 웹 기반 SSH 클라이언트로 실행되는 웹 서버가 내장되어 있으며 웹 터미널 에뮬레이터가 필요없이 AJAX/JavaScript 및 CSS 지원 브라우저를 사용하여 Linux 서버 SSH 셸에 원격으로 액세스하고 제어하도록 프롬프트 해준다

  • -F는 Data를 나누는 기준이다. Default는 공백이다. 우리는 /를 기준으로 나눌 것이며, 나눠진 Data에서 첫번째 Data를 가져온다. 따라서 뒤에 /24는 출력되지 않으며, 앞에 Ip만 출력된다
  • 변수를 통해 명령을 실행해보자

6. 스크립트로 인스턴스 배포

  • bash 파일을 만들고, 실행 권한을 부여하고, 편집기로 켜준다
    • name, vpcs, ram을 사용자한테 입력 받을 거다
    • -e를 쓰면 정규 표현식을 사용할 수 있다
    • -e 뒤에 n은 출력하고, 밑 줄로 넘어가지 않고, 해당 줄을 유지하는 것이다. 즉, 출력 메시지 옆에 입력할 수 있게 한다. 줄은 \t로 바꿔준다
    • read로 입력한 DATA를 받아온다
  • 저장하고, 실행해보자
  • 잘 저장된다
  • 사용자한테 전달받은 이름으로 이미지 파일을 복사하고, 받은 사양 값과 복사한 이미지 파일로 가상 머신을 만든다
  • 이때, 만들어질때까지 시간이 걸리므로 15초를 대기하게 sleep 해준다
  • 끝나면 정보를 출력하게 한다. ^는 시작, 뒤에 ' $ '는 끝이다. 이로써 name만 쓰면 name을 포함한 문자들이 검색되지만, ^name$로 하면 name과 똑같은 문자만 검색된다. 따라서 name과 똑같은 문자를 가진 행을 가져와서 result에 저장한다
  • 잘 생성됬다
  • 다음 실습을 위해 VMM에서 인스턴스를 삭제하자

  • 하단에 result에 들어가는 name 부분을 수정해주자
  • 코드 설명은 아래와 같다

    #!/bin/bash

    name=''
    vcpu=''
    ram=''

    clear #화면 지우기
    echo -e "\t\tINSTANCE CREATION PROGRAM" #화면에 출력 메세지
    echo -en "\tINSTANCE NAME : " # 문장 출력
    read name # 입력한 값을 변수 name에 저장
    echo -en "\tHOW MANY CPUs DO YOU WANT : "
    read vcpu
    echo -en "\tMEMORY NAME : "
    read ram

    cp chulsoo.qcow2 ${name}.qcow2 # 설치를 위한 디스크를 변수에 담긴 이름으로 복사하여 준비

    virt-install --name {name} --vcpus ${vcpu} --ram ${ram} --disk /cloud/{name}.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null #변수에 담긴 값을 이용하여 인스턴스 설치, 발생되는 메시지는 null에 버린다

    sleep 15 #화면을 15초 동안 정지
    echo -e "\t\tFINISHED" #화면에 결과 출력하기
    result=(virsh list --all | grep ${name}) #화면에 결과 출력하기 echo -e "\tresult" #화면에 결과 출력하기

  • centos01 , centos02를 생성하자. cpu는 1, ram은 1024다
  • Ip를 확인하자

7. 리눅스에서 DB에 DATA 던지기

  • MariaDB 서버에 접속하자
  • sqlDB에 접속하고, TABLE의 정보를 확인하자
  • TABLE 정보를 확인하면, Null을 허용하지 않는 Column을 확인 가능하다
  • -e는 명령 실행 옵션으로, -e를 사용하면 직접 들어가지 않고, 명령을 전달해서 실행하게 한다

p.206

  • INSERT

    insert into 테이블명( 컬럼명 ) VALUES ( 값 ) ; --
    insert into 테이블명 VALUES ( 값 ) ; -- 단, 테이블에 정의된 열 순서와 개수와 동일 해야 한다
    insert into 테이블명 VALUES ( NULL ) ; -- 빈 공간이 들어간다

  • 값들을 INSERT 해준다. 앞에 컬럼명을 안 썻기에 테이블에 정의된 열 순서와 열 개수와 동일하게 작성해줘야한다. NULL 허용 열들은 NULL로 입력해준다
  • 실행이 잘 되었다
  • 저장이 잘 되었다

8. HOST & INSTANCE DB 생성

  • 시나리오

    CLOUDDB

    • 물리 서버에서 확인할 수 있는 정보 (hostTbl)
      • (hostname)hostname 명령을 통해서 서버의 이름을 확인 가능 -> PK VARCHAR(20)
      • (hostip)ifconfig .. 일부 정보 필터링을 통해 IP 주소 확인 가능 -> NOT NULL CHAR(15)
    • 인스턴스에서 확인할 수 있는 정보(instanceTbl)
      • (iname)인스턴스 이름 : $name (PK) VARCHAR(20)
      • (hostname)호스트 이름 : 서버의 이름 강제로 작성 (FK) VARCHAR(20)
      • (iip)인스턴스 IP 주소 : $ipinfo = virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}' CHAR(15)
      • (iram)인스턴스의 메모리 사이즈 : $ram INT
  • 위의 시나리오를 토대로 DB를 구성하자

  • Heidi SQL에서 Table을 만들고, 정보를 입력하자

  • dbForge Studio에 접속해서 PK와 FK를 설정하자

9. 인스턴스 정보 DB에 던지기

  • HostTbl에 행을 추가한다. 이는 리눅스 서버를 의미하므로, 리눅스의 정보를 입력한다. 저번에 localhost에서 dblab으로 이름을 변경했으므로, dblab을 입력한다. IP는 리눅스 가상 머신의 IP를 입력하면 된다
  • instance.sh 파일 밑에 인스턴스 정보를 DB에 저장하기 위한 스크립트를 추가로 작성한다
  • 생성한 인스턴스의 IP를 iip에 담아서 저장한다
  • 저장 후 select를 통해 확인한다
  • ip가 저장이 안된다
  • 리눅스 터미널에서 따로 확인하면 잘 뜬다. 왜 스크립트에서만 작동이 안될까? 이유를 모르겠다
  • 인스턴스 생성 후 DB에 정보 저장 전에 60초를 대기하게 해보자
  • 그래도 안된다. 인스턴스 성능의 문제로 DHCP 에서 IP를 받아오는 시간보다 스크립트 명령을 수행하는 시간이 빨라서 발생하는 문제일 수 있다. 이를 해결하기 위해 시간을 더 늘려보자
  • 240초를 기다리니까 잘 저장됬다
profile
멋진 엔지니어가 될 때까지

0개의 댓글