Contents
(MariaDB)DB에 클라우드 구성하기 - 인스턴스 생성 및 테이블 추가
   2022년07월15일     8분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] 클라우드의 구성 요소들에 대한 DB 실습

MariaDB (4) - 클라우드의 DB 실습

  • 인스턴스 생성하고 생성된 인스턴스의 정보를 DB로 전송하기
    • 클라우드/가상화 환경에서 사용하는 인스턴스는 일반 VM과는 달리 이미지 OS가 설치되어있는 형태를 이미지화한 것임
    • VM은 이미지


  • On-Demand
    • 클라우드 환경은 On-Demand
    • 완전 관리형 서비스: 데이터베이스와 같은 경우 사용자가 직접 운영체제를 설치하고, 서비스 애플리케이션을 설치하는 과정이 생략된 상태에서 주문 즉시 해당 서비스를 이용할 수 있어야 한다
    • 대신 사용자는 OS, 애플리케이션 자체애 대한 접근 권한은 가질 수 없음


  • 클라우드에서 제공하는 Serverless 서비스
    • 파이썬 등과 같은 언어를 이용하여 일종의 트리거(함수)를 만들어 두는 것
    • 함수를 통해 특정 상황에서 특정 작업을 수행하게끔 할 수 있다
    • (실제로는 서버가 있지만)



셸 스크립트의 변수 사용방법

1 . 변수 지정 및 출력

[root@dblab ~]# a=hello
[root@dblab ~]# echo MR.${a}, welcome
MR.hello, welcome

2 . 날짜 저장하기

[root@dblab ~]# date
Fri Jul 15 11:26:29 KST 2022
[root@dblab ~]# a=$(date)
[root@dblab ~]# echo Current time is ${a}
Current time is Fri Jul 15 11:24:28 KST 2022

3 . 날짜 일부 가져오기

[root@dblab ~]# a=$(date +%y%m%d)
[root@dblab ~]# echo $a
220715

4 . 정상이면 0으로 표시됨

[root@dblab ~]# echo $?
0

5 . 명령실행 결과코드에서 0을 제외한 나머지는 모두 Error임

[root@dblab ~]# ping www.google -c 1
ping: www.google: Name or service not known
[root@dblab ~]# echo $?
2
[root@dblab ~]#
[root@dblab ~]# asdasd www.google.com -c 1
bash: asdasd: command not found...
[root@dblab ~]# echo $?
127

6 . 파일로 저장

[root@dblab ~]# date > result.txt
[root@dblab ~]# cat result.txt
Fri Jul 15 11:30:54 KST 2022

7 . 오류날 경우 파일에 저장되지 않는다

[root@dblab ~]# adasd www.google.com -c 1 > result.txt
bash: adasd: command not found...
[root@dblab ~]# cat result.txt
[root@dblab ~]#
[root@dblab ~]# adasd www.google.com -c 2 > result.txt
bash: adasd: command not found...
[root@dblab ~]# cat result.txt
[root@dblab ~]#
[root@dblab ~]# ping www.google.com -c 1 > result.txt
[root@dblab ~]# cat result.txt
PING www.google.com (172.217.174.100) 56(84) bytes of data.
64 bytes from nrt12s28-in-f4.1e100.net (172.217.174.100): icmp_seq=1 ttl=128 time=34.6 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 34.574/34.574/34.574/0.000 ms
  • 표준입력코드: 0
  • 표준출력코드: 1
  • 표준에러코드: 2



리눅스 가상화 환경 설치하기

1 . 하이퍼바이저 다운로드

  • wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericClo^C-2003.qcow2.xz -> 클라우드용 이미지 다운로드
  • xz -d CentOS-7-x86_64-GenericCloud-2003.qcow2.xz -> 압축풀기


2 . 하이퍼바이저 설치

  • yum update -y
  • yum -y install @virt -> 가상화 관련 도구들을 패키징해서 설치해 줌
  • yum -y install libguestfs-tools -> 클라우드용 이미지를 커스터마이징 할 수 있음


3 . SELINUX 비활성화

  • setenforce 0
  • sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config -> 오른쪽 문자열로 바꾸어라
  • sed -i ‘s/enforcing’

