본문 바로가기

# 01/네트워크

그림으로 공부하는 IT 인프라구조-3

반응형

3. 3계층형 시스템을 살펴보자

 
사용자가 가장 많이 접하는 부분은 '데이터'다. 3계층형 아키텍처를 주축으로, 시스템이 처리하는 데이터와 시스템 상에서의 데이터 흐름을 구체적으로 살펴보도록 한다.
 
3.1 3계층형 시스템의 구성도
 
웹서버, AP서버, DB서버가 있다. 각 서버는 DVD 플레이어와 같이 생겼다. 세 대의 서버는 스위치를 경유해서 연결돼 있다. 각각의 서버를 확대해서 보면 CPU, 메모리, 디스크, NIC/HBA 같은 하드웨어 부품이 나열돼 있다. 이들은 물리장치이다. 
 
3.2 주요 개념 설명
 
3.2.1 프로세스와 스레드
 
프로세스 및 스레드는 프로그램 실행 파일 자체가 아니라 OS 상에서 실행돼서 어느 정도 독립성을 가지고 동작하는 것이다. 대부분의 책이 '사람 모양'으로 표현하고 있듯이, 프로세스나 스레드가 시작되는 것은 마치 사람이 숨을 쉬기 시작하면서 활동하는 것과 같은 의미다. 
프로세스 및 스레드가 활동하려면 메모리 공간이 필요하다. 이것은 커널에 의해 메모리 상에 확보된다. 이 메모리 공간은 막대 인간이 자신을 위해 소유하는 공간으로, 개인 공간이라 할 수 있다. 다양한 처리를 하면서 데이터를 주고받기 위해 이 공간을 사용한다. 
하나의 프로세스가 동작하고 있으면 내부에서는 메모리 공간을 점유하는 스레드 하나가 동작하고 있다. 각 프로세스가 독자 메모리 공간을 가지고 있다. 프로세스 시작시에 전용 메모리 공간을 요청해야 한다. 
메모리 공간을 가지는 것이 '프로세스', JVM도 프로세스로, 내부에서 수많은 스레드가 동작하고 있다.
각 스레드는 메모리 공간을 공유하고 있다. 스레드 시작시에 신규 메모리 공간은 필요 없지만, 다른 스레드에 이상이 발생하면 영향을 받는다.
 
먼저, 웹서버를 보면, 'httpd 프로세스'라고 쓰여 있는 막대 인간이 프로세스다. 그 주변을 감싸고 있는 하얀 공간이 프로세스의 메모리 공간이다. AP 서버도 보면 스레드 라고 쓰여 있는 막대 인간이 스레드이다. 웹서버와 달리 AP 서버 상의 막대인간은 하나의 메모리 공간을 공유하고 있다. 이것이 프로세스와 스레드의 큰 차이점이다. 프로세스는 전용 메모리 공간을 이용해서 동작한다. 스레드는 다른 스레드와 메모리 공간을 공유하고 있는 운명 공동체다. 
프로세스와 스레드 중에 어떤 것을 선택할지는 애플리케이션 개발자가 정한다. 각각의 특성을 이해하고 설계와 프로그래밍할 필요가 있다. 예를 들어, 프로세스는 독자 메모리 공간을 가지기 때문에 생성 시 CPU 부하가 스레드와 비교해 높아진다. 때문에 멀티 프로세스 애플리케이션에서는 프로세스 생성 부담을 낮추기 위해 미리 프로세스를 시작시켜 둔다. 이 실제 예가 연결 풀링이라 불리는 것이다. 
여러 개를 동시에 실행할 때의 프로세스와 스레드의 장단점을 간단히 정리해보자.
 
프로세스
장점 - 개별 처리 독립성이 높다.
단점 - 생성 시 CPU 부하가 높다.
 
스레드
장점 - 생성 시 부하가 낮다.
단점 - 메모리 공간을 공유하기 때문에 의도하지 않는 데이터 읽기/쓰기가 발생할 수 있다.
 
