[1장. 아키텍처]
1. 인프라 아키텍처
- IT 인프라의 구조를 의미한다. 방대한 데이터들이 관리될 수 있도록 지탱해준다.
1-1. 집약형 아키텍처
- 대형 컴퓨터를 이용해서 모든 업무를 처리하는 형태이다. 대형 컴퓨터는 범용장비, 호스트, 메인 프레임 등으로 불렸다. 최대 장점은 구성이 간단하다.
- 많은 기업에서 아직까지 사용. 주로 기간시스템이라 부르는 기업 내 핵심 업무 시스템에서 이용한다.
- 도입 비용 및 유지 비용이 크고 확장성에 한계가 존재한다.
1-2. 분할형 아키텍처 (=분산 시스템 =오픈 시스템)
- 여러 대의 컴퓨터를 조합해서 하나의 시스템을 구축하는 구조이다.
- 표준OS나 개발언어를 이용하기 때문에 오픈 시스템이라고도 부른다.
- 대형 컴퓨터에 비해 소형 컴퓨터의 구입비용이 압도적으로 저렴하다
- 서버 대수를 늘릴 수 있어서 확장성이 높다.
1-3. 물리서버와 논리 서버
- 서버 : 컴퓨터 자체(하드웨어). 컴퓨터에서 동작하고 있는 소프트웨어. 특정 역할에 특화된 것 이다.
- 웹서버 :인터넷에 접속했을 때 사용자 입력 및 HTML 생성을 담당하는 서버.
- DB서버 : 대량의 데이터를 저장해서 요청에 따라 데이터를 제공하는 서버 .
- 물리서버 : 컴퓨터 자체를 가리키는 경우. 인텔의 x86 서버는 인텔 아키텍처를 채용하고 있어서 IA(Intel Architecture)라 부른다.
2. 수직 분할형 아키텍처
- 서버 별로 다른 역할을 담당. 수직형이라는 말은 특정 서버 측면에서 보면 역할에 따라 위/아래 계층으로 나누기 때문이다.
2-1. 클라이언트-서버형(C/S) 아키텍처
- 클라이언트 측에 전용 소프트웨어를 설치해야 한다(정기적인 업데이트 또한 필요하다)
- 클라이언트는 주로 PC, 요새는 스마트폰과 태블릿도 많이 이용한다.
- 단순한 계산, 화면 표시는 클라이언트 단말에서 실행하고, 필요한 경우에 서버에 의뢰한다.
- 업데이트는 시스템 위험 요소, 사용자의 불편함, 확장성에 한계가 될 가능성이 있다.
2-2. 3계층형 아키텍처
- 특정 서버에 부하가 집중되는 문제가 해결. 클라이언트 단말의 정기 업데이트 불필요하다.
- 클라이언트-서버형 보다 구조가 복잡하다
- 프레젠테이션 계층 : 사용자 입력을 받고 웹 브라우저 화면 표시
- 애플리케이션 계층 : 사용자의 요청에 따라 업무 처리
- 데이터 계층 : 애플리케이션 계층의 요청에 따라 데이터 입출력
2-3. 웹 소켓
- 웹 서버에 요청을 보내지 않아도 웹 서버가 브라우저에 데이터를 전달(푸시) 가능하다.
3. 수평 분할형 아키텍처
- 용도가 같은 서버를 늘려나가는 방식이다. 서버 대수가 늘어나면 서버 한 대가 시스템에 주는 영향력 감소한다.
- 안정성, 전체적인 성능 향상이라는 장점이 있다.
- 수직 분할형과 수평 분할형은 배타적인 관계가 아니다. 대부분의 시스템은 두 방식 함께 채택한다.
3-1. 단순 수평 분할형 아키텍처
- 수평 분할 = 샤딩(sharding) = 파티셔닝(partitioning)
- 확장성 향상. 분할한 시스템은 독립적이므로 서로 영향 안 준다.
- 데이터 일원화 할수없음. 업데이트를 각각 해주어야 함. 처리량이 균등하게 분할되지 않으면 치우침 발생한다.
3-2. 공유형 아키텍처
- 일부 계층에서 상호접속이 이루어진다.
- 오라클 DB의 클러스터 기능(Real Application Clusters, RAC) : 어떤 디비 서버에 접속해도 같은 결과를 얻을 수 있도록 내부적으로 데이터 교환한다.
- 분할한 시스템이 서로 다른 시스템의 데이터를 참조 가능하다.
- 분할한 시스템간 독립성이 낮아지고, 공유한 계층의 확장성이 낮아진다.
3-3. 가상화
- 물리 서버를 가상화 기능으로 여러 대의 가상 서버로 분할하는 방식이다.
- 물리 서버를 이중화 해서 한대가 망가지더라도 계속 운영 가능하다.
- 가상 서버를 다른 환경으로 옮기기 쉬워서 물리 서버의 성능이 한계에 도달해도 확장성 보장 가능하다.
3-4. 지리 분할형 아키텍처
- 업무 연속성 및 시스템 가용성을 높이기 위한 방식이다.
① 스탠바이형 아키텍처(HA : High Availability 구성, 액티브-스탠바이 구성)
- 물리서버를 최소 두대를 준비하여 한 대가 고장 나면 가동 중인 소프트웨어를 다른 한대로 옮겨서 운영하는 방식이다.
- Fail Over : 소프트웨어 재시작을 자동으로 하는 구조(F/O)
- 물리서버 고장에는 대처할 수 있지만, 리소스 측면에서 스탠바이 서버가 노는 상태로 낭비가 발생한다.
- 해결방안 : 스탠바이를 따로 두지 않고 동시에 교차 이용하는 방법이 있다.
② 재해대책형 아키텍처
- 특정 데이터 센터에 있는 상용 환경에 고장이 발생하면 다른 사이트에 있는 재해 대책 환경에서 업무 처리를 재개하는 것이다.
- 서버 장비를 최소 구성 및 동시 구성으로 별도 사이트에 배치하고 소프트웨어도 상용 환경과 동일하게 설정한다.
- 애플리케이션 최신화와 데이터 최신화 필요하다. (실시간성을 유지하기 위한 동기 처리)
③ 클라우드형 아키텍처
• 3계층형의 시스템의 일부 또는 전부가 클라우드 서비스 제공자가 보유하고 있는 물리 서버에서 동작한다.
a. SaaS(Software as a service) : 서버뿐만 아니라 애플리케이션을 포함한 업무 시스템을 제공.
b. PaaS(Platform as a service) : SW 개발을 돕는 개발자를 위한 서비스. 소프트웨어를 개발할 때 필요한 플랫폼을 제공.
c. IaaS(Infrastructure as a service) : 네트워크 같은 커퓨팅 인프라 장비를 제공. 인터넷을 통해 서버와 스토리지 등 데이터센터 자원을 빌려 쓰는 서비스
d. DBaaS(Database as a service.) : 데이터베이스 서비스 프로바이더가 하나 혹은 그 이상의 서비스 소비자에게 데이터베이스 서비스를 제공하는 아키텍처, 운영 전략
e. 물리 서버를 구입하는 것에 비해 저렴. 바로 사용 가능. 보안 문제나 클라우드 서비스 제공자와의 네트워크 연장 문제 발생
참조 : http://www.bloter.net/archives/259518
참조 : https://www.kdata.or.kr/info/info_04_view.html?field=&keyword=&type=techreport&page=19&dbnum=183594&mode=detail&type=techreport
[2장. 서버]
1. 물리서버
a. 서버 내부 구성 : 서버는 랙에 장착된다.
b. 랙 : 서버, HDD 같은 저장소, 인터넷 및 LAN을 연결하기 위한 스위치 등이 탑재되는 용도로 사용한다.
c. 서버 설치 시 중요정보 : 서버 크기, 소비전력, 중량
d. 랙 마운트 레일 : 서버가 서랍처럼 설치될 수 있도록 크기를 맞춘다.
e. 버스 : 컴포넌트를 연결하는 선
f. CPU와 메모리는 물리적으로 직접 연결
g. 서버는 피시와 물리적으로는 기본 구성이 같다. 전원이 이중화되어 장애에 강하거나 대용량 CPU나 메모리가 탑재된 점이 차이점이다.
2. CPU (Central Processing Unit)
a. 서버 중심에 위치해서 연산처리를 맡는다. (명령을 받아서 연산을 실행하고 결과 반환)
b. 대량의 전기 신호를 처리하므로 발열 심하다. (연산은 1초에 10억 회 이상 실행 가능)
c. CPU 주변을 감싸고 있는 대량의 핀이 버스에 연결되어 있어서 메모리나 디스크와 데이터를 교환한다.
d. 현재는 이 CPU를 코어라고 하며 하나의 CPU에 여러 코어가 존재하는 멀티 코어화 진행되고 있다.
e. 명령이나 데이터는 기억장치에 있지만 명령은 운영체제(OS)에서 내린다.
f. OS에 내리는 명령은 웹 서버나 데이터베이스의 실체인 프로세스와 사용자의 키보드, 마우스를 통한 입력으로 내려진다
g. 키보드나 마우스가 하는 처리 : 끼어들기 처리(interrupt)
3. 메모리
a. 기억 영역. CPU옆에 위치. CPU에서 전달하는 내용이나 데이터를 저장하거나 처리결과를 받는다.
b. 메모리에 저장되는 정보는 영구성이 없다. (서버 재시작 시 없어지는 정보).
c. 메모리 액세스가 매우 빠르게 이루어진다.
d. 데이터 저장 시 물리적인 모터 등을 구동하는 것이 아니라 전기적인 처리만으로도 데이터를 저장한다.
e. CPU 자체도 메모리를 가지고 있다. (레지스터, 1차:L1/2차:L2 캐시. 메모리보다 빠르지만 용량이 매우 작다).
f. 빈번하게 사용하는 데이터/명령 순서대로 CPU에 가까운 쪽에 캐시 된다.
① L1: 초고속 캐시, 각 코어 전용
② L2: 고속 캐시, 각 코어 전용
③ L3 : 준고속 캐시. CPU 전체가 공유
g. 메모리를 이용하려면 메모리 컨트롤러를 경유해서 CPU 밖으로 나가야 한다. 고속 cpu에서는 이런 처리 지연(latency)조차 허락하지 않는다. 이를 줄이기 위해 가장 자주 사용하는 명령/데이터를 코어 가까운 곳에 배치한다.
h. 영역이 여러 단계로 나누어져 있는 이유는 액세스 속도 때문. 캐시 메모리가 커질수록 액세스 속도가 느려진다. 하지만 가능한 CPU 가까운 곳으로 많은 캐시를 두고 싶기 때문이다.
i. 메모리 인터리빙(memory interleaving) : 메모리가 미리 데이터를 CPU에 전달해서 처리 지연을 줄이는 기능. 대부분의 데이터가 연속해서 액세스 된다는 규칙을 기반으로 만들어진 것이다.
① 메모리 접근 시간을 최소화하기 위해 여러 모듈로 나눈 메모리에 동시 접근하는 기법
② 채널 : 메모리와 CPU 간 데이터 경로
③ 이 기능을 활용하기 위해서는 동일 뱅크에 메모리를 배치해야 함. 채널 영역도 많이 사용한다.
참고하자 : http://blog.skby.net/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B8%ED%84%B0%EB%A6%AC%EB%B9%99-memory-interleaving/
4. 입출력 장치
a. 하드디스크 드라이브(HDD)
① 기록 영역. 서버에서는 메모리에 비해 CPU에 떨어진 곳에 HDD를 배치한다.
② 주로 장기 저장 목적으로 데이터 저장 장소로 사용한다.
③ 메모리는 액세스 속도가 다르다, 전기가 흐르는지 여부에 따라 데이터에 손실된다. (디스크는 안 사라짐)
④ 내부에 여러 개의 자기 원반이 존재. 고속으로 회전해서 읽기/쓰기 처리를 진행한다.
⑤ CD/DVD와 같은 구조이다.
⑥ PC라면 탑재할 수 있는 HDD 수는 한두 대, 서버에는 더 많은 HDD 장착 가능하다.
⑦ SSD(Solid State Disk : 반도체 디스크) : 물리적인 회전 요소를 사용하지 않는 디스크. 전기가 없어도 데이터가 사라지지 않는다. 덕분에 메모리와 기억장치 간 속도 차이가 거의 없어진 수준이다!
⑧ Storage(저장소) : HDD가 많이 탑재되어 있는 하드웨어. I/O의 서브 시스템이라고도 불리는 장치. 내부에 CPU와 캐시가 존재하고 HDD 외에 여러 기능을 탑재하고 있다.
⑨ 서버와 입출력 시 직접 데이터를 교환하는 게 아니라 캐시를 통해 진행한다.
⑩ 파이버 채널 : 대형 저장소와 연결할 때 쓰는 케이블. SAN(Storage Area Network)
- FC 포트 : SAN에 접속하기 위한 파일 채널 인터페이스. 보통은 서버 시스템에서 FC 포트가 없기 때문에 PCI 슬롯에 HBA라는 카드를 삽입한다.
1) HBA(host bus adapter, 호스트 버스 어댑터) : 호스트 시스템 역할을 하는 컴퓨터를 기타 네트워크와 스토리지 장치에 연결한다.
2) PCI(Peripheral Component Interconnect bus) : 컴퓨터 메인보드에 주변 장치를 장착하는데 쓰이는 컴퓨터 버스의 일종이다. (주기판에 바로 붙는 IC 형태, 소켓에 꽂아 쓰는 확장 카드 형태가 있다)
- Write back : 읽기/쓰기 시에 캐시 메모리 영역에 액세스. 캐시에 저장해서 쓰기 처리가 종료돼서 고속 입출력 실현. (데이터를 잃을 가능성이 있음)
- Write through : 캐시와 HDD에 모두 액세스 하는 입출력. 읽기 시 캐시 데이터가 없으면 액세스. 쓰기 시에는 캐시와 디스크를 모두 읽어서 write back과 비교하고 더 확실한 쪽에 쓰기 실행
b. 네트워크 인터페이스(NIC : Network interface controller)
① 서버와 외부 장비를 연결하기 위한 외부 접속용 인터페이스이다.
② LAN(Local Area Network) 어댑터나 SAN과 같은 다른 네트워크 어댑터를 사용할 수 있다
③ CPU관점에서 HDD나 네트워크나 외부 I/O이라는 의미에서 동일하다.
c. 입출력 제어 (예시 : sun fire x4170)
① IA 서버 아키텍처에서 입출력 제어는 I/O 핸들러(IOH) 또는 I/O 컨트롤러(ICH)라는 제어장치를 통해 진행한다.
② IOH : CPU와 가까운 곳에 위치한다. 노스 브릿지라 부른다. 고속 I/O용 제어장치이다.
- 이전에는 메모리 I/O 제어가 주요 역할. 현재는 CPU로 그 역할이 옮겨가고 pci express나 네트워크 등을 제어. CPU 간 데이터 전송 제어.
- CPU와 IOH 간 퀵 패스 인터 커넥트라는 고속버스로 연결되어 있다
③ ICH : 사우스 브리지. 저속 I/O용
- DVD나 US나등의 I/O 제어 담당. IOH 간 데이터 전송 제어도 한다
④ CPU 외 다양한 컨트롤러나 칩이 존재하는 이유는 CPU가 연산에 집중할 수 있도록 역할분담을 하기 위해서다!!
5. 버스
- 서버 내부에 있는 컴포넌트들을 서로 연결시키는 회선이다. 버스는 어느 정도의 데이터 전송능력을 가지고 있는지(대역이 어느 정도인지)가 중요하다.
a. 대역 : 원래는 주파수 대역. IT 인프라에서는 데이터 전송 능력을 의미한다.
① 한 번에 데이터를 보낼 수 있는 데이터의 폭(전송 폭). 1초에 전송할 수 있는 횟수(전송 횟수)로 결정
② 대역 = Throughput = 처리량 = 전송 폭 * 전송 횟수
③ x8은 8회선, x16은 16회선의 전송 폭을 가지고 있음을 의미한다.
b. 버스 대역
① CPU에 가까운 쪽이 1초당 전송량이 크다. (버스 대역이 크다)
② CPU와 메모리는 대량으로 데이터를 교환해서 매우 빠른 전송능력이 요구된다.
③ 반대로 USB 포트는 저속이기 때문에 ICH앞에 배치해도 문제가 없다.
④ 버스 흐름에서 중요한 것은 CPU와 장치 사이에 병목현상이 없어야 한다.
☞ 병목현상 : 데이터의 전송이 어떤 이유로 막혀있는 상태.
⑤ 하드웨어 설계, 특히 외부 장치와의 연결을 검토할 때는 이렇게 버스나 입출력 능력을 고려해야 한다.
- 정리
○ 하드웨어는 시스템의 가장 기반이 되는 부분이다.
○ 애플리케이션, 운영체제는 이 하드웨어를 움직이기 위한 프로그램 집합을 의미한다.
○ HDD 저장소에서 CPU에 이르기까지 기나긴 경로에 대해 파악하자.
○ CPU에 가까울수록 고속 / HDD에 가까울수록 대용량
○ IT 엔지니어라면 이런 하드웨어에서의 데이터 흐름 구조를 이해하고 새로운 구조나 시스템을 만들어야 한다.
[3장. 3계층형 시스템]
1. 3계층형 시스템 구성도
a. 웹서버, AP서버, DB서버. 세대의 서버는 스위치를 경유해서 연결되어 있다.
2. 주요 개념 설명
a. 프로세스와 스레드
① 프로세스와 스레드는 프로그램 실행 파일 자체가 아니다!! OS상에서 실행돼서 어느 정도 독립성을 가지고 동작한다.
② 둘 모두 활동하기 위해선 메모리 공간이 필요하다. (커널에 의해 프로세스 시작 시 확보)
- 프로세스
- 전용 메모리 공간을 이용해서 동작한다.
- 독자 메모리 공간을 가지므로 CPU 부하가 스레드가 비해 커진다.
- 멀티 프로세스 애플리케이션에서는 프로세스 생성 부담을 낮추기 위해 미리 프로세스를 실행한다 (연결 풀링)
- 스레드
- 다른 스레드와 메모리 공간을 공유한다. (의도하지 않는 데이터 읽기/쓰기가 발생 가능)
- 생성 시 부하가 낮다.
- 프로세스의 공유 메모리 : 여러 프로세스가 상호 이용할 수 있도록 메모리 공간 공유한다. 프로세스 단독으로 이용하는 데이터 (자신이 계산할 결과 등)은 전용 메모리에 둔다.
b. OS 커널
① 시스템 콜 인터페이스 : 프로세스나 스레드로부터 명령을 받는 인터페이스이다. 디스크 입출력과 네트워크 입출력은 본질적인 차이가 없다. 프로세스 관점에서는 동일한 시스템 콜이다.
② 프로세스 관리 : 가동되고 있는 프로세스 관리와 CPU 이용 우선순위를 스케줄이라 한다. 수많은 프로세스에 비해 물리 서버의 CPU 코어의 개수는 많아야 수십 개정도 이다. 이를 관리하기 위한 우선순위를 결정해야 한다.
③ 메모리 관리 : 서버상의 메모리를 단위 크기(4kb)의 블록으로 분할해서 프로세스에 할당한다. 물리 메모리 공간의 최대치를 고려해야 한다.
④ 네트워크 스택 : 네트워크 관리
⑤ 파일 시스템 관리 : 물리 디스크에 제공된 데이터를 관리하는 기능. 이 시스템을 통해 애플리케이션은 파일이란 단위로 데이터를 작성하거나 삭제할 수 있다. 주요 관리 기능은 디렉토리 구조 제공, 액세스 관리 , 고속화, 안정성 향상 등.
⑥ 장치 드라이버 : 디스크, NIC, HBA 등 물리 장치용 인터페이스를 제공한다. 장치 제조사가 OS에 대응하는 장치 드라이버를 제공해서 OS의 표준장치로서 커널을 경유해 이용할 수 있게 한다.
c. 커널 설계 및 구현 방식
① 모놀리식 커널 : OS의 주요 구성 요소를 하나의 메모리 공간을 통해 제공한다.
② 마이크로 커널 : 최소한의 기능만 커널이 제공하고 그 외 기능은 커널 밖에서 제공한다.
③ 리눅스에서는 커널 모듈을 통해서 기능을 추가할 수 있기 때문에 마이크로 커널의 특징도 포함시킬 수 있다.
3. 웹 데이터 흐름
- 전체 흐름 : 웹 브라우저 요청 > 이름 해석 > 웹 서버 요청 접수 > 웹 서버가 정적/동적 콘텐츠 판단 > 필요한 경로로 데이터 액세스
a. 클라이언트 피시에서 웹 서버
b. 웹 서버에서 AP 서버
c. AP 서버에서 DB 서버
① 규모가 큰 정적 데이터 전송 시 CDN(Content Delivery Network)이라 불리는 데이터 전송 전용 서버도 이용한다. 전 세계에 있는 데이터 복사본(캐시)을 배치하는 기술과 병렬 기술을 활용해서 처리를 효율화
d. AP 서버에서 웹 서버
e. 웹 서버에서 클라이언트 피시까지
f. 데이터 흐름 정리
[4장. 인프라 관련 기본 이론]
1. 웹 데이터 흐름
a. 직렬/병렬
① 병렬화할 때는 오버헤드를 예상해서 어떤 부분을 병렬화할지 파악하는 것이 중요하다.
② 직렬 처리로 속도를 올리는 데는 한계가 존재한다.
③ 병렬화를 통해 속도는 빨라지지 않지만, 단위 시간당 처리량을 늘릴 수 있다.
④ 병렬 처리에서는 합류점, 직렬 화구 간, 분기점이 병목지점이 되기 쉽다.
b. 프로세스나 스레드 수를 조정할 때는 CPU 코어 수도 함께 고려해야 한다.
c. 멀티 프로세스와 멀티 스레드를 모두 이용하는 하이브리드형도 존재한다.
d. 직렬
① 장점 : 구조가 간단해서 설계나 구현 난이도가 낮다 .
② 단점 : 복수의 리소스(컴퓨터나 프로세서 등)를 유용하게 이용할 수 없다.
e. 병렬
① 장점 : 복수의 리소스를 유용하게 이용 가능, 직렬에 비해 동일 시간당 처리할 수 있는 양 증가, 일부가 고장 나더라도 처리가 지속 가능하다.
② 단점 : 처리 분기나 합류를 위한 오버헤드 발생. 배타 제어 등을 고려해야 하고, 구조가 복잡해서 설계나 구현 난이도가 높다.
③ 병렬화가 유효한 부분을 파악해서 병렬화하지 않으면 효과가 없다. 오버헤드나 구조 복잡화 등의 단점이 있다는 것을 고려한 후, 이 단점 이상의 효과를 얻을 수 있는 경우에 병렬화한다.
④ 이중화라는 관점에서 장점이 있다. NIC를 본딩 하면 하나의 NIC가 고장 나도 처리를 계속할 수 있다.
f. 병렬과 병행
① 동시에 복수의 처리를 실행하는 것이 병렬, 복수의 처리가 실행 상태에 있는 것을 병행.
② 병행은 병렬을 내포하고 있는 개념이다.
2. 동기/비동기
a. 동기
- 다른 사람에게 일을 부탁한 후 끝날 때까지 아무것도 하지 않고 기다리기 때문에 그 사이에 다른 것을 할 수 없다. 하지만 의뢰한 것이 끝났는지 여부를 확실하게 확인할 수 있다.
① 의뢰한 처리가 끝났는지 여부를 쉽게 확인할 수 있어서 구조가 간단하고 구현 난이도가 낮다.
② 의뢰한 처리가 끝나기까지 기다려야 하기 때문에 대기 시간을 활용할 수 없다.
b. 비동기
- 끝날 때까지 기다리지 않기 때문에 병렬로 다른 일을 할 수 있다. 하지만 의뢰한 일이 끝났는지 여부를 확인하고 싶으면 별도의 방법을 이용해야 한다.
① 의뢰한 처리가 진행되고 있는 동안 시간을 효율적으로 사용해서 병렬 처리를 할 수 있다
② 의뢰한 처리가 끝났는지 확인하지 않으면 모르기 때문에 불필요한 확인처리가 늘어난다. 구조가 복잡해서 구현 난이도가 높다
c. DBMS에서 사용되는 비동기 I/O
① DBMS는 HDD 등의 저장소에 비동기로 쓰기 처리를 할 수 있다. 비동기 I/O는 대량의 I/O를 효율적으로 처리해야 하는 DBMS에 적합하다. 공유 메모리에 있는 다수의 데이터를 프로세스가 HDD에 기록하는 경우, 하나의 입출력이 끝나기까지 기다리지 않고 다음 I/O을 발행할 수 있다. 저장소의 성능을 충분히 활용 가능하다.
② DBMS에서는 비동기로 I/O을 요구한 경우 입출력이 끝났는지 여부를 확인한다(DBMS가 OS 라이브러리나 시스템 콜을 어떻게 사용하느냐에 따라 달라진다.)
③ 비동기 I/O을 발행하더라도 저장소 성능 이상으로는 빨라지지 않는다.
④ 이미 저장소 캐시 기능이나 SSD(Solid State Drive) 등에 의해 하드웨어의 입출력 성능 고속화가 진행되고 있다.
d. 비동기 주의점
① 비동기로 요구한 처리가 끝나지 않은 상태에서 다음 처리를 진행해도 문제가 없는가?
② 비동기로 요구한 처리가 끝났는지 확인할 필요가 있는가?
③ IT 시스템 설계에서 트랜잭션 범위를 설계할 때에는 성능, 대상, 신뢰성 등과의 절충 정도를 고려해서 설계해야 하지만, 트랜잭션 범위 안이 동기, 트랜잭션 범위 밖이 비동기가 된다.
e. C10K 문제
① C10K 문제 : 하드웨어 성능상에 문제가 없어도 클라이언트 수가 많아지면 서버가 고장나는 문제를 의미한다.
② 클라이언트 접속마다 프로세스를 생성 하면 OS파일 디스크립터나 프로세스 수가 최대치에 이르거나, 1프로세스당 소비 메모리 크기는 작지만 이것이 쌓여서 문제가 될 수 있다.
③ 해결방안 : 논블로킹 I/O(하나의 프로세스로 복수의 접속을 처리하는 방법). OS 시스템콜로 구현되서 그것을 그대로 사용한다. 각 클라이언트와 통신 시에 정말로 필요한 경우만 통신해서 변경한다.
- 모든 접속을 완전히 동기로 처리할 수 없기 때문에 동기 처리 수를 고려해야 한다
- 특정 처리가 장기화되거나 지연되면 다른 접속에 영향을 준다.
- 대량의 접속이 발생해도 동기 처리가 필요없는 경우에 매우 유효한 방법이다.
- Node.js, Nginx, GlassFish 등이 논블로킹 I/O를 채택하는 제품이다.
3. 큐
a. 앞에 있는 것부터 차례대로 처리되기 때문에 큐(대기행렬)의 처리원리를 FIFO(First In First Out)라 한다.
b. 큐에 줄을 설 때는 가장 마지막에 서고 처리는 선두부터 순서대로 된다
c. 먼저 들어온 데이터가 먼저 나가는 동작을 FIFO 방식이라 한다.
d. 사용 예시
① CPU처리를 기다리고 있는 프로세스나 스레드 행렬
② 하드 디스크 등의 저장소 읽기 처리를 기다리고 있는 입출력 요구 행렬
③ 네트워크 접속 성립을 기다리고 있는 접속 요구 행렬
e. 런큐(run-queue) : CPU를 기다리고 있는 프로세스 행렬. 런큐에 쌓인 프로세스 수를 코어 수로 나누어서 1이면 문제없다는 것이 일반적이다.
① 처리중인 프로세스를 런큐로 인식할지는 운영체제의 종류에 따라 다르다.
② 리눅스 : 실행중인 프로세스도 런큐로 인식한다.
③ OS커널에서는 프로세스 스케쥴러라는 기능이 있어서 런큐 등을 관리한다.
f. 순서대로 처리를 하고 싶거나 행렬이 생기는 경우는 큐를 사용하는 것이 좋다.
g. 성능 문제에서는 큐의 길이를 확인하는 것이 중요하다. (CPU사용률 뿐만 아니라 런큐 길이도 확인)
h. 메세지 큐를 사용하면 애플리케이션 간 상호운용성을 향상시켜서 시스템 전체 안정성을 향상시킬 수 있다. (어딘가 멈춘다고 해서 시스템 전체가 멈추는 것이 아니기 때문이다.)
i. 대기 시간 절약이나 버퍼링용 리소스 절약 등에 의해 성능이 향상되는 경우도 존재한다.
4. 배타적 제어
a. 다른 것을 배제하는 제어. 여러사람이 공유하기 때문에 배타적 제어가 필요하다.
b. 병렬 처리에서 필요. 배타적 제어를 하는 부분은 병목현상이 발생하기 쉽다.
c. 병렬 처리와 배타적 제어를 그릴 수 있게 되면 문제 해결이나 성능 튜닝에 도움이 된다.
d. 복수의 처리가 공유자원(CPU, 메모리, 디스크 등)에 동시에 액세스(주로 갱신)하면 불일치가 발생할 수 있기 때문에 배타적 제어로 보호해 주어야 한다.
e. 배타적 제어에서는 특정 처리가 공유 자원을 이용하고 있는 동안 다른처리가 이용할 수 없게 되서 불일치가 발생하지 않도록 한다.
f. 사용 예시
① DBMS에 사용되는 배타적 제어
- 래치(latch) : 매우 짧은 시간 동안만 락을 유지하는 방식이다. (=스핀락. spin-lock) CPU에서 의미없는 처리를 하면서 대기했다가 락이 개방되는 것을 기다리는 방식이다. 슬립해서 기다리면 컨텍스트 스위치가 발생하기 때문에 극히 단시간의 락에서는 CPU를 회전해서 기다리는 스핀락이 사용된다.
- 슬립 락(sleep-lock) : 비교적 장시간 락을 유지하도록 큐를 이용해서 관리하는 방식이다.
- 어댑티브 락(adaptive-lock) : 스핀해서 락을 확보하지 못하면 슬립하는 등 상황에 따라 스핀할지 슬립할지 판단한다.
② OS커널에 사용되는 배타적 제어
- 리눅스 커널은 빅 커널락(BKL : Big Kernel Lock)이라는 하나의 스핀락으로 유지된다.
- 커널의 BKL이 이용되는 부분에서는 처리가 직렬화 돼서 동시에 하나의 CPU만 커널 코드를 실행할 수 있다.
- 여러 프로세스나 스레드에서 빅 커널락을 이용해서 경합 처리를 하면, CPU코어가 여러개더라도 병렬처리가 안되고 선행 처리가 끝날 때까지 기다려야 한다.
- 최근에 빅 커널락이 사용되고 있는 커널 코드를 수정해서 락 단위를 세분화해 병렬 성능을 향상 시킨다.
③ 클러스터 데이터베이스의 배타적 제어
- 서버간 배타적 제어에 의해 대기 처리가 늘어나면 아무리 서버가 많아도 병렬 처리를 할 수 없다.
- 서버간 데이터 교환을 얼마나 줄일 수 있는지, 배타적 제어에 의한 대기 상태를 얼마나 줄일 수 있는지가 중요하다.
g. 장/단점
① 사용 장단점 : 공유데이터의 일관성을 유지 가능하고 병렬 처리 불가능하다. 필요 이상으로 배타적 제어를 사용하면 CPU가 여러개 있더라도 하나밖에 사용할 수 없게 된다)
② 미사용 장단점 : 병렬로 빠르게 처리가 가능하고, 데이터 불일치가 발생할 가능성이 있다. (동시에 공유 데이터를 변경 등)
③ 멀티 프로세서 시스템에서는 배타적 제어가 어렵다. (동시에 복수의 프로세스나 스레드를 실행할 수 있기 때문)
5. 상태 저장/상태 비저장
a. 상태 저장(stateful) : 정보를 많이 가져 세분화된 제어가 가능한 반면에 구조가 복잡.(시스템 복잡성 커짐)
① 태를 가진다 = 과거에 부여한 정보를 저장해서 계속 활용할 수 있다.
② 상태 저장 구조를 사용하는 이점은 과거 정보를 가져올 수 있어서 정보에 따른 복잡한 처리를 할 수 있다는 것이다.
③ 상대가 상태 전이를 의식해서 처리하며 과거 경위를 이해한 상태에서 응답.
b. 상태 비저장(stateless) : 고기능은 아니지만 간단. 성능이나 안전성을 쉽게 향상시킬 수 있다.
① 매번 신규 요청이 생성. 요청과 응답 구조가 간단하다.
c. 사용 예시
① SSH는 상태 저장 프로토콜, HTTP는 상태 비저장 프로토콜
② 컴퓨터 내부 구조
- 컴퓨터 내의 거의 모든 곳에서 상태 저장이 사용되고 있다
- 프로세스 상태 전이(상태 저장 방식) : 개시 - 실행가능상태 - 실행상태 - 대기상태 - 종료
③ 네트워크 통신 구조
- 브라우저가 HTTP 서버에 접속할 때는 HTTP 프로토콜을 사용한다.
- 브라우저가 요청을 보내면 상태가 없기 때문에 매번 같은 데이터를 반환한다.
- 상태를 저장해야 하는 경우를 위해 세션이라는 개념을 사용해서 이 구조를 구현한다.
6. 가변길이/고정길이
a. 가변 길이(variable-length) : 데이터 길이를 매번 변경하는 것이다.
① 공간을 유용하게 활용할 수 있지만 성능 면에서 불안정하다.
② 데이터 전체 양이 준다. 효율성 추구.
b. 고정 길이(fixed-length) : 모두 같은 크기를 이용해서 처리햐는 것이다.
① 쓸데없는 공간이 생기지만 성능 면에서는 안정적이다.
② 크기가 균일해서 관리가 수월하다. 간단한 것을 추구할 경우 사용한다.
c. 사용예시
① 윈도우즈 파일시스템 (NTFS)
- 고정 길이로 각종 파일을 저장하고 있다. 실제 크기와 디스크 할당크기가 상이한 건을 볼 수 있다.
- 하나의 고정길이 틀이 4096byte(4kb). 이 용량보다 작은 파일을 저장해도 4kb 사용한다.
- 대부분의 파일은 이 크기보다 크기 때문에 공간을 많이 낭비하지 않는다.
- 하지만 텍스트 데이터만 저장할 경우 크기가 작기 때문에 어느 길이가 적합할지 고민해야 한다.
② 네트워크 데이터 교환
- 일반적인 이더넷 MTU(Maximum Transfer Unit, ip 패킷의 최대 크기)
- TCP/IP의 헤더합계 40byte
- MSS(Maximum Segment Size, TCP 세그먼트의 데이터 부분 최대 크기) = MTU - TCP/IP 헤더 합계
- MTU, IP헤더 크기는 고정 크기가 아니기 때문에 MSS도 환경에 따라 달라진다.
- 패킷은 일회용이기 때문에 가변길이로 데이터를 처리해도 한쪽으로 편중되지 않는다.
- 이더넷은 가변길이 프레임이지만 고정길이를 사용하는 것도 있다 (ATM(Asynchronous Transfer Mode) = 데이터 링크 층의 프로토콜에서는 셀이라 불리는 53바이트 고정 길이 형식을 사용하고 있다.)
7. 데이터 구조(배열과 연결리스트)
a. 배열 : 같은 형태의 상자를 빈틈없이 순서대로 나열한 데이터 구조이다.
① 몇번째 데이터인지 인덱스만 알면 탐색이 빠르다. 데이터 추가/삭제가 느리다
b. 연결리스트 : 상자르 선으로 연결한 형태의 데이터 구조. 다음 상자의 위치정보를 가지고 있다.
① 탐색은 느리지만 데이터 추가/삭제가 빠르다.
c. 사용 예시
① 배열과 연결리스트를 조합한 하이브리드형 데이터 구조가 해시테이블
② SQL 관련 정보를 관리할 때 재사용하는 것이 해시테이블 구조.
- 애플리케이션에서 SQL 발행
- SQL 해석해서 수행.
- 한번 실행된 SQL관련 정보는 메모리에 캐시돼서 재사용
- 똑같은 SQL 요청이 올 경우 해석하지 않고 메모리의 캐시에서 꺼내 재사용.
③ SQL은 여기저기 산재해 있기 때문에 추가 삭제가 빠른 연결리스트를 사용하면 해제 처리를 빠르게 가능하다.
④ SQL 길이는 각기 다르므로 해시함수를 이용해서 SQL을 고정 길이 해시값으로 변환한다. 이 해시값 배열로부터 연결리스트를 찾아가면 빠르게 탐색할 수 있다.
⑤ 해시테이블 데이터구조는 오라클 DB의 SQL 정보 캐시 외에도 리눅스 등의 OS 커널 에서도 데이터 캐시나 KVS(Key value store)등의 형태로 사용
8. 탐색 알고리즘(해시/트리 등)
a. 해시나 트리는 탐색 알고리즘이 아닌 데이터 구조이지만, 효율적 탐색을 위해 사용된다.
b. 필요한 때에 필요한 데이터를 신속하게 찾기 위해서는 데이터를 정리해둘 필요가 있다.
c. 데이터를 찾을 때에 데이터 구조와 데이터 저장 방식(메모리, HDD, SSD 등) 특성에 따라 적합한 데이터 정리 방법이 달라진다.
d. 데이터 정리 방법 = 데이터 구조, 처리 순서 = 알고리즘
e. 사용 예시 : SQL 튜닝시에 풀스캔과 인덱스 스캔
① 풀스캔
- 테이블의 모든 블록을 처음부터 순서대로 읽어나가는 것이다.
- 일반적으로 DBMS에서는 실제 데이터 크기가 아닌 High-Water Mark(HWM) 위치에 따라 풀 스캔시 읽는 블록 수가 달라진다. 정기적으로 세그먼트(테이블 등)을 축소하는 이유는 이 HWM을 내려서 성능 저하를 방지하기 위함이다.
- 모든 데이터가 필요한 경우에는 선형 탐색이 적합하다.
② B 트리 인덱스
- 인덱스에서 필요한 데이터가 있는 곳을 조사해서 필요한 데이터 블록만 읽는다. 검색이 빨라지는 대신에 데이터 추가, 갱신, 삭제 시에 테이블 뿐만아니라 인덱스 데이터도 갱신해야한다. 불필요한 오버헤드 발생 가능성이 있다.
- 인덱스는 읽을 블록 수를 줄이기 위한 수단이지만, 인덱스를 사용하면 오히려 읽을 블록 수가 늘어날 수도 있다.
- B 트리 인덱스가 자주 사용되는 것은 트리 구조 계층이 깊어지지 않도록 디스크 I/O을 최소한으로 제어하기 때문이다.
- HDD 같은 2차 기록 장치의 데이터 탐색에 적합하다.
③ T 트리 인덱스
- 메모리에 모든 데이터를 두는 인메모리 DB에서는 디스크 I/O을 크게 신경을 필요가 없기 때문에 다른 접근 방법이 필요하다.
- 이진 트리의 일종. 가지가 두 개밖에 없어서 계층이 깊어지지만, 키 값 비교 횟수가 줄어들어 메모리의 데이터 탐색에 적합하다.
④ 해시 테이블
- 키와 값 조합으로 표를 구성한 데이터 구성
- 키는 해시 함수를 통해 해시 값으로 변환된다.
- 해시 값은 고정 길이 데이터이기 때문에 조합 표의 데이터 구조가 간단해서 검색이 빠르다.
- 해시테이블은 데이터 양이 많아져도 기본적인 등호 검색의 속도는 변하지 않는다.
- 등호 검색 시 최고의 데이터 구조. 범위 검색에서는 약하다.
⑤ DBMS에 인덱스를 만들면 검색은 빨라지지만 갱신 시에 오버헤드가 걸린다는 단점이 있다.
⑥ 데이터 구조는 데이터를 찾는 방식이나 데이터 저장 위치의 특성을 고려해서 선택하자!
[5장. 인프라 관련 응용 이론]
1. 캐시(cache)
a. 사용빈도가 높은 데이터를 고속으로 액세스할 수 있는 위치에 두는 것이다.
b. CPU의 1차 캐시나 2차 캐시, 저장소 캐시, OS 페이지 캐시, 데이터베이스 버퍼 캐시, KVS 등 에서 활용한다.
c. 일부 데이터를 데이터 출력위치와 가까운 지점에 일시적으로 저장한다.
d. 데이터 재사용을 전제로한다.
e. 데이터에 고속으로 액세스할 수 있다. 참조 빈도가 높은 데이터에 용이하다.
f. 실제 데이터에 대한 액세스 부하를 줄일 수 있다. 캐시의 데이터가 손실되도 문제 없는 시스템. 읽기 전용 데이터에 적합하다.
g. 데이터 갱신 빈도가 높은 시스템, 대량의 데이터에 액세스하는 시스템은 부적합하다.
h. 사용 예시
① 브라우저 캐시 : 웹 브라우저가 접속한 페이지를 캐시하는 것.
② 캐시 서버를 서버 앞에 두는 대신에 CDN(Content Delivery Network)라는 웹 서버나 다른 네트워크에 웹 콘텐츠 캐시를 배치하는 구조를 이용.
i. 주의점
① 데이터가 실제 데이터와 캐시라는 이중 구조로 저장되므로 리소스 소비 증가한다.
② 시스템 가동 직후에는 캐시에 데이터가 없으므로 원하는 성능이 나오지 않는다.
③ 시스템 성능 문제나 데이터 불일치 문제가 발생한 경우는 문제 발생을 야기한 용의자가 많다.
④ 캐시의 데이터가 손실되는 경우를 대비해서 복구 순서를 설계시에 확립해야 한다.
⑤ 갱신 데이터를 캐시할 때 캐시가 여러개 있으면 갱신된 최신 데이터를 서로 빼앗으려는 상태가 발생하지 않도록 주의해야한다.
2. 끼어들기(인터럽트)
a. 급한 일을 먼저 하도록 CPU에 알리는 중요한 역할.
b. 키보드 입력은 I/O 컨트롤러를 통해 CPU에 전달된다.
c. 특정 이벤트가 발생했을 때 CPU에 이것을 알려서 해당 이벤트에 대응하는 처리를 끝낸 후 원래 하던 처리를 계속 하는 것이다.
d. 어떤 일이 발생하면 연락하는 이벤트 주도 구조이다.
e. 사용 예시
① 입출력 장치가 CPU에게 통지하는 끼어들기를 하드웨어 끼어들기
② 네트워크 통신으로 데이터가 도착하면 끼어들기로 처리된다
③ 예외. 소프트웨어 끼어들기 : 프로세스나 스레드가 허가되지 않은 메모리 위치에 액세스하려고 하면 조각화 위반이라는 예외가 발생해서 OS에 의해 프로세스가 강제 종료된다.
f. 폴링 간격이 길면 입출력이 완료되어도 금방 알아차리지 못하고 너무 짧으면 CPU를 쓸데없이 많이 사용한다는 것을 유의하자.
3. 폴링
a. 폴링은 정기적으로 질의하는 것을 의미한다.
b. 질의 방향이 단방향이고, 일정 간격을 따라 정기적으로 발생한다.
c. 반복(루프)만 하면 되기에 프로그래밍이 쉽다.
d. 상대가 응답하는 지 확인할 수 있다.
e. 모아서 일괄적으로 처리가 가능하다.
f. 폴링과 반대되는 것이 이벤트 주도 또는 끼어들기 방식이다. (요구가 있을 때만 처리하는 구조)
g. 일정 간격으로 처리를 실행하면 좋은 처리, 외부에서 정기적으로 상태를 확인해야 하는 감시처리 같은 경우가 활용하기 좋다.
h. 상태가 아닌 입력 내용에 따라 실행 내용을 변경하는 처리, 처리 우선순위를 정해야 하는 처리는 부적합하다.
i. 네트워크를 경유한 폴링일 때는 처리 지연 시간을 줄이기 위해 폴링 간격이 너무 짧으면 트래픽 양이 증가하므로 주의해야 한다.
j. 사용 예시
① 웹로직의 서버내 접속 감시는 정기적인 폴링을 이용해 구현. 접속 풀이란 서버간의 연결을 미리 생성해 두어서 애플리케이션이 쉽게 연결할 수 있게한 구조이다.
② NTP(시간동기) 처리 : 정기적으로 실시해서 자신의 시간이 맞는지를 확인하는 구조.
4. 핑퐁
a. 상자가 너무 작아서 짐을 운반하기 위해 몇 번이고 왕복해야 하는 상황을 의미한다.
b. 물건을 운반할 때는상자에 넣으면 효율적으로 관리가 가능하다.
c. 운반하는 양에 따라 상자 크기를 선택하면 효율적으로 운반할 수 있다.
d. 사용 예시
① 데이터 블록 : 오라클 데이터베이스가 데이터 파일을 읽기/쓰기하는 최소단위
② 블록 크기 8kb이면 파일 시스템의 블록 크기도 8kb로 하는 것이 효율적
③ DB 블록 크기가 OS 블록 크기와 다르면 DB 블록 크기가 OS 블록 크기의 배수가 된다.
④ 네트워크에서는 웹 브라우저가 데이터를 전송할때 소켓이라는 구조를 이용한다.
- Tcp 헤더, ip 헤더, mac 헤더
- Tcp 세그먼트
- 이더넷 프레임
- 송신버퍼, 수신버퍼
- MSS
- MTU
e. 처리량 중시 : 대량의 데이터를 빠르게 운반. DB file scattered read
f. 지연 시간 중시 : 소량의 데이터를 빠르게 운반. DB file sequential read
5. 저널링
a. 트랜잭션이나 매일 갱신되는 데이터의 변경 이력을 남겨두는 것이다.
b. 언제 어디서 어떻게 무엇을 했는지 상세하게 기록해서, 시스템 장애가 났을 때 어디 까지 정상처리인지 재실행 시점은 어디로 해야하는지 알 수 있게 하는 기능이다.
c. 데이터 자체가 아닌 처리 내용을 기록한다.
d. 데이터 일관성이나 일치성이 확보되면 필요가 없어진다.
e. 데이터 복구 시 롤백(rollback), 롤포워드(rollforward)에 이용된다,
① 롤백 : 저널을 읽어서 실제 데이터 정보를 과거로 되돌리는 처리.
② 롤포워드 : 저널을 읽어서 실제 데이터 정보를 앞으로 진행시키는 처리.
③ 처리단위는 트랜잭션.
f. 시스템 장애시 복구가 빠르고, 데이터 복제보다도 적은 리소스를 소비해서 데이터를 보호할 수 있다.
g. 데이터 갱신이 발생하는 시스템에 적합하고, 데이터 안정성보다 성능을 요구하는 시스템에 부적합하다.
h. 데이터 변경 시 저널과 실제 데이터 두 곳에서 I/O가 발생한다. (저널이 일반적으로 실제데이터보다 먼저 기록)
i. 사용 예시
① 리눅스 ext3 파일 시스템의 저널링 구조
트랜잭션 버퍼 정보를 디스크에 기록하지 않기 떄문에 버퍼에 있는 최신데이터를 잃을 수 있다. 완전하지는 않지만 가능한 한 데이터를 보호한다. (기본 설정에서는 5초에 한번 기록이고, 데이터 파손이 허용되지 않는 경우 간격을 짧게 설정하는 것이 좋다.)
② 오라클 DB의 쓰기 처리는 저널(Redo 로그)에 의해 보장된다.
오라클 DB에서 저널은 Redo 로그로 불린다. 트랜잭션 종료시 버퍼가 디스크에 기록되지만, 기록되는 Redo로그가 파손된 경우에는 최신 상태 복원 불가능. (오라클 DB에서는 Redo 로그를 이중화해서 보호한다. - 이중화된 로그를 멤버라고 한다. 오라클 배울 때 한 내용!!)
j. 주의점
① 저널 데이터는 메모리 버퍼에 저장되는데, 디스크에 기록이 되지 않으면 장애 시 읽을 수 있다. 시스템 요건에 따라 버퍼의 디스크 기록시점을 고려해야 한다. (기록빈도 상승 -> 오버헤드 상승도 고려 )
② 트랜잭션 도중에 장애가 발생하면 종료되지 않은 트랜잭션은 파괴한다. (한 트랜잭션 단위가 너무 크기지 않도록 설계)
k. COW(Copy on Write)
① 기록할 때 복사하는 것. 저널링처럼 증감정보를 작성하지 않고 파일 갱신은 모두 신규영역에서 진행한다.
② 모두 완료된 시점에 파일이 참조할 위치를 이전 영역에서 신규 영역으로 교체하는 방식이다.
③ 장점 : 데이터 변경 중 장애가 발생해도 갱신이 진행됐다는 모른다. 순식간에 처리하거나 아무처리도 발생하지 않는다. (트랜잭션성)
④ 단점: 원 데이터가 그대로 있고 신규 데이터를 기록해 데이터 영역이 최대 두배 필요하다.
6. 복제
a. 복사본을 만드는 것을 의미한다.
b. 장애 시 데이터 손실을 예방할 수 있다. (데이터 보호)
c. 복제를 이용한 부하분산이 가능하다. (자원을 복사해서 나누었기 떄문에 읽기 편하다.)
d. 사용자가 데이터에 액세스할 때 복제한 것이라는 것을 의식할 필요 없다.
e. 백업과 달리 실제 데이터가 복제 데이터와 실시간으로 동기화한다.
f. 사용 예시
① 데이터 블록 복제
- 원 서버에서 데이터 갱신으로 갱신 블록 매핑 (블록 단위로 데이터 전송량 최소화)
- 갱신된 순서대로 네트워크 경유로 데이터 전송
- 복제서버에 갱신이 반영
- 데이터 보호를 우선으로 하는 경우 복제 서버측 갱신이 끝난 이후에 기록처리가 끝난것으로 통지하는 경우도 있음
g. 적합한 시스템
① 데이터 손실을 허용하지 않고 장애 시 복구 속도가 빨라야 하는 시스템
② 데이터 참조와 갱신 부분이 나뉘어져 있으며 참조가 많은 시스템
h. 부적합한 시스템
① 데이터 갱신이 많은 시스템 (복제 대상 데이터가 많아 오버헤드가 발생할 가능성이 높음)
i. 주의점
① 복제 위치가 많으면 갱신이 많은 시스템과 같이 복제 오버헤드가 높아진다.
② 실 데이터와 복제 데이터를 완전히 일치시키려면 복제 데이터의 쓰기 완료 처리를 보장해야한다. -> 시스템 응답이 악화될 수 있다.
③ 시스템 유지관리나 장애 시에는 복제 이터도 고려해야 하기 때문에 설계나 운용 난이도상승
④ 복제 데이터와 실제 데이터가 차이가 커지면 그 차이를 채우기 위한 시간이나 성능 고려 필수
7. 마스터 슬레이브
a. 주종관계. 한 쪽이 관리자가 되어 다른 쪽을 제어.
b. 반대는 상호 관리라는 의미에서 peer to peer 관계
c. 각자가 관리 대상 리소스를 소유하고 있으면 피어 투 피어(peer to peer) 관리가 효율적이다.
d. 리소스를 공유하고 있으면서 리소스가 무한대로 있는 경우 각자 마음대로 관리해도 문제가 없으므로 피어 투 피어도 상관없다
e. 사용 예시
① 오라클 Real Application Cluster(RAC)의 마스터 슬레이브 구성
- 여러 대의 물리 서버가 클러스터 구성으로 연결되어 있다.
- 특정 서버가 마스터가 되는게 아니라 모두 대등한 관계. 서버가 다운되어도 DB 전체의 가용성엔 영향이 없다.
- 리소스 단위로 관리 마스터가 달라져 문제가 발생하는 서버의 경우 다른 서버로의 작업 인계가 단시간내에 이뤄진다.
f. 장점 : 관리자가 하나이므로 구현이 쉽다. 슬레이브 간 처리를 동기화할 필요가 없어 통신량이 감소한다.
g. 단점 : 마스터가 없어지면 관리를 할 수 없다. (작업 인계 구조 필요.) 마스터의 부하가 높아진다.
8. 압축
a. 디지털 데이터 압축의 기본은 중복 패턴 인식과 그것을 변경하는 것이다.
b. 디지털 데이터는 이진수라는 공통 단위로 표현되기 때문에 이미지, 텍스트 상관없이 동일한 방법으로 압축 가능하다.
c. 같은 패턴이 많을수록 압축률이 높아진다.(=압축파일 크기가 작아진다)
d. 장점 : 데이터 크기를 줄이는 것. 단점 : 처리시간이 걸린다는 것. (데이터 크기와 처리 시간이 상충)
e. 가역압축 : 이미 알고 있는 정보를 제거하는 압축 방식. 데이터를 원래대로 복원 가능하다..
f. 비가역 압축 : 자신에게 필요없는 정보를 제거하고 최소 필요 정보만 남겨두는 압축 방식. 사람이 인식할 수 없는 부분을 생략한다.
g. 사용 예시
① 자바의 jar, war 파일. 실제로는 zip 형식의 압축 파일이다 !
- jar 파일 자체는 자바의 클래스 파일로 구성. 클래스 파일은 해당 애플리케이션 가동 시에 메모리로 읽어서 클래스 인스턴스를 생성한다. 항상 읽는 파일이 아니므로 가동 시에 압축된 클래스 파일을 해제하는 건 애플리케이션 속도에 영향 없음
② 데이터베이스나 저장위치인 저장소 서버에서도 압축을 사용한다.
- 압축에 시간이 걸려 쓰기 속도가 떨어지면 안되므로 간단한 압축 구조 사용
- 중복제거(deduplication) : 기록할 데이터를 일정 단위 블록으로 처리해서 중복된 것을 제거하는 기능
9. 오류 체크/오류 수정
a. 의도치 않게 데이터가 망가질 것을 방지하는 구조를 의미한다.
b. 원인
① 통신 중에 데이터 파손 (잡음 발생)
② 칩에서의 데이터 파손 (메모리 데이터도 전기적으로 저장되므로 전기적 영향으로 데이터 변경 시)
c. 오류 검출
① 패리티 비트라는 추가 비트를 부여하는 방법이 자주 사용된다.
② 비트에서는 반드시 1이라는 수가 짝수개 또는 홀수개가 되도록 1비트만 추가. 데이터가 변경시 1이 짝수,홀수개인지에 따라 오류를 검출. (단 2비트가 동시에 바뀌면 오류 인지 불가능)
d. 사용 예시
① 서버용 메모리 중 오류 수정 기능이 있는 ECC 메모리
- 쓰기 처리 시 패리티 비트 계산을 해서 패리티 정보도 함께 기록한다.
- 읽기 처리 시 다시 패리티 계산을 해서 오류가 있는지 검사. 오류시 수정, 수정 불가능할 경우 오류만 검출해서 반환. (신뢰성이 중요한 서버에서는 2비트 오류 수정이 가능한 것도 존재)
② 네트워크 프로토콜에서 오류 검출
- TCP/IP 및 이더넷은 계층별로 체크섬이나 CRC오류를 검출하는 구조 사용.
- 수신측에서 해당 프레임/패킷에 오류가 있는 것을 감지하면 해당 데이터 제외
- TCP의 경우 자동적으로 TCP가 빠진 패킷을 재전송하도록 요구
e. 장점 : 상위 계층에서의 오류 관리 없이 데이터 일치성을 일정 수준 보장.
f. 단점 : 체크 기능에 의한 리소스 부하 상승, 알고리즘의 복잡화
[6장. 시스템을 연결하는 네트워크 구조]
1. 네트워크
a. 서로 다른 장비가 데이터를 교환할 때 , 네트워크를 경유해서 데이터를 송수신할 필요가 있다.
b. 네트워크 자체가 구조를 알지못해도 사용할 수 있도록 되어(블랙박스) 공부할 필요가 있다.
c. 네트워크에서 발생하는 데이터 처리나 교환에는 다양한 구조 존재.
i. 3계층형 시스템을 구성하는 경우 대부분 TCP/IP 구조 사용. TCP/IP는 다양한 통신 환경에서 데이터를 전달해줌.
d. 이 책에서는 깊게 다루지 않았다. 책 한권을 모두 사용해도 부족. 따로 책을 사서 공부해보자!
e. 네트워크를 배울 때 기본이 되는 계층구조와 프로토콜, TCP, IP, 이더넷에 대해 설명할 것.
2. 계층 구조
a. 계층 구조는 역할 분담에 해당한다.
b. 데이터나 기능 호출 흐름에 따라 계층 간 역할이 나누어진다.
c. 역할이 나뉘기 때문에 각 층은 자신이 담당하는 일만 책임짐. 상호 연결된 계층에서는 교환 방법(인터페이스)만 정해두면 된다.
d. 은폐화 : 각 계층이 어떤일을 하는지는 알고 있지만 어떤방식으로 처리하는지는 알지 못 한다.
e. 계층 구조를 나눔으로써 계층 간에 서로 영향을 주지 않고 독립적으로 동작한다..
f. 단점은 작업 효율을 희생해야 한다. 계층 마다 상호 교환할 때에 작업 인계를 위한 오버헤드 발생한다.
g. 대표적인 예시 : OSI 7계층 모델
- Open System Interconnection라는 통신 규격을 만들 때 고안된 것. OSI는 안쓰지만 이 계층구조 개념은 참조모델로 현재도 사용한다. 세세한 내용은 별도로 공부해보고 간략하게 살펴보자!
- 참조모델이 되면서 엔지니어가 서로 공용할 수 있는 일종의 공통 언어 역할
- '물데네전세표응'으로 외운 7계층은 아래와 같다.
- 애플리케이션(응용) 계층 : 애플리케이션 처리
- 프레젠테이션(표현) 계층 : 데이터 표현 방법
- 세션 계층 : 통신 시작과 종료 순서
- 전송 계층 : 네트워크의 통신 관리
- 네트워크 계층 : 네트워크 통신 경로 선택
- 데이터 링크 계층 : 직접 접속되어 있는 기기간 처리
- 물리 계층 : 전기적인 접속
h. 서버 애플리케이션의 전체 계층 구조
① 하드웨어, 커널, JVM, 애플리케이션 서버, 자바 애플리케이션 조합도 계층 구조.
② 커널과 애플리케이션(jvm)은 시스템 콜이라는 인터페이스로 연결되어 있다.
3. 프로토콜
a. 사전에 정해놓은 순서, 컴퓨터가 서로 소통하기 위해 정한 규약을 의미한다.(프로토콜은 같은 계층 간의 약속이라 생각할 수 있음)
b. 프로토콜이 일치하지 않으면 통신이 불가능하다.
c. 떨어진 곳에 있는 두개의 장비는 사전에 프로토콜을 정해두야 서로 통신이 가능하다. 같은 계층 간의 약속!
d. 네트워크 업계에는 공통 프로토콜 선정을 위한 IEEE나 IETF 같은 표준화 단체가 존재한다.
e. 표준화 단체
- IEEE : 전기전자 기술 학회. 전기 통신을 사용한 프로토콜 표준화 활동도 하고 있음(ex. 무선 LAN 프로토콜 - IEEE 802.11n 대응)
- IETF : 인터넷에서 사용되는 다양한 기술을 표준화하는 단체. 정한 내용이 나와있는 RFC라는 이름의 문서. Request for Comment. 인터넷 프로토콜의 기본적인 부분은 RFC 791에서 정함
- 실제 많이 사용되는 이더넷2(Ethernet II)라는 사양을 만든 DEC, 인텔, 제록스는 DIX.
f. 프로토콜은 서버 내부에도 존재한다.
- SCSI : 저장소에서 데이터를 꺼낼 때 사용하는 프로토콜.
- 멀티 코어 CPU에서 이 코어들이 서로 통신을 하기 위한 프로토콜도 존재한다.
4. TCP/IP 를 이용하고 있는 현재의 네트워크
a. TCP/IP Protocol Suite : 프로토콜 집합 개념.
① 1969년 미국 국방성 연구 ARPANET
② 1980년대 아파넷 외에 다른 네트워크들도 운용되며 상호간에 접속이 가능해졌다.
③ 1982년 국제 규격의 프로토콜을 만들자는 의도로 OSI 프로토콜이 나옴. 하지만 1970년대 TCP나 IP 프로토콜이 보급되고 있었고 OSI의 복잡한 사양때문에 접속성에 문제 발생. > 국제 표준으로 권장했으나 사장되버렸다.
④ 최종적으로 TCP/IP 프로토콜 슈트를 이용하는 네트워크가 대다수이다.
⑤ 다양한 네트워크가 상호 간에 협력하면서 인터넷이 발전했고 그 가운데 TCP/IP가 발전한 것이다!
b. TCP/IP 4계층 모델
- TCP는 필수가 아니며, IP는 통신 상대 지정시에 IP주소를 이용하기 때문에 반드시 필요하다.
- 링크 계층 : 직접 연결되있는 주변 장비에게 전달한다.
- IP 계층 : 데이터를 최종 위치까지 운반한다.
- 전송 계층 : 상대방에게 전달한다.
- 애플리케이션 계층 : 데이터 송신 요청 처리. 송신은 다른 계층에서 처리. (http 예시에서 httpd 프로세스)
- OSI 7계층에서 1~2계층 > 링크 계층, 5~7계층 > 애플리케이션으로 취급하기도 한다.
- 각 계층별 처리하는 네트워크 스위치를 OSI 7 계층으로 부르는 경우가 많다.
- 링크 계층(이더넷 계층)을 L2, IP계층 L3, 전송계층(TCP) L4.
- L5, L6, L7의 경우 애플리케이션 계층으로 취급하기 때문에 거의 등장하지 않는다.
c. 신뢰성이 낮지만 간단하게 데이터를 송수신할 수 있는 UDP 사용 가능하다.
d. 유선이 아닌 무선으로 통신을 하는 등 용도에 맞게 변경 가능하다.
5. 레이어 7 : 애플리케이션 계층의 프로토콜 http
a. 자신이 통신하는 것이 아니라 통신 자체는 모두 OS(TCP/IP)에 맡긴다.
b. HTTP 사양은 RFC2616에서 정하고 있다.
c. 브라우저 URL 을 입력해서 요청이 웹 서버에 도달하면 응답으로 HTML 파일이 반환
d. 요청과 응답
① Request는 명령으로 구성된다.
- 서버에 대한 요구명령 대상 데이터 지정.
- GET : 파일 요구
- POST : 데이터를 전송
- PUT : 정보를 업데이트하기 위해서
- DELETE : 정보를 삭제하기 위해서 사용 - 헤더 부분에는 user-agent는 브라우저 식별정보같이 다양한 부가정보. 세밀한 제어를 위해 사용한다.
- 바디 부분에는 브라우저에 입력한 내용이 포함된다.
② Response 요청에 대한 결과와 상태정보를 가지고 있다.
- 에러가 있는지 상태 정보
- 헤더 부분에는 브라우저에 대한 상세 정보(브라우저 식별정보, 데이터 형식, 접속 방식)
- 바디 부분에는 HTML 데이터 등 실제 데이터 저장된다.
e. HTTP 요청은 여러가지 명령만으로 구성되서 매우 간단한 구조이다.
f. 애플리케이션은 소켓을 사용해서 통신한다.
- 애플리케이션 계층은 필요한 데이터를 소켓에 기록만 한다.
- 소켓에 기록된 데이터는 다른 한쪽의 소켓으로 전달된다. (통신은 모두 TCP/IP에 위임.)
- 애플리케이션 자체가 통신구조를 가지지 않아도 원격지에 있는 서버 애플리케이션과 통신 가능하다.
- 시스템 콜을 통해 커널에게 접속대상 서버의 IP주소와 TCP 포트 정보 전달한다.
- 접속 대상 서버와 연결 생성. (가상 경로. 버추얼 서킷)
g. 소켓 이하는 커널 공간에서 처리한다.
- 애플리케이션 프로세스가 네트워크 통신을 하는 경우 커널에 회선을 열어달라 의뢰(시스템 콜)
- 접속 대상 서버의 IP주소와 TCP포트 정보 필요
- 의뢰받은 커널은 소켓 생성
- TCP/IP 관련하여 주소및 포트 번호 정보를 시스템 콜 경유로 커널에 전달하면 접속대상서버도 연결 생성
- 상대방 서버에서도 소켓 생성. 서버 간에 가상 경로(버추얼 서킷) 생성
- 최종적으로 NIC가 데이터를 전송. (실질적으로 데이터는 다양한 경로를 거침)
- 프로세스 관점에서는 소켓에 기록한 데이터가 가상경로를 통해서 상대 소켓으로 나오는 것
h. Keep-Alive
- 단시간 동안만 세션을 남겨 두는 기능.
- 웹서버 측에 세션 잔존 시간 등을 설정
- 어느 정도 세션을 유지할지는 화면 하나당 '평균 응답시간+a' 로 설정
- 너무 길면 자원 낭비, 너무 짧으면 설정한 의미 없음
6. 레이어 4 : 전송 계층 프로토콜 tcp
a. TCP(Transmission Control Protocol). 전송을 제어하는 프로토콜로 신뢰도가 높은 데이터 전송한다.
b. TCP의 역할은 애플리케이션이 보낸 데이터를 그 형태 그대로 확실하게 전달하는 것이다.
c. TCP에 의존하지 않고 IP만으로 통신이 가능함. (하지만 IP는 데이터가 상대방에게 확실히 전달됐는지 확인하는 기능이나 도착한 순서를 확인하는 기능 등이 없다.)
d. 중요 기능은 포트 번호를 이용해서 데이터 전송, 연결 생성, 데이터 보증과 재전송 제어, 흐름 제어와 폭주 제어 등.
e. TCP는 세그먼트라고 하는 단위로 데이터를 관리한다.
f. 애플리케이션 데이터에 TCP헤더를 붙여서 TCP세그먼트를 작성한다. (헤더에는 도착 지점 포트 번호 등 TCP 기능을 표현하기 위한 정보 기록)
g. MSS(Maximum Segment Size) : 하나의 TCP 세그먼트로 전송할 수 있는 최대 데이터 크기
h. MTU(Maximum Transfer Unit) : 링크 계층에서 전송할 수 있는 최대 데이터 크기.
i. 인터넷의 주인은 누구 ?
- 신뢰성이 높지 않은 인터넷 = 보낸 소켓이 인터넷 경로 어딘가에서 행방불명. 설정 부족. 장비 고장. 혼잡도에 의한 패킷 훼손 등 으로 인한 통신 품질 하락
- 인터넷에서는 양자간 신뢰성을 담보할 TCP 같은 구조가 필요.
- 인터넷은 모두가 공유하는 것으로 공평성도 중요. 자신만 생각해서 전속력으로 통신하면 도중에 있는 네트워크에서는 통신 혼잡 발생.
- Be strict when sending and tolerant when receiving : 송신시에는 엄격하게, 수신시에는 참을성있게
j. 커널 공간의 TCP 처리 흐름(소켓에 기록된 애플리케이션 데이터는 소켓의 큐를 경유해서 소켓 버퍼에서 처리)
- 애플리케이션 프로세스가 소켓에 데이터를 기록한다.
- 소켓에 기록된 데이터는 큐를 경유해서 커널 내 네트워크 처리 부분에 전달된다.
- 커널에 전달된 데이터는 소켓 버퍼라는 메모리 영역에서 처리
- 데이터에 TCP 헤더를 붙여서 TCP 세그먼트를 생성한다. 헤더에는 MSS를 초과한 데이터는 자동적으로 분할되어서 복수의 TCP 세그먼트가 생성된다.
k. 포트번호를 이용한 데이터 전송
- TCP 에서는 포트 번호를 사용해서 어떤 애플리케이션에 데이터를 전달할지 판단한다.
- 포트번호는 0 ~ 65535까지의 숫자 사용한다.
- 커널로부터 도착한 TCP 세그먼트의 목적지 포트 번호를 수신한 서버의 커널에서 확인해서 맞는 소켓에 데이터를 전달한다.
l. 연결 생성
- TCP는 소켓을 생성할 때도 중요한 역할을 한다.
- TCP는 연결형 프로토콜. 연결이라 불리는 가상 경로(버추얼 서킷)을 생성한다.
- TCP가 통신을 시작하면서 통신 상대에게 지금부터 통신한다고 연락 후 OK 사인을 받으면 그 때 처음 생성한다.
- 통신을 받으려면 통신을 받는 애플리케이션 서버가 미리 통신 준비를 하고 있어야 한다.
- 포트번호 ㅁㅁㅁㅁ에 통신의뢰가 오면 나에게 연결하도록 서버 프로세스는 OS에 부탁한다.
- 소켓은 자신이 지정한 포트번호에 통신이 오는지를 기다렸다가 받는다 (포트를 리슨하고 있는 상태)
- 통신이 시작된다.
- TCP/IP의 3-way handshaking
1) 통신 상대인 서버측 OS에게 가상경로를 열도록 의뢰한다.
2) 서버에서는 리슨하고 있는 포트 번호로 통신요구가 온다. 서버는 문제가 없으면 열어도 된다는 응답을 한다.
3) 클라이언트측도 확인했다는 메세지를 보내며 이때 처음으로 통신용 가상 경로가 열린다. - TCP 통신을 시작할 때 상대 서버에 포트번호와 연결을 달라고만 한다.
- 데이터 전송 자체도 IP에 위임. 실제 물리적인 경로가 막히거나 통신 상대 서버가 갑자기 장애가 발생해도 TCP연결은 끊어지지 않는다. 이런 상태에서는 데이터가 잘달되진 않지만 통신 대상이 에러를 보내지 않는 이상 TCP 연결 자체가 유지된다.
- TCP에는 KeepAlive 타이머라는 설정이 있어서 이 설정 시간동안 통신이 업승면 통신상대가 존재하는 지 확인하는 데이터를 여러 번 전송한다. 반응이 있으면 연결 유지. 반응이 없으면 통신상대가 존재하지 않는다고 판단해서 연결을 닫는다.
m. 데이터 보증과 재전송 제어
① 데이터 손실 방지 기능
- 확인응답과 재전송에 의해 구현.
- 수신 측에 TCP 세그먼트가 도착하면 수신측은 송신측에 도착했다는 것을 알리기 위해 ACK를 반환한다. (ACK는 TCP 헤더에 기록된다. 하나의 TCP 세그먼트로 데이터전송과 함께 앞서 도착한 데이터의 ACK를 동시에 반환)
- 송신측은 ACK가 돌아오는 것을 보고 전송한 세그먼트가 무사히 도착했다는 것을 알 수 있다.
- ACK가 안오면 전송된 TCP세그먼트가 사라진 경우. 재전송을 해야하므로 ACK가 돌아오기전까진 소켓 버퍼에 저장해두어야 한다.
② 데이터 순서 보증 : 각 TCP 세그먼트에 시퀀스 번호를 붙여서 구현. 이런 순차적인 조합을 위해 수신측은 ACK를 반환할 때 다음에 필요한 TCP 세그먼트의 시퀀스 번호도 ACK 번호로 전달.
③ 재전송 제어
- 중복 ACK : 송신 측에 같은 ACK가 돌아오면. 한번 받은 ACK 번호와 같은 것이 중복해서 도착한 경우 그 번호에 해당하는 TCP 세그먼트가 도착하지 않았다고 간주하고 재전송. 3회까지 기다리는 이유는 가끔 경로 도중에 지연되서 세그먼트의 도착순서가 바뀔 수 있기 때문.
- SACK(Selected ACK) 옵션 : 특정 세그먼트 이후로 도착한 세그먼트가 있을 수 있다. 이 옵션에서는 이미 도착했다는 것을 정보로 전달할 수 있다.
n. 흐름제어와 폭주제어
① TCP는 어느 정도의 세그먼트 수라면 ACK를 기다리지 않고 전송하는 윈도우라는 개념을 가지고 있으며 ACK를 기다리지 않고 전송 가능한 데이터 크기를 윈도우 크기라고 한다.
②수신측의 수신 윈도우, 송신 측의 폭주(송신) 윈도우 존재. 둘중 작은 쪽을 송신 윈도우로 채택. 이 범위 내에서는 ACK를 기다리지 않고 전송한다.
- 송신 측 윈도우가 폭주 윈도우인 이유 : 송신 측 윈도우 크기는 네트워크 폭주 상태(혼잡상태)에 맞추어 변경시키기 때문.
- TCP는 주변에 영향을 주지 않도록 자중하는 프로토콜. 폭주 윈도우 크기는 통신 시작 시에 1세그먼트로 설정
- 슬로 스타트 : 통신이 문제없이 시작해서 수신측에 도착하면 ACK 반환시마다 폭주 윈도우 크기를 2세그먼트, 4세그먼트 식으로 지수함수적으로 늘려나간다.
- 송신 중인 세그먼트가 실패하면, 즉 실패를 감지하면 폭주 윈도우 크기를 작게해서 송신량을 줄인다.
- 송신 측은 받은 수신 윈도우 크기와 폭주 윈도우 크기중 작은 쪽에 맞추어 전송량을 제어한다. 이와 같은 형식으로 흐름제어와 폭주 제어가 이루어진다.
③ 슬라이딩 윈도우 : 윈도우를 이동해가는 방식
④ TCP의 흐름제어(유량제어)
- 수신용 소켓 버퍼가 넘쳐서 수신이 불가능하면 수신윈도우를 작게 만들고 송신측에 알림
- 송신측은 수신 윈도우 크기 이상의 데이터는 ACK없이 보낼수 없게 된다.
7. 레이어 3 : 네트워크 계층 프로토콜 IP
a. IP(Internet Protocol)은 TCP 세그먼트가 만들어지면 처리가 시작된다.
b. 프로토콜의 종류에 따라 다른 버전 존재.
① IPv4, IPv6
② 기업형 시스템에서는 대부분 IPv4 사용
c. IP의 역할은 지정한 대 서버까지 전달받은 데이터를 전해주는 것. 단, 반드시 전달된다는 것을 보장하지 않는다.
① IP 주소를 이용해서 최종 목적지에 데이터 전송
② 라우팅(Routing)
d. 커널 공간의 IP 처리 흐름
① IP계층에서는 최종 목적지가 적힌 IP 헤더를 TCP 세그먼트에 추가해서 IP 패킷을 생성(기본적으로 IP 패킷은 TCP에 의해 링크 계층에 최대 전송크기로 분할돼 있기 때문에 IP 헤더만 추가한 것.)
② 헤더에는 목적지 IP주소외에 저장하고 있는 데이터 길이, 프로토콜 종류, 헤더 체크섬 등이 기록
③ IP에도 패킷 분할 기능 존재. IP에 의한 패킷 분할과 재결합 기능을 각각 IP 조각화 및 재결합이라고 한다.
e. IP주소를 이용한 최종 목적지로의 데이터 전송
① IP에서는 최종목적지 서버까지 복수의 네트워크를 경유해 데이터를 전송한다.
② IP주소는 32비트로 표현된 숫자 집합. 컴퓨터에서 처리하는 숫자이기때문에 원래는 이진수를 써야하지만 사람이 읽기 쉽도록 192.168.0.1과 같이 8비트 단위로 마침표를 찍어서 표현.
③ IP 주소는 네트워크부와 호스트부로 나뉜다.
④ 네트워크부 : 어떤 네트워크인지 가리킴. 같은 네트워크에 포함시킬 컴퓨터는 네트워크부가 동일해야 함.
⑤ 호스트부 : 해당 네트워크내에 있는 컴퓨터(소유자)를 가리킴.
⑥ IP주소에서는 어디까지가 네트워크부인지 표시하기 위해서 '/24' 와 같이 CIDR(사이더) 표기를 사용한다.
⑦ 서브넷 마스크라고 해서 255.255.255.0 과 같이 표현하기도 한다.
⑧ IP주소 중 호스트부의 비트가 모두 0인 것을 네크워크 주소, 모두 1인 것을 브로드캐스트 주소라 한다.
⑨ 브로드캐스트 주소에 보낸 패킷 같은 네트워크의 모든 호스트에 전달된다.
f. 라우팅
① IP 주소를 이용해 통신 대상 서버를 지정할 수 있다. 대상 서버가 다른 네트워크에 있는 경우 최종 목적지에 도달할 때 까지 목적지를 알고 있는 라우터에 전송을 부탁한다.
② 라우팅 테이블 : IP패킷을 받은 라우터는 해당 IP 패킷의 헤더에서 목적지를 확인해서 어디로 보내야할지 확인할 때 사용
③ 외부와 접속하는 네트워크는 보통 기본 게이트웨이라는 라우터가 설치되어 있다.
④ 기본 게이트웨이는 외부 네트워크에 접속돼 있어서 외부 세계에 패킷을 보낼 수 있다.
⑤ IP를 이용한 전송은 주변을 신뢰해야만 성립한다. 인터넷 통신에서는 자신이 관리하지 않는 네트워크를 다수 경유해야지 패킷이 상대 서버에 도달한다.
⑥ IP헤더는 TTL(Time to Live)라는 생존 시간 정보를 가지고 있다.
- 잘못된 라우팅 테이블로 인한 패킷이 순환하는 형태를 막히 위함이다.
- TTL이 64부터 시작해서 계속 전송될 경우 TTL이 하나씩 줄어들어 0이 된다.
- 이 시점에 패킷 생존 시간이 끝나 라우터가 패킷을 파기한다.
- TTL을 이용해서 라우터가 패킷을 파기한다. (TTL을 이용해서 패킷이 좀비가 되어 배회하는 것을 방지)
- 정해진 TTL 값은 없으며 기본 값은 OS마다 다르다.
⑦ IP헤더 체크섬
- IPv4, IPv6의 가장 큰 차이는 체크섬 유무이다.
- IPv4 헤더에는 헤더 체크섬을 저장하는 장소가 있다. 이를 통해 헤더 정보가 파괴됐는지 여부를 확인 가능하다.
- 헤더 정보에 변경이 있을때는 체크섬을 재계산해야한다. > TTL은 라우터를 경유할 때 마다 1씩 줄어드므로 체크섬을 매번 재계산 해야한다.
- 본래 TCP헤더에도 체크섬이 있으며, 이 체크섬 계산으로 IP 주소 부분을 포함한 일치성을 확인하고 있다. > 이 때문에 IPv6에서는 체크섬이 제외됐다.
- 가변길이가 허용되었던 IPv4, IPv6 헤더는 40바이트 고정길이를 사용하는 등 라우터 처리해야할 부분을 줄였다.
8. 레이어 2 : 데이터 링크 계층의 프로토콜 이더넷
a. 이더넷의 역할
- IP 패킷이 만들어지면 링크 계층의 처리가 시작. 링크 계층에서 사용되는 대표적인 프로토콜은 이더넷(ethernet)
- 이더넷을 포함한 링크 계층 프로토콜의 역할은 동일 네트워크 내의 네트워크 장비까지 전달받은 데이터를 운반한다.
- 링크 계층 프로토콜은 OSI 7계층 모델의 물리 계층과 밀접한 관계.
- 이더넷은 케이블 통신에서 사용되므로 이더넷 프레임은 전기 신호로 전송된다.
- 이 때문에 이더넷 프로토콜은 전기 신호의 특성과 관련된 제어 기능등 다양한 기능이 포함되어 있다. (자세한 것은 다른 전문 서적 참고)
- 이더넷은 동일 네트워크 내, 자신이 포함된 링크 내에서만 데이터를 전송할 수 있다. 이때 사용되는 주소가 MAC 주소이다.
b. 커널 공간의 이더넷 처리 흐름
① IP계층에서 라우팅 테이블을 확인하기 때문에 어떤 링크(NIC)가 패킷을 보낼지는 정해져 있다.
② 최종적인 통신 상태가 동일 네트워크내에 있으면 해당 서버에 직접 전송, 다른 네트워크에 있으면 기본 게이트웨이에 패킷 전송 > MAC 주소라 불리는 링크 계층 주소를 이용해서 첫 번째 목적지로 전송.
③ IP패킷에 이더넷 헤더와 푸터를 붙여서 이더넷 프레임 생성한다.
④ 헤더에는 링크 계층 주소인 MAC 주소가 기록된다.
- MAC주소에는 ARP 테이블(MAC 테이블) 존재. IP주소와 MAC주소의 대응관계를 기록한 표
⑤ 목적지 IP 주소에 따라 경로표(라우팅 테이블)를 이용해서 어떤 NIC에서 보내야 할지 결정한다.
⑥ 송신 큐에 넣은 후에 장치 드라이버 경유로 NIC 전달한다.
⑦ 커널 처리를 끝낸 프레임은 버스를 통해서 NIC로 보내고, NIC에 연결된 장비로 프레임이 전송된다.
⑧ MSS는 링크 계층의 크기에 따라 변동. ( = MTU - IP 및 TCP의 헤더)
⑨ IP패킷의 최대 크기는 (IP헤더 + TCP 헤더 + MSS)
- IP 패킷의 크기가 MTU를 클 경우 : IP에도 분할기능이 있어 패킷을 분할한다. TCP 계층에서 분할한 후 IP 계층에서도 분할 처리를 진행해 불필요한 처리시간이 증가한다. 패킷 분할을 하지 않는 경우도 있는데 이경우에는 패킷이 파기된다. 이를 방지하기 위해 Path MTU Discovery 라는 방법을 이용해 최소 MTU를 확인해서 미리 세그먼트 그기를 조정할 수 있다.
- IP 패킷의 크기가 MTU를 작을 경우 : 하나의 패킷으로 전달할 수 있는 데이터 크기가 작아 큰 데이터를 전달할 경우 통신 횟수 증가
c. 동일 네트워크 내의 데이터 전송
- MAC 주소는 네트워크 통신을 하는 하드웨어에 할당된 주소로 원칙적으로는 세상에 있는 모든 장비가 고유한 물리주소를 지닌다.
- IPv4 주소는 32비트, MAC 주소는 48비트(보통 16진수)
- 서버 등이 보낸 이더넷 프레임이 L2스위치에 도착하면 프레임을 받은 L2 스위치는 MAC 주소를 보면서 적절한 포트에서 프레임을 꺼낸다.
- 다른 네트워크를 거치는 경우는 MAC주소를 사용한 통신이 불가능하다.
- IP를 이용한 브로드캐스트 주소 통신은 이더넷 상에서 브로드캐스트 통신으로 전송.
- 브로드캐스트를 이용한 통신도 다른 네트워크를 거쳐서 전송할 수 없기 때문에(동일 링크. 동일 네트워크만 가능) 하나의 네트워크를 브로드캐스트 도메인이라 부른다.
d. VLAN
- 네트워크를 구축할 때는 통신이 도달하는 범위를 생각해야 한다.
- 브로드캐스트 통신 등 전체에 데이터를 전송하는 경우는 불필요한 트래픽을 증가시킨다.
- 브로드 캐스트 도메인을 고려해서 네트워크를 적절하게 분할하는 것이 필요하다.
- VLAN은 물리 구성에 의존하지 않고 가상적인 네트워크를 나누는 구조
- 가상적으로 나눈 네트워크는 VLAN ID 로 관리
- VLAN 중 자주 사용되는 것은 태그 VLAN
1) 이더넷 프레임에 해당 프레임이 소속된 VLAN ID의 태그를 붙여서 하나의 물리 링크 내에서도 복수의 네트워크 이더넷 프레임을 처리할 수 있는 구조
2) 스위치 간에는 서로 다른 VLAN 프레임이 섞여서 흐른다. 양자를 구별하기 위해 프레임에 태그를 붙인다.
3) 목적지 스위치에 도착하면 태그를 제거하고 적절한 VLAN에 프레임을 전달한다.
4) 동일한 스위치에 접속돼 있어도 서로 다른 VLAN ID에 설정된 포트를 사용하는 경우 L3스위치나 라우터 없이는 서로 통신할 수 없다.
9. TCP/IP 를 이용한 통신 이후
a. 네트워크 스위치 중계 처리
- 전송된 이더넷 프레임은 제일 먼저 서버와 인접하고 있는 L2 스위치에 도착한다.
- 레이어2는 이더넷 계층이기 때문에 이더넷 헤더를 보고서 대상 MAC주소를 확인한 후 적절한 포트를 통해 프레임을 전송한다.
1) 네트워크 스위치는 일반 서버와 달리 프레임이나 패킷 처리에 특화된 ASIC이라 하는 회로를 가지고 있다. 하드웨어 처리만으로 빠르게 프레임이나 패킷을 전송할 수 있다.
2) ASIC 스위치 내부에서도 헤더 등을 확인한다. L2 스위치 에서는 이더넷 헤더를 확인해서 어떤 포트에 프레임을 보낼지 판단한다. L3 스위치나 라우터에서는 IP헤더까지 확인해서 전송 위치를 확인한다. 여기서는 필요에 따라 헤더 내 데이터를 수정할 수도 있다. - 목적지 서버가 동일 링크 내에 있는 경우(동일 네트워크 내) IP패킷을 이더넷 프레임에 넣어서 MAC주소로 통신할 수 있다.
- 목적지 서버가 다른 네트워크에 있는 경우 먼저 기본 게이트웨이로 보내서 IP라우팅을 이용해 패킷 전달. 다양한 네트워크(링크. 라우터와 같은 스위치)를 경유하게 되지만 IP 패킷은 각각 다른 이더넷 프레임에 저장돼서 전달된다.
b. 최종 목적지의 수신 확인
- L2 스위치나 L3 스위치를 경유해서 최종 목적지인 서버에 이더넷 프레임이 도착한다.
- NIC 로 프레임이 도착하면 NIC 수신 큐에 저장해서 OS 끼어들기나 OS 폴링을 이용해서 커널 내에 프레임을 복사한다. 이때 버스를 통해서 메모리로 전달된다.
- 이더넷 헤더와 푸터를 제거하고 IP 패킷을 꺼낸다. (IP 계층에 전달)
- IP 주소를 확인해서 자신에게 보낸 패킷이 맞는지 확인한다.
- 맞을 경우 IP 헤더를 제거하고 TCP 세그먼트를 꺼낸다. (TCP 계층에 전달)
- TCP 포트번호를 확인해서 포트번호에 해당하는 소켓에 데이터 전달. (소켓에 수신 큐에 저장)
1) TCP는 데이터를 보증하므로 없어진 세그먼트나 잘못된 순서를 허용하지 않는다.
2) 데이터 재구성을 위해 필요한 세그먼트가 모두 도착하기까지 버퍼내에서 기다리는 경우도 존재. - TCP 헤더를 제거하고 안에 있는 애플리케이션 데이터를 재구성하고 이를 소켓을 통해 애플리케이션에 전달한다.
- 애플리케이션의 읽기 요청이 있으면 데이터 전달.
c. NIC의 끼어들기와 패킷 처리
- 하드웨어의 끼어들기(interrupt, 인터럽트)는 하나의 장치당 하나의 CPU(코어)밖에 처리할 수 없다.
- 네트워크 통신에서 NIC에 데이터가 도착하면 NIC가 커널에 끼어들기해서 수신 처리
- 이 처리는 어느 CPU에서 해야할지 사전에 정해져서 통신 지연이 밯생하면 특정 CPU만 바빠진다.
- 최신 NIC에는 RSS(Receive Side Scaling)라는 기능이 탑재돼 있어서 CPU별로 준비된 복수의 큐에 수신한 패킷을 할당할 수 있다.
- 패킷 헤더를 통해 계산한 해시 값을 기준으로 큐에 할당하기 때문에 CPU 전체에서 수신 처리를 분산 가능
- RSS는 NIC측 기능이지만 OS측 기능도 등장. (리눅스 커널에 RPS:Receive Packet Steering이라는 기능 탑재. RSS를 커널측에서 구현)
- RPS에 RFS(Receive Flow Steering)라는 기능이 추가. (RFS에서는 RPS로 복수의 CPU에 처리를 분산할 때 해당 패킷 데이터를 최종 수신 프로세스의 CPU에게 전달)
[7장. 무정지를 위한 인프라구조]
// TODO 정리 예정
그림으로 배우는 IT 인프라구조를 보고 공부한 내용입니다.
http://www.yes24.com/Product/Goods/19041948?scode=032&OzSrank=1
'CS > Book' 카테고리의 다른 글
[Book] 읽기 좋은 코드가 좋은 코드다 (0) | 2020.11.29 |
---|---|
[Book] 클린코드 (0) | 2019.10.05 |