리눅스의 보안

  1. Firewalld
    • 특정 포트만 허용하도록 함
  2. SELINUX
    • 허용하지 않은 디렉터리 접근을 막는다
    • 내부 자원에 대한 보안을 설정한다


4 . 서버 가상화 서비스 실행

  • vi /etc/libvirt/qemu.conf
    • 주석처리 제거
...
  519 user = "root"
  520
  521 # The group for QEMU processes run by the system instance. It can be
  522 # specified in a similar way to user.
  523 group = "root"
...
  • systemctl enable libvirtd && systemctl start libvirtd -> 서비스 실행
  • yum -y install virt-manager -> 가상 머신 관리 도구 설치
  • 다음 애플리케이션이 생긴 것을 확인할 수 있다
    • img_25



리눅스 가상화 환경을 만들고, 요구사항에 맞게 변경시키기

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


1 . 이미지 복사

  • cp CentOS-7-x86_64-GenericCloud-2003.qcow2 gildong.qcow2


2 . 패스워드 지정 및 이미지에 웹 서버를 설치

  • virt-customize -a gildong.qcow2 –root-password password:test123 –install httpd –run-command ‘systemctl enable httpd’ –selinux-relabel


3 . 이미지 한번 더 복사

  • cp gildong.qcow2 chulsoo.qcow2
  • 길동은 스크립트로 값을 받아서 인스턴스를 만들어 볼 것임


4 . 인스턴스 만들기

  • virt-install –name gildong –vcpus 1 –ram 1024 –disk /cloud/gildong.qcow2 –os-type linux –os-variant rhel7.0 –import –noautoconsole
  • virt-install –name gildong –vcpus 1 –ram 1024 –disk /cloud/gildong.qcow2 –os-type linux –os-variant rhel7.0 –import –noautoconsole > /dev/null
    • 인스턴스에 자원 할당해서 생성함, redhatenterprise7, null로 보내 출력 메시지 생략하기
  • 실행 중인지 확인해 보자
[root@dblab cloud]# virsh list --all
 Id   Name      State
-------------------------
 2    gildong   running


5 . 동작 상태 확인하기

  • virtual machine manager에서 동작 상태를 확인할 수 있다
    • img_26
  • 인터넷 연결도 잘 되는 것이 보인다
    • img_27


6 . 인터페이스에 할당된 주소 확인하기, IP만 확인하기

[root@dblab cloud]# virsh domifaddr gildong
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:65:3b:ec    ipv4         192.168.122.251/24

[root@dblab cloud]# name=gildong
[root@dblab cloud]# virsh domifaddr $name;
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:65:3b:ec    ipv4         192.168.122.251/24

[root@dblab cloud]# virsh domifaddr gildong | grep ipv4 | gawk '{print $4}'
192.168.122.251/24

[root@dblab cloud]# virsh domifaddr gildong | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}'
192.168.122.251



스크립트를 활용해서 가상화 환경 만들기

1 . 스크립트 파일 생성

[root@dblab cloud]# touch instance.sh
[root@dblab cloud]# chmod +x instance.sh
[root@dblab cloud]# vi instance.sh


2 . 스크립트 파일 구성: instance.sh

#!/bin/bash

# variables initiate
name=''
vcpu=''
ram=''

# instance name, vcpu, ram option input
clear
echo -e "Instance Creation Program..."
echo
echo -en "\t Instance Name: "
read name
echo -en "\t How Many CPUs Do you want: "
read vcpu
echo -en "\t Memory Size: "
read ram # save
echo -e "Please wait..."

# copy base image file
cp chulsoo.qcow2 $name.qcow2

# create/install instance, do not print
virt-install --name $name --vcpus $vcpu --ram $ram --disk /cloud/$name.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null

# stop screen during 15sec (to make it install)
sleep 15

# finish message
echo
echo -e "Finished!"

result=$(virsh list --all | grep -e ${name})
echo -e "\t $result"
echo


3 . 실행해 보자

		 Instance Creation Program

	 Instance Name: Brian
	 How Many CPUs Do you want: 1
	 Memory Size: 1024
