그림으로 공부하는 IT인프라 구조 - Tirrilee/TechTalk GitHub Wiki

1. 인프라 아키텍처를 살펴보자

수직 분할, 수평 분할

  • 수평 분할 : Sharding, Partitioning

수평 분할로하면 분리된 DB에 데이터 공유가 되지 않는다.

즉 데이터 동기 처리를 위해서 Oracle Database 에서는 내부적으로 클러스터 기능 (Real Application Clusters) 를 한다.




2. 서버를 열어보자

2.2 CPU

  • 연산을 실행하고 결과를 반환한다
  • 여러개의 코어가 존재하기 때문에 각자가 독립적인 처리를 할 수 있다.

2.3 메모리

  • 메모리에 저장되는 정보는 영구성이 없다.
  • 메모리 엑세스가 매우 빠르게 이루어지기 때문에 사용한다. > 전기적인 처리만으로 데이터를 저장하기 때문에
  • CPU에는 L1(초고속), L2(고속), L3(준고속), Register Cache가 존재한다.
  • 메모리 인터리빙 : 메모리에 미리 데이터를 CPU에 전달해서 처리 지연을 줄인다. (예상을 해서 미리 읽는다.)
  • Channel : 메모리와 CPU간 데이터 경로를 의미한다.

2.4 I/O 장치

2.4.1 HDD

  • 데이터 입출력을 담당
  • 자기 원반이 여러개 들어있어 읽기/쓰기를 처리하나 속도는 느리다.
  • 요새는 빠르게 SSD를 사용하고, 전기가 없어도 데이터가 사라지지 않는다.
  • HDD가 많이 탑재되어있는 저장소는 Storage라고 한다.
  • Write Back VS Write Through
    • Write Back : 쓰기 시에 캐시에만 데이터를 기록하고 완료했다고 한다.
    • Write Through : 쓰기 시 캐시와 디스크를 모두 읽어서 라이트백과 비교하고 확실한 쪽에 쓰기 처리를 하기 위해 엑세스한다.

2.4.2 네트워크 인터페이스

  • HDD와 네트워크 인터페이스는 I/O 핸들러라는 컨트롤러에 연결되어있다.

2.4.3 I/O 제어

  • IOH(I/O Handler) : Quick Path Interconnect라는 고속 버스로 연결한다.
  • ICH(I/O Controller) : 속도가 느려도 괜찮은 DVD나 USB 등의 I/O 제어를 담당한다.

2.5 버스

  • 서버 내부의 컴포넌트들을 서로 연결시키는 회선이다.

2.5.1 대역

  • 대역은 Throughput이라고 부른다.




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

3.1 3계층형 시스템의 구조

3.2.1 프로세스와 스레드

  • 프로세스

    • 메모리가 각각 할당되어 있다.
    • 프로세스가 시작전 커널이 요청 분량만큼 메모리를 할당한다.
    • 웹서버는 프로세스(httpd)로 동작한다. 프로세스 안에는 메모리 공간을 점유하는 스레드가 동작하고 있다.
    • 프로세스는 독자 메모리 공간을 가지기 때문에 CPU 부하가 높아진다.
  • 스레드

    • 공유 메모리가 할당되어 있다.
    • 에를 들어 JVM 프로세스 안에 수많은 스레드가 동작하고 있다.
  • 오라클 DB

    1. 각 프로세스별 메모리 공간(PGA)과 프로세스 전체가 공유하는 메모리 공간(SGA)이 나누어져있다.
    2. SGA에는 디스크상의 데이터 캐시나 실행 완료된 SQL 캐시, 인덱스 등이 저장된다.
    3. PGA는 SQL이 이용하는 소트 영역이나 테이블에 결합에 사용하는 메모리 영역이 저장되 있다.

3.2.2 OS Kernel

  1. 시스템콜 인터페이스 : 데이터 읽기/쓰기, 네트워크 I/O
  2. 프로세스 관리
  3. 메모리 관리
  4. 네트워크 스택
  5. 파일 시스템 관리
  • 프로세스는 편리성 때문에 모든 것을 파일 단위로 생각한다.
  • 파일 시스템은 여러 프로세스가 공유한다.
  • 자주 사용하는 내용을 캐시로 관리한다.
  • 커널이 파일 시스템의 인터페이스로 동작한다.
  1. 장치 드라이버 : 물리 장치용 인터페이스 (디스크, NIC 등)

+) 모놀리식 커널 VS 마이크로 커널

  • 모놀리식 커널 : 하나의 메모리 공간을 통해 제공한다.
  • 마이크로 커널 : 최소한의 기능만 커널에서 제공하고 다른 기능은 커널 밖에서 제공한다.

3.3 웹 데이터 흐름

3.3.1 클라이언트 PC부터 웹서버까지

  1. 웹 브라우저가 특정 사이트에 요청을 보낸다.
  2. DNS 서버에서 해당 Domain Name을 IP로 변환하고 웹서버에 요청을 보낸다.
  3. httpd 프로세스가 요청을 접수한다.
  4. httpd 받은 요청 내용을 분석해서 AP 서버에 보낼지, 디스크에서 읽을지 판단한다.
  5. 시스템 콜로 실행되며, 커널을 통해서 NIC에 대한 네트워크 통신이 요청된다. or 물리 디스크의 내용을 취득한다.
  6. 스위치를 경유해서 AP 서버에 질의한다.