단, 프로세스가 메모리 공간을 공유할 수 없는 것은 아니다. 이와 별도로 프로세스별 독자메모리 영역도 있어서 용도별로 나누어 사용하고 있다. 프로세스 간에 공유하고 싶은 데이터, 예를 들어 캐시로 저장하고 있는 데이터는 공유 메모리 상에 둔다. 한편, 프로세스 단독으로 이용하는 데이터, 예를 들어 자신이 계산할 결과는 전용 메모리에 둔다.
 
3.2.2 OS 커널
 
OS에서 커널은 심장이자 뇌이며 척수다. 커널이 OS의 본질이며 나머지는 덤이라고 해도 과언이 아니다. 커널 자체가 OS의 '인프라'라고 생각하면 된다. 커널이 존재 하기 때문에 개발자는 하드웨어나 다른 애플리케이션에 끼치는 영향을 의식하지 않고 애플리케이션을 만들 수 있다. 
커널의 여섯가지 역할
 
1. 시스템 콜 인터페이스 - 프로세스나 스레드로부터 명령을 받는 인터페이스
2. 프로세스 관리 - 가동되고 있는 프로세스 관리와 CPU 이용 우선순위 등을 스케줄 한다.
3. 메모리 관리 - 서버 상의 메모리를 단위크기 (예를 들어, 4KB)의 블록으로 분할해서 프로세스에 할당한다.
4. 네트워크 스택 - 네트워크를 관리한다.
5. 파일 시스템 관리 - 파일 시스템을 관리한다.
6. 장치 드라이버 - 디스크, NIC, HBA 등의 물리장치와 작업
 
OS 처리는 원칙적으로 커널을 통해 이루어진다. 커널의 역할에는 여러 가지가 있지만 여섯가지로 정리할 수 있다. 
 
1. 시스템 콜 인터페이스
프로세스/스레드에서 커널로 연결되는 인터페이스다. 애플리케이션이 OS를 통해서 어떤 처리를 하고 싶으면 시스템 콜이라고 하는 명령을 이용해서 커널에 명령을 내린다. 이때 명령이 인터페이스를 통해서 전달된다. 은행이나 구청 등의 접수 창구와 같다고 생각하면 된다.
예를 들어, 디스크 상의 데이터를 읽고 싶거나 네트워크 통신을 하고 싶을 때, 또는 새로운 프로세스를 생성하고 싶은 경우에 해당 시스템 콜을 호출하면 기능을 이용할 수 있다. 뒤에서 구체적으로 어떤 처리를 하고 있는지는 프로세스가 의식할 필요가 없다.
디스크 I/O와 네트워크 I/O 모두 시스템 콜이다.
 
2. 프로세스 관리
프로세스를 관리한다. OS 상에서는 수십, 수백, 수천 개의 프로세스를 가동할 수 있다. 이에 비해 물리 서버의 CPU 코어 수는 많아야 수십 개 정도밖에 안 된다. 언제, 어떤 프로세스가 어느 정도의 CPU 코어 수는 많아야 수십개 정도밖에 안된다. 언제, 어떤 프로세스가 어느 정도의 CPU 코어를 이용할 수 있는지, 처리 우선순위를 어떻게 결정할 것인지 등을 관리하는 것이 이 기능의 역할이다. 이 기능이 없으면 OS가 성립되지 않기 때문에 가장 중요한 기능이라 할 수 있다.
 
3. 메모리 관리
메모리 영역을 관리한다. 프로세스 관리는 CPU 코어를 고려했지만, 메모리 관리에서는 물리 메모리 공간의 최대치를 고려한다. 프로세스가 이용하는 독립 메모리 공간을 확보하거나 상호 간의 참조 영역을 지키기위해 독립성을 관리하는 등의 메모리 관리역할을 한다. 이 기능이 없으면 각 프로세스는 자신 이외의 프로세스가 사용하고 있는 메모리 영역 범위를 파악해야 하므로 어려워진다.
 
4. 네트워크 스택
 
5. 파일 시스템 관리
이것은 파일 시스템용 인터페이스를 제공한다.
 