Brian
1
1024
WARNING  OS name 'rhel7' is deprecated, using 'rhel7.0' instead. This alias will be removed in the future.
WARNING  KVM acceleration not available, using 'qemu'
		 Finished

[root@dblab cloud]# virsh list --all
 Id   Name      State
-------------------------
 2    gildong   running
 3    Brian     running



셸과 스크립트에서 SQL문 실행하기

1 . 조회

[root@dblab cloud]# mysql -u root -p1234

[root@dblab cloud]# mysql sqlDB -u root -p1234 -e "select name, addr from userTbl"
+-----------+--------+
| name      | addr   |
+-----------+--------+
| 바비킴    | 서울   |
| 은지원    | 경북   |
| 조관우    | 경기   |
| 조용필    | 경기   |
| 김범수    | 경남   |
| 김경호    | 전남   |
| 임재범    | 서울   |
| 이승기    | 서울   |
| 성시경    | 서울   |
| 윤종신    | 경남   |
+-----------+--------+


2 . 삽입

[root@dblab cloud]# id=user1
[root@dblab cloud]# name=gildong
[root@dblab cloud]# year=1996
[root@dblab cloud]# addr=NY

[root@dblab cloud]# mysql sqlDB -u root -p1234 -e "INSERT INTO userTbl VALUES ('$id', '$name', $year, '$addr', NULL, NULL, NULL, NULL)"

[root@dblab cloud]# echo $?
0
  • 따옴표 내부에는 다른 종류의 따옴표가 있어야 함
  • year은 문자가 아닌 숫자로 넣어 줘야 하므로, 따옴표를 넣지 않았다


3 . 다음 시나리오를 참고하여 테이블과 제약 조건 만들기

  • Cloud DB 실습 시나리오
    • 물리 서버에서 확인할 수 있는 정보(hostTbl)
      • hostname 명령을 통해서 서버의 이름을 확인 가능 [PK]
      • ifconfig 명령의 일부 정보를 필터링해서 IP 주소를 확인 가능 [NOT NULL]
    • 인스턴스에서 확인할 수 있는 정보(instanceTbl)
      • 인스턴스의 이름: $name
      • 호스트서버 이름: dblab
      • 인스턴스IP 주소: $ipinfo
        • ipinfo=$(virsh domifaddr gildonggrep ipv4gawk ‘{print $4}’gawk -F/ ‘{print $1}’)
      • 인스턴스 메모리: $ram


  • img_28


4 . 스크립트 파일 구성: instance.sh

#!/bin/bash

# variables initiate
name=''
vcpu=''
ram=''

# instance name, vcpu, ram option input
clear
echo -e "[Instance Creation Program]"
echo -en "\t Instance Name: "
read name
echo -en "\t How Many CPUs Do you want: "
read vcpu
echo -en "\t Memory Size: "
read ram # save
echo -e "Please wait..."

# copy base image file
cp chulsoo.qcow2 $name.qcow2

# create/install instance, do not print
virt-install --name $name --vcpus $vcpu --ram $ram --disk /cloud/$name.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null

# stop screen during 15sec (to make it install)
sleep 15

# finish message
echo
echo -e "[Finished!]"

# print instance result
result=$(virsh list --all | grep -e ${name})
echo -e "$result"
echo

# To database, Re-Trying until getting IP address
echo -e "Applying to Database. Please wait..."
echo -ne 'trying #____\r'
iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')

if [ -z ${iip} ];then
   sleep 60
   echo -ne 'trying ##___\r'
   iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
fi

if [ -z ${iip} ];then
   sleep 60
   echo -ne 'trying ###__\r'
   iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
fi

if [ -z ${iip} ];then
   sleep 60
   echo -ne 'trying ####_\r'
   iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
fi

if [ -z ${iip} ];then
   sleep 60
   echo -ne 'trying #####\r'
   iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
fi

echo -e "{$iip}"
mysql cloudDB -u root -p1234 -e "INSERT INTO instanceTbl VALUES ('$name','$HOSTNAME','$iip',$ram)"
mysql cloudDB -u root -p1234 -e "SELECT * FROM instanceTbl WHERE iname = '$name'"
  • IP는 받아와 지는 속도가 느려 다음과 같이 대기시간을 늘렸음