본문 바로가기

CS ﹒ Algorithm/Network Infra

네트워크 인프라 (3) 3계층 아키텍처의 흐름과 가상화

 

1. 서버와 OS

*네트워크의 3계층 아키텍처에서도 실제로는 모두 스위치를 이용해 경유하며 각 물리 서버 컴퓨터가 요청을 처리하고 있는 것이기 때문에 기본적인 프로세스와 스레드에 대해 기초적인 부분은 알고 넘어가야 한다.

 

 

1-1. 프로세스와 스레드

 

 

1. 우리가 설치된 프로그램을 실행하면 OS관리자인 Kernel이 프로세스를 작성하고 메모리 공간을 할당한다.

2. 프로세스가 시작되면 사용자의 요청을 받는다.

 

하나의 프로세스는 메모리 공간(Stack, Heap, Data 등)을 점유하며 내부에는 최소 1개 이상의 스레드가 동작한다.

이 때 스레드는 프로세스 내부의 실행 흐름으로 볼 수 있다.

이미 프로세스가 독립된 메모리 공간을 점유하고 있기 때문에 스레드를 시작해도 신규 메모리 공간은 필요 없으나, 하나의 스레드에 문제가 생기면 프로세스 전체에 영향을 끼친다.

 

프로세스는 독자적인 메모리 공간을 가지기 때문에 처음 생성 시 CPU의 부하가 증가하며, 멀티 프로세스 어플리케이션의 경우 프로세서의 생성 부담을 낮추기 위해 미리 프로세스를 시작시키는 작업을 거친다. (Pooling)

반대로 스레드는 이미 확보된 메모리 공간에서 생성되기 때문에 생성 시 부하는 낮으나, 한 개의 메모리 공간을 공유하기 때문에 의도치 않은 데이터(전역 변수에 대한)의 R/W가 일어날 수 있다.

 

* 단 Oracle DB의 경우 개별 메모리(PGA)와 전체 공유 메모리(SGA)로 메모리 공간이 나뉘어, 공유 메모리는 데이터 캐시, 테이블, 인덱스 등이 저장되고 개별 매모리에는 해당 프로세스가 사용하고 있는 영역만 저장하는 방식으로 프로세스간에도 메모리를 일부 공유하고 있다.

 

1-2. OS 커널

 

OS 커널은 운영체제의 핵심으로써 추상화 인터페이스 역할과 메모리 관리 등을 하고 있다.

커널의 핵심적인 역할은 다음과 같다.

 

(1) 시스템 콜 인터페이스(System Call Interface)

: 어플리케이션이 내부적으로 처리할 수 없고, OS를 통해 요청해야할 것이 있을 경우 System Call을 통해 커널에 요청하고, 커널이 인터페이스를 통해 전달한다.