3.3.1 클라이언트 PC에서 웹 브라우저 실행

  1. 웹 브라우저도 OS의 프로세스로 실행한다.
  2. 프로그램을 디스크에 저장되어있고, OS는 프로그램을 메모리에 상주시키고 실행한다.
  3. 웹 브라우저에서 클릭하면 웹 서버로 요청을 보낸다. > System call로 실행되고 NIC에 네트워크 통신을 요청한다.
  4. 네트워크 경유로 웹서버에 질의한다.
  • 정적 콘텐츠 : 변경할 필요가 없는 데이터
  • 동적 콘텐츠 : AP서버가 HTML 파일 동적으로 생성한다.

3.3.2 웹서버로부터 AP 서버까지

  1. NIC를 통해 Kernel Interrupt를 처리한다.
  2. 스레드가 요청을 접수한다. DB 조회가 필요하면 대기한다. (데이터가 캐시되어있으면 바로 데이터 반환)
  3. DB 접속은 드라이버를 통해서 연결 풀로 관리되고, JVM 전체가 리소스를 관리하기 때문에 DB와의 접속성도 유지한다.
  4. DB의 접속 요청은 System call로 진행되고, NIC에 대한 네트워크 통신이 이루어진다. (캐시 전용 서버가 있으면 그쪽에서 접속)
  5. 네트워크 경유로 DB 서버에 대한 질의가 이루어진다.

3.3.3 AP서버부터 DB서버까지

  1. DB서버에서는 DB프로세스가 요청을 접수한다.
  2. 캐시를 확인하기 위해 공유메모리에서 검색한다.
  3. 공유메모리에 없으면 System call을 통해 디스크에서 읽는다.
  4. 디스크의 데이터 요청을 통해 반환된다.
  5. AP서버로 요청을 보낸다.




4. 인프라를 지탱하는 기본 이론

  • CPU 코어가 하나인 CPU는 프로세스가 많이 돌아도 프로세스는 1개밖에 동작하지 않는다.

4.3.2 CPU 처리 과정

  1. 4개의 프로세스 중 2개의 프로세스는 CPU를 이용해서 처리하고, 나머지는 대기 행렬에 있다. (run-queue)
  2. 내부적으로 CPU 코어 2개가 각가 처리하고 있다.

4.4.2 DBMS에서 사용되는 배타적 제어

  • 모두가 공유하는 데이터를 변경하면, 데이터를 읽고 싶지만 변경중이기 때문에 기다려야한다.
  • DBMS의 배타적제어는 매우 짧은 시간동안만 lock을 거는 latch가 있다. (CPU에서 의미없는 처리를 하면서 대기하는 방식이다.)
  • 비교적 장시간의 락을 유지해야하면, sleep lock을 건다.
  • 상황에 따라 스핀할지 슬립할지를 판단하는 adaptive lock이 있다.
  • 리눅스 커널은 빅 커널락이라 불리는 하나의 스핀락으로 구성되어있다.

4.6 가변 길이/고정 길이

  • 가변 길이 : 공간을 유용하게 활용할 수 있지만 성능면에서 불안정하다.
  • 고정 길이 : 쓸데없는 공간이 생기지만 성능 면에서는 안정적이다.

4.8 탐색 알고리즘 (해시/트리)

4.8.2 인덱스가 없을 때

  1. SQL을 발행한다.
  2. 인덱스가 없으면 Full Scan을 한다.
  3. 공유 메모리에서 모든 데이터 블록을 꺼내서 읽은 결과를 가져온다.

4.8.2 인덱스가 있을 때

  1. SQL을 발행한다.
  2. 인덱스에서 필요한 데이터가 있는 곳을 조사해서 필요한 데이터 블록만 읽는다.
  3. 원하는 한 건의 데이터가 들어있는 데이터 블록만 선택적으로 읽는다.
  • B 트리 인덱스가 DBMS에서 자주 사용되는 것은 트리 계층이 깊어지지 않도록 디스크 I/O를 최소한으로 제어한다.
  • T 트리 인덱스(2개의 가지)는 인메모리 DB에서 자주 사용되는데, 디스크 I/O를 신경쓸 필요가 없기 때문에 깊이 들어가도 상관없기 때문이다.




네트워크

  • httpd process는 HTTP 요청시 socket (IP + Port)을 열어, 통신을 대기한다.

  • socket에는 필요한 데이터만 기록하며 통신은 모두 TCP/IP에서 위임한다.

  • HTTP는 한번 요청/응답이 완료되면, 세션을 종료하는데 너무 일찍 종료면 오버헤드가 발생한다. 따라서 Keep-alive 를 이용하여 단시간 동안 세션을 남겨둘 수 있다.

  • 클라이언트 측의 포트는 OS에서 자동으로 할당해준다.

  • TCP에서 최대로 전송할 수 있는 데이터 크기 MSS(Maximum Segment Size)

  • Link 계층에서 최대로 전송할 수 있는 데이터 크기 MTU(Maximum Transfer Unit) = IP Header + TCP Header + MSS

⚠️ **GitHub.com Fallback** ⚠️