(MariaDB)DB에 클라우드 구성하기 - 인스턴스 생성 및 테이블 추가
[카카오 클라우드 스쿨] 클라우드의 구성 요소들에 대한 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’
리눅스의 보안
- Firewalld
- 특정 포트만 허용하도록 함
- 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 -> 가상 머신 관리 도구 설치
- 다음 애플리케이션이 생긴 것을 확인할 수 있다
리눅스 가상화 환경을 만들고, 요구사항에 맞게 변경시키기
- 요구사항
- 기존 centos 이미지를 복사하여 gildong.qcow2 를 생성
- 해당 이미지에는 루트 패스워드가 없으므로, root / test123으로 지정한다
- 기본적으로 웹서비스(httpd)를 제공할 수 있어야 한다
- httpd설치 - OS 부팅시 자동 실행되어야 함
- 만든 이미지를 이용해서 이미지 배포하기
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에서 동작 상태를 확인할 수 있다
- 인터넷 연결도 잘 되는 것이 보인다
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 gildong grep ipv4 gawk ‘{print $4}’ gawk -F/ ‘{print $1}’)
- 인스턴스 메모리: $ram
- 물리 서버에서 확인할 수 있는 정보(hostTbl)
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는 받아와 지는 속도가 느려 다음과 같이 대기시간을 늘렸음