파일 시스템은 OS 기능의하나로서 물리디스크에 제공된 데이터를 관리하는 기능이다. 파일 시스템 덕분에 애플리케이션은 '파일'이라는 단위로 데이터를 작성하거나 삭제할 수 있다.
주요 관리 기능으로는 디렉터리(폴더) 구조 제공, 액세스 관리, 고속화, 안정성 향상 등이 있다.
 
6. 장치 드라이버
디스크나 NIC 등의 물리 장치용 인터페이스를 제공한다. 예를 들어, NIC나 디스크는 다수의 제조사가 독자 제품을 제공하고 있다. 또한 NIC는 물리적인 속도가 다른 경우도 있다. 각각에 대응하는 애플리케이션을 개발하는 것은 현실적이지 못하기 때문에 커널은 장치 드라이버를 이용해서 그 아래에 있는 물리 장치를 은폐한다. 각 장치 제조사가 OS에 대응하는 장치 드라이버를 제공해서 해당 OS의 표준 장치로서 커널을 경유해 이용할 수 있게 하는 것이다. 
 
이와 같이커널의 역할은 많이 있지만, 중요한 것은 '뒤에서 이루어지고 있는 처리는 은폐하고 편리한 인터페이스를 제공'한다는 사실이다.
 
3.3. 웹 데이터 흐름
 
3.3.1 클라이언트 PC 부터 웹 서버까지
 
클라이언트 PC로부터 웹 서버까지의 데이터 흐름
1. 노트북의 '웹 브라우저'가 특정 인터넷 사이트에 요청을 보낸다.
2. 해당 사이트가 어디에 있는지 이름 해석을 한 후 이 결과를 가지고 해당하는 '웹 서버'에 요청을 보낸다.
3. 웹 서버의 'httpd' 프로세스가 요청을 접수한다.
4. httpd가 받은 요청 내용을 분석해서 디스크에서 읽을지, AP 서버에 질의할지를 판단한다.
5. A- 디스크 내부에 있는 정보는 커널의 '시스템 콜'로 실행되며, 커널을 통해서 물리 디스크의 내용을 취득한다. 
6. B- AP 서버에 있는 정보도 OS의 '시스템 콜'로 실행되며, 커널을 통해서 NIC에 대한 네트워크 통신이 요청된다.
7. 스위치를 경유해서 AP 서버에 대한 질의가 이루어진다.
 
클라이언트 PC에서 웹 브라우저를 실행해서 웹 서버에 요청을 보내고 AP 서버에 질의하기까지의 흐름을 보여 주고 있다. 각 단계에서 어떤 일이 발생 하고 있는지 자세히 보도록 하자.
1. 웹 브라우저가 요청을 발행한다.
2. 이름 해석을 한다.
3. 웹 서버가 요청을 접수한다.
4. 웹 서버가 정적 콘텐츠인지 동적 콘텐츠인지 판단한다.
5. 필요한 경로로 데이터에 액세스 한다.
 
먼저 인터넷에 접속돼 있는 환경에서 웹 브라우저를 실행해 본다. PC 내부도 서버와 거의 같은 구조다.
1. 웹 브라우저도 OS의 '프로세스'로 실행된다.
2. 프로그램은 원래 디스크에 저장돼 있다. 이것을 읽어서 메모리에 상주시키고 실행하는 것은 OS다.
3. 웹 브라우저 화면에서 링크를 클릭하면 웹 서버로 요청을 보낸다.
4. 이것도 OS의 '시스템'콜로 실행되고, 커널을 통해 NIC에 네트워크 통신이 요청된다.
5. 네트워크 경유로 웹서버에 질의한다.
 
디스크에서 프로그램을 읽어서 프로세스를 시작하고, 메모리 공간을 확보한다. 이 흐름은 PC와 서버에서 기본적으로 같은 동작이다. 
 
웹서버의 역할은 HTTP 요청에 대해 적절한 파일이나 콘텐츠를 반환하는 것이다. HTTP는 HyperText Transfer Protocol 이라는 프로토콜이다. HTTP가 텍스트를 송수신하기 위한 약속 정도라고 생각하면 된다. 현재 HTTP는 이미지나 동영상 데이터 전송에도 이용되지만, 어디까지나 기본은 텍스트 데이터이다. 
웹서버에는 다양한 소프트웨어가 있는데, 그중에서 가장 인기 있는 것은 아파치 소프트웨어 재단이 제공하는 Apache HTTP Server다. 웹 서버에는 HTTP를 처리할 수 있는 'httpd 프로세스'가 가동되고 있다. 아파치에서는 기본적으로 부모 프로세스와 자식 프로세스로 나누어 처리를 분담하고 있다. 설정을 통해 다양한 처리 방식을 선정할 수 있지만, 기본적으로는 자식 프로세스가 HTTP요청을 접수한다
요청에 대한 대답 내용은 HTML 파일이라는 텍스트 데이터나 이미지, 동영상 등의 바이너리 데이터로 구성된다. 이 데이터들은 '정적콘텐츠'와 '동적 콘텐츠'로 분류 할 수 있다.
'정적 콘텐츠'란 , 실시간으로 변경할 필요가 없는 데이터를 가리킨다. 예를 들어, 회사 로고 이미지 등을 들 수 있다. 웹 서버에서는 이렇게 데이터 갱신 빈도가 낮은 것은 디스크에 저장해서 요청이 있으면 저장해둔 내용을 HTTP를 통해 사용자 웹 브라우저로 반환한다.
'동적 콘텐츠'란, 높은 빈도로 변경되는 데이터를 가리킨다. 사용자의 은행 잔고 정보나 최신 날씨 정보데이터 등이 있다. 이런 데이터를 서버 내부의 디스크에 저장하면 갱신 빈도가 높기 때문에 디스크 성능이 병목 현상의 원인이 될 수 있다. 또한, 파일이라는 형태로 저장하는 것 자체가 비효율적일 수 있다. 일반적으로 이런 동적 콘텐츠는 'AP 서버'가 HTML 파일을 동적으로 생성한다. 웹 서버는 동적 콘텐츠에 대한 요청을 AP 서버에게 던지고 결과를 기다린다.
 
웹 서버로부터 AP 서버까지의 데이터 흐름
1. 웹 서버에서 온 요청은 NIC를 경유해서 커널에 의해 끼어들기 처리된다.
2. 위에 있는 스레드가 요청을 접수한다. 자신이 계산한 부분은 그대로 돌려보내지만, DB에 질의가 필요한 부분은 여기서 대기한다.
3. DB 접속은 드라이버를 통해서 연결 풀로 관리되고 JVM 전체가 리소스를 관리하기 때문에 DB와의 접속성도 유지한다. 그림에서는 사각형 하나가 하나의 접속에 해당한다.
4. DB에 대한 접속 요청은 웹-AP 간과 마찬가지로 OS 시스템콜로 실행되고, 커널을 통해서 NIC에 대한 네트워크 통신이 이루어진다.
5. 네트워크 경유로 DB서버에 대한 질의가 이루어진다.
 
'동적 콘텐츠'에 대한 요청을 처리하는 것이 AP 서버다.웹 서버로부터 요청이 도착한다.
1. 스레드가 요청을 받으면 자신이 계산할 수 있는지, 아니면 DB 접속이 필요한지를 판단한다.
2. DB 접속이 필요하면 연결 풀에 액세스한다.
3. DB 접속에 요청을 던진다.
 
동적 콘텐츠 요청에 대해서는 아직 존재하지 않는 콘텐츠를 가능한 빨리 만들어 내야 한다. 이 역할을 담당하는 것이 AP 서버다.
다양한 컴퓨터 언어에 대응한 AP 서버 소프트웨어가 존재한다. 기업형 시스템에서는 자바가 일반적이다.
자바를 이용한 AP 서버에서는 JVM이라 불리는 가상머신이 동작하고 있다. 이 JVM도 사실은 하나의 거대한 프로세스다. 가상 머신은 그 명칭이 보여주듯이, 하나의 OS로서 다양한 기능을 가지고 있다. 그 가운데 하나의 스레드가 요청을 접수하는 것이다.
대량의 데이터 관리 목적이라면 DB 서버가 적합하다. 이런 경우에는 AP 서버의 스레드는 DB 서버에 질의하고, 그 결과를 HTML 등으로 정리해서 반환한다.
AP 서버가 DB 서버에 접속하려면 드라이버가 필요하다. 커널의 장치 드라이버와 비슷하다. 즉, 드라이버 뒷단에 있는 것이 데이터베이스로 가는 인터페이스로, 해당 데이터베이스 자체를 은폐하는 역할을 한다.
 
데이터가 필요하면 DB 서버에접속하는 것이 일반적이지만, 이것이 항상 효율적이라고 할 수 없다. 규모가 작고 갱신 빈도가 낮은 정보는 JVM 내부에 캐시로 저장해 두었다가 반환하는 것이 좋다.
반대로, 규모가 큰 정적 데이터 전송 시에는 DB 서버 이외에 CDN 이라 불리는 데이터 전송 전용 서버를 이용하는 경우도 있다.
 
대부분의 웹 시스템에서는 CDN을 이용하고 있다. 이것은 웹 시스템의 특징인 하나의 시스템을 수많은 사용자가 이용한다, 대량의 데이터를 참조하는 업무가 많다 라는 것에 기인한다. CDN은 대량의 데이터 전송에 특화된 것으로, 전 세계에 있는 데이터 복사본(캐시)을 배치하는 기술과 병렬 기술을 활용해서 처리를 효율화하고 있다. 
한편, 기업형 시스템에서는 CDN과 같은 구조는 잘 사용되지 않는다. 이는 기업형 시스템의 특징이 하나의 시스템에 대한 사용자 수가 제한돼있다. 참조뿐만 아니라 데이터를 갱신하는 업무가 많다와 같은 이유 때문이다.
 
3.3.3 AP 서버부터 DB 서버까지
 
1. DB 서버에서는 DB 프로세스가 요청을 접수한다.
2. 이전에 사용한 정보는 캐시에 있기 때문에 이정보를 찾기 위해 일단 공유 메모리를 검색한다.
3. 공유 메모리에 데이터가 존재하지 않기 때문에 디스크에서 읽는다. 이때는 이전과 동일한 방식으로 시스템콜을 경유해서 디스크에 요청을 던진다.
4. 디스크의 데이터는 요청을 보낸 프로세스로 반환된다.
5. 한번 액세스한 데이터는 메모리에 캐시 형태로 저장되고 이후 액세스 시에 재사용된다.
6. 요청을 보낸 AP 서버로 데이터를 반환한다.
 
DB 서버에서는 서버가 요청을 접수한다. 요청은 SQL 이라는 언어 형태로 이루어진다. 이 SQL 을 해석해서 데이터 액세스 방식을 결정하고, 디스크나 메모리에서 필요한 데이터만 수집해 오는 것이 데이터베이스의 주요 역할이다. 
1. AP 서버로부터 요청이 도착한다.
2. 프로세스가 요청을 접수하고 캐시가 존재하는지 확인한다.
3. 캐시에 없으면 디스크에 액세스한다.
4. 디스크가 데이터를 반환한다.
5. 데이터를 캐시 형태로 저장한다.
6. 결과를 AP 서버에 반환한다.
 
DB 서버에도 다양한 소프트웨어가 존재한다. 웹 계열 시스템에는 MySQL등이 있고 기업용으로는 오라클 데이터베이스 등이 있다. 범위를 RDBMS 밖으로까지 넓히면 Key-Value Store라 불리는 DB도 다수 존재한다. 
 
DB 서버는 데이터 저장창고다. 관리 대상 데이터가 방대하기 때문에 얼마나 효율적으로 액세스하는가가 중요하다. 대부분은 서버 메모리에 캐시가 있는지 먼저 확인한다. 없으면 디스크에 액세스해서 필요한 데이터를 가지고 온다. 인메모리 DB 등에서는 디스크 자체를 사용하지 않고 모든 처리를 메모리 내에서 완료하는 구조라서 고속화를 실현할 수 있다. 
웹 서버에서는 개별 프로세스가 독립된 형태로 동작하는 것을 보았지만, DB 서버에서는 여러 개의 프로세스가 역할을 분담하는 경우가 있다. 예를 들어 요청을 SQL 로 받아서 해석하거나 데이터에 액세스하는 프로세스가 있고, 메모리에 캐시로 존재하는 데이터와 디스크에 있는 데이터를 정기적으로 동기화 하는 프로세스도 있다. 이것은 분업을 통해 처리를 병렬화해서 처리량을 향상시킬 수 있기 때문이다.
 
RDBMS와 KVS의 소리 없는 전쟁
RDBMS는 표(테이블)로 데이터를 표현하기 때문에 필연적으로 데이터가 정리된다. 또한, 릴레이션에 의해 표 간 관계를 표현하는 것도 특징이라면 특징이라고 할 수 있다. KVS 는 자유로운 형태로 저장이 가능하며, 여러 대의 서버에 수평 분할하는 것도 비교적 유연한 방식으로 할 수 있다. 단, 이런 높은 자유도는 오히려 복잡성을 키워서 관리가 어렵다는 단점이 있다. 
설령, RDBMS와 KVS 양쪽 특성을 모두 가진 만능 데이터 저장소가 등장한다고 해도 서로가 가진 장단점을 완전히 접목시키는 것은 어려운 것이다.
 
3.3.4 AP 서버부터 웹 서버까지
 
1. DB 서버로부터 데이터가 도착한다.
2. 스레드가 데이터를 가지고 계산 등을 한 후에 파일 데이터를 생성한다.
3. 결과를 웹서버로 반환한다.
 
가공 결과가 텍스트 데이터라면 HTML 이나 XML 파일을 사용하는 것이 일반적이다. 이외에도 동적 이미지 등의 바이너리 데이터를 생성해서 반환하는 경우도 있다. HTTP로 전송가능한 데이터라면 어떤 형태의 데이터든지 상관없다.
 
3.3.5 웹 서버부터 클라이언트 PC까지
 
AP 서버에서 돌아온 데이터를 받아서 웹 서버의 httpd 프로세스가 PC 의 웹 브라우저로 반환한다.
1. AP 서버로부터 데이터가 도착한다.
2. 프로세스는 받은 데이터를 그대로 반환한다.
3. 결과가 웹 브라우저로 반환되고 화면에 표시된다.
 
1. AP 서버에서 돌아온 데이터는 NIC 경유로 원래 스레드에 반환된다.
2. 필요한 데이터 가공은 모두 AP 서버에서 이루어지기 때문에 그대로 웹 브라우저로 데이터를 반환한다.
3. 웹 브라우저가 요청한 데이터를 반환한다.
 
하나의 요청에 하나의 데이터가 반환된다. 일반적인 웹 페이지에서는 페이지 HTML 파일과 다수의 이미지 파일 등이 있기 때문에 복수의 요청으로 분할돼서 웹 서버에 도착하고, 각 요청별로 데이터를 반환한다.
 
3.3.6 데이터 흐름 정리
 
각 서버의 동작은 다르지만 공통점이 있다.
- 프로세스나 스레드가 요청을 받는다.
- 도착한 요청을 파악해서 필요에 따라 별도 서버로 요청을 보낸다.
- 도착한 요청에 대해 응답한다.
 
웹 데이터의 흐름의 본질은 요청 기반으로 어떠한 처리를 하고 필요에 따라 해당 요청을 삼자에게 할당하는 것 이라고 정리할 수 있다. 웹서버, AP 서버, DB 서버가 자발적으로 어떠한 처리를 하는 경우도 있지만, 이것은 모두 자신을 관리하기 위한 목적이다. 어디까지나 사용자 요청이 시발점이 돼서 모든 처리가 시작된다.
요청 기반 아키텍처이기 때문에 기본적으로 각 서버는 문을 열고 기다리고 있는 상태다. 어느 정도 요청이 올지는 실제 요청이 오기 전까지 알수 없다.

 

반응형