네트워크I/O, 디스크I/O, 새로운 프로세스 생성 등 애플리케이션은 필요한 것이 있으면 시스템 콜만 호출할 뿐 직접적인 처리 과정에 대해서는 전혀 몰라도 된다.(추상화

 

(2) 프로세스 관리

: 프로세스의 Scheduling을 담당한다.

즉, 프로세스의 cpu 코어 이용률 배정, 우선순위 등을 관리한다.

(실행을 요청하고 실행을 허가(응답)하는 부분 또한 스케줄링에 포함된다)

 

(3) 메모리 관리

: 메모리 공간의 최대치, 독립 메모리 공간 확보, 상호간 메모리 공간 침범 방지 등의 각 프로세스가 독립성을 유지할 수 있도록 관리한다.

 

(4) 네트워크 스택

: 이 부분은 짧게 설명하기 힘들다.

https://d2.naver.com/helloworld/47667

 

(5) 파일 시스템 관리

: 디렉토리 구조 제공, 데이터에 대한 엑세스 관리, 고속화, 안정성 보장 등의 역할을 한다.

커널이 파일 시스템이라는 인터페이스를 제공하고 있기 때문에 프로세스는 실제 메모리 주소나 디스크 주소를 알 필요 없이 오직 파일 이름이라는 관점 하나로 접근 가능하다. (추상화)

 

(6) 장치 드라이버 관리

: 한 가지 외부 장치만 해도 모두 회사별로 독자 규격이 존재한다.

커널은 이를 드라이버를 사용해서 하나의 인터페이스에 묶어 실제로 애플리케이션이 장치 I/O가 필요할 때 개별 회사의 드라이버를 모두 알지 않아도 작동되게 해준다. (추상화)

 

 

 

 

 

2. 3계층 네트워크 시스템의 흐름

 

2-1. Client -> Web Server

 

도메인의 트리구조

 

(1) https://naver.com을 검색한다. 

(2) 브라우저는 OS 호스트명과 IP 주소 변환 테이블을 확인한 후, 정보를 찾지 못하면 외부 DNS에 요청한다.

* 이를 Name Resolution이라고 한다.

(3) 전 세계 DNS 서버는 트리구조로 이어져 있으며 여기서 해당 이름을 찾아 ip 주소를 반환한다.

(4) 유저의 요청이 웹 서버에 도착하면 프로세스(httpd, httpd 데몬)가 요청을 확인하고 정적 컨텐츠면 저장소에 있는 데이터를 바로 반환하고, 동적 컨텐츠면 AP 서버에 요청을 보낸다.

* 동적 컨텐츠는 수시로 갱신되기 때문에 저장소에 이를 저장하면 병목 현상이 생긴다. 따라서 AP 서버에서 동적으로 HTML을 생성해서 보내준다.

 

 

2-2. Web Server -> AP Server

 

(1) 웹 서버로부터 요청이 도착하면 AP Server의 스레드가 요청을 받는다.

- 이 때, 웹 서버에서 들어온 요청은 커널에 의해 Intturpt처리 된다.

 

(2) Database가 필요한 요청이라면 DB Connection Pool에 접근한다.

- Network I/O 요청이기 때문에 이 때도 System call로 요청한다.

- 각 Database System마다 모두 드라이버가 별도로 필요하지만 kernel의 추상화로 모두 해결할 수 있다.

 

대표적으로 자바의 경우 JVM이 AP Server 역할을하게 되는데, 자주 사용되는 정보는 JVM 내부 혹은 전용 캐시 서버에 등록하여 DB 서버에 접근하지 않고 해결하는 방법도 존재한다.

이 때 사용하는 전용 캐시 서버를 CDN(Content Distribution Network)라고 부르며, 자주 사용하는 캐시를 외부에 저장하여 DB 트래픽을 줄일 수 있기 때문에 병목 현상을 완화하기 위해 대부분의 웹 서비스에서 사용하고 있다.

 

 

2-3. AP Server -> DB Server

 

(1) DB 프로세스가 요청을 접수한다.

(2) 요청 데이터에 대한 캐시를 탐색한다.

(3) 캐시를 찾지 못했다면 디스크에 액세스한다.

* 내부 디스크를 사용하는 경우도 있고, 외부 저장소(Storage)를 사용하는 경우도 있다.

(4) 데이터를 반환하고, 이 때 캐시에 데이터를 저장한다.

(5) AP Server에 반환한다.

 

 

2-4. AP Server -> Web Server -> Client

 

(1) DB 서버로부터 도착한 데이터를 이용해 요청에 대한 처리를 연산하고 파일화한다.

(2) Web Server에게 결과를 반환한다.

(3) Web Server의 프로세스인 HTTPD는 받은 데이터를 그대로 반환한다.

(4) 결과가 웹 브라우저로 반환되고 화면에 표시된다.

 

결국 전체 흐름은 프로세스, 혹은 스레드가 대기하다가 요청을 받고 내부에서 해결할 수 없는 일은 다른 서버로 요청하는 방식이다.

기본적으로 요청 기반 아키텍처이기 때문에 미리 요청 수요를 정확히 예측할 수 없어서 성능에 문제가 발생한다.

 

 

 

3. 가상화

: 물리적으로 존재하는 것은 아니나 실제로 존재하는 것과 같이 작동.

 

3-1. 가상화와 가상 머신

 

가상화는 컴퓨터의 물리 리소스를 추상화하는 것으로, 클라우드 환경의 기반이 된다.

운영체제도 하나의 가상화 기술로써 애플리케이션이 메모리 주소나 디스크 주소를 몰라도 OS의 커널에 의해 추상화된 부분만 인터페이스로 접근하여 요청/응답 처리를 할 수 있고, 한 번에 여러개의 프로그램을 실행할 수 있도록 스케줄링, 메모리 관리 등의 역할을 수행하고 있다.

 

Host OS (VM ware)

 

가상 머신은 이런 OS를 다시 한 번 가상화하여 작동시켜주는 것으로, 호스트 OS형과  하이퍼바이저형으로 나뉜다.

호스트 OS형은 기존의 운영체제에 VMware, MS virtual Server 등을 설치해 소프트웨어로 운영체제를 에뮬레이팅하는 것이고, 하이퍼바이저형은 하드웨어 자체에서 가상화 소프트웨어를 실행하고 그 위에 가상 머신을 동작시키는 것이다.

당연히 별도의 OS를 거치지 않기 때문에 하이퍼바이저형이 성능이 우수하다.

 

 

전상화(좌) 준 가상화(우)

 

하이퍼 바이저형은 완전 가상화와 준 가상화로 나뉜다.

(1) 전가상화 : OS 및 드라이버를 완전히 가상화하여 게스트가 하드웨어에 직접적으로 요청을 보낸다. (물론 하드웨어는 다시 한 번 하이퍼바이저에 요청을 보낸다.)

(2) 반가상화 : 가상환경용 하드웨어를 에뮬레이팅한 것으로써, 게스트는 하이퍼바이저를 통해 하드웨어에 요청을 보낸다. OS별로 전용 드라이버나 최적화 커널을 이용해야 한다.

 

인텔, AMD등의 프로세서가 자체적을 가상 하드웨어 지원 기능을 탑재하고 있기 때문에 이전의 소프트웨어 방식에 비해 성능이 크게 개선되어 현재는 전가상화가 더 많이 사용되고 있다.

 

 

 

3-2. 컨테이너

 

컨테이너는 리소스(자원)이 완전히 격리된 프로세스로, 각각 독립된 루트 파일 시스템과 CPU/Memory 공간 등을 할당 받아 사용할 수 있으며 한 OS 위에서 여러개를 실행할 수 있다.

 

 

도커 파일로 원하는 도커 이미지(애플리케이션의 프레임워크, 라이브러리, 구동환경OS 등)을 작성하고 배포하면 도커 서버에서 도커 이미지를 사용하여 작동하는 방식이다.

라이브러리와 프레임워크 등을 도커 이미지로 묶어서 공유하기 때문에 특정 환경에서만 발생하고 내 환경에서는 발생하지 않는 에러가 발생하기 어려워 유지보수에 편리하다.

또한 호스트 OS의 커널을 그대로 공유하기 때문에 한 대의 호스트 머신에서도 더 많은 컨테이너를 실행 가능하고, OS커널에서 즉시 컨테이너의 실행 및 정지를 관리할 수 있어 빠르다.

 

 

3-3. 클라우드 / 가상화

 

 

 

위에서 학습한 내용이 요즘 핫한 클라우드 네트워크에 모두 녹아들어 있다.

사실 이 부분은 AWS, GCP, Azura에 접속하면 아주 친절하게 설명되어 있다.

 

Packaged Software

: 사용자가 물리 장비부터 모두 구축하는 것이다.

 

IAAS

: 하드웨어는 중간 업체에서 대신 관리해주고, 이외의 부분은 사용자가 구축한다.

흔히 말하는 가상 호스팅이 여기에 속하지만 하위 계층 직접 접근할 수 없다.

AWS의 EC2가 여기에 속한다.

 

PAAS

: 런타임 환경까지 모두 중간 업체에서 관리하고 있기 때문에 소스 코드만 빌드해서 보내면 서비스를 작동시킬 수 있다.

첫 구축은 편리하나 플랫폼이 종속될 수 있다는 단점이 존재하며, 마찬가지로 런타임 계층을 포함한 하위 계층에 접근할 수 없다.

 

SAAS

: 업체에서 모든 것을 제공하고 사용자는 오직 서비스를 이용만 하는 것이다.

네이버 클라우드 등 원격 저장소가 이에 해당된다.