가상화
- CPU, 메모리 등 내가 가지고 있는 자원을 논리적인 형태로 묶는 행위
가상화 등장 배경
기존 상황
- 메일 서비스, 백업 서비스의 2개의 서비스를 운영해야 한다고 가정해보자.
- 그럼 단순히 보면 메일 서비스를 위한 서버 1대, 백업 서비스를 위한 서버 1대, 총 2대의 서버가 필요하다.
- 그래서 2대의 서버를 운영 중이다.
문제점
- 비효율적이다.
-
- 실제로 한 서비스에 할당된 서버 자원이 좀 지나치게 풍부하다.
-
- 서비스 특성상 피크 타임이 다르다.
-
- 메일 서버는 일과 시간에, 백업 서버는 밤에 리소스 사용량이 많다. 그래서 메일 서버는 밤에는 놀고, 백업 서버는 낮에 논다.
-
- 결국 내가 가진 자원이 굉장히 비효율적으로 사용되고 있는 상황이다.
-
- 즉 내 자원에 대한 Utilization이 굉장히 떨어진다.
- 그럼에도 불구하고 서비스는 계속해야 하니깐 서버 2대에 대한 유지 비용은 계속 나간다.
해결법
- 가상화 도입하자
- 서버의 자원은 크게 4가지가 있다.
- CPU
- Memory
- Disk I/O
- Network I/O
- 이 자원의 일부를 가상화해서 분리하고(-> 가상 머신을 사용해서)
- 그 위에 독립적인 OS를 올려서 메일 서비스와 백업 서비스를 올린다.
- 이렇게 하면 자원을 효율적으로 활용해서 서비스를 할 수 있다.
- 서버의 자원은 크게 4가지가 있다.
가상화의 문제점
지나친 레이어
- 가상화를 하게 되면 호스트 OS, 하이퍼바이저, 게스트 OS를 거쳐서 서비스(프로세스) 계층으로 진입한다.
- 즉 실제 하드웨어 리소스를 접근하기 위한 레이어가 많아진다.
- 또 각 서비스마다 독립적인 게스트 OS를 할당하는 과정에서 중복되는 레이어도 발생한다
- 하드웨어 위에 호스트 OS 없이 하이퍼바이저가 바로 올라가는 반가상화를 생각해볼 수 있지만, 커널 레벨의 조작이 필요해 일반적인 PC에선 쉽게 사용할 수 없다.
결론
- 가상화는 대안이 될 순 있지만 여전히 문제점이 있다.
-
- 자원을 가상화하기 위한 오버헤드
-
- 여러 레이어를 통과해야 하는 오버헤드 (특히 I/O가 많은 서비스의 경운 가상 머신을 사용하는 것이 성능 저하의 원인이 되기도 함)
-
도커(Docker)
요약
- 리눅스 컨테이너 기술을 응용,
- 프로그램이 동작하기 위해 필요한 모든 것을
- 라이브러리
- 바이너리
- 코드
- 런타임
- 기타
- 컨테이너(container)라는 하나의 공간에 전부 넣고 리눅스 OS 위에 올리는 기술
포인트
-
- 격리 (namespace)
- 컨테이너끼리의 접근을 원천 봉쇄
- 컨테이너 각각이 마치 독립적인 서버에서 돌아가는 것처럼 하게 한다.
- 실제로 컨테이너 내부에서 프로세스 목록을 조회하면 다른 컨테이너의 프로세스는 조회할 수 없다.
-
- 자원 할당 (cgroup)
- 최대 할당되는 지원을 제약
- 컨테이너 간 유동적으로 하드웨어 자원을 효율적으로 활용
장점
- 게스트 OS가 없기 때문에 부팅할 필요가 없다.
- 부팅하지 않아도 되니깐 서비스 시작도 빨리된다.
- 계층이 줄어들어서 전체 서비스 구조가 단순해지고 훨씬 가벼워진다.
- 하드웨어 가상화만을 하기 때문에 성능 측면에서도 확실히 좋아진다. (I/O를 위해서 거치는 레이어가 줄어들었기 때문)
'Programming' 카테고리의 다른 글
Spring Study 01 (0) | 2021.04.27 |
---|---|
Docker 02 (0) | 2021.04.23 |
M1 맥북에서 Docker + Tomcat 이미지 사용하기 (0) | 2021.04.17 |
/dev/null 2>&1 (0) | 2021.04.05 |
Crawling with Selenium & BeautifulSoup (0) | 2021.04.05 |