인프라 구조에 대해 알아보자
실무에서 시스템의 안정성과 고가용성을 요구한다. 즉 시스템 서비스가 가능한 멈추지 않도록 하려고 한다.
안정성, 고가용성의 목표를 세분화시킨다면 다음과 같다.
고장, 장애에 의한 정지가 발생하지 않도록 하며 발생한다면 복구할 수 있는 것을 목표로 한다. (컴포넌트를 이중화한다)
고장, 장애가 발생한 것을 검출할 수 있어야 한다(컴포넌트 감시)
고장, 장애가 발생해도 데이터가 보호되어야한다(데이터 백업)
이중화
하나의 기능을 병렬로 나열해서 하나에 장애가 발생해도 다른 것을 이용해서 서비스를 계속할 수 있게 하는 것. 이중화는 고가용성뿐만 아니라 확장성과 부하분산 같은 성능에도 영향을 미친다
이중화를 하기 위한 구조
- 부하를 분산한다, 내부적으로 생존을 감시한다, 마스터를 경정해야한다, 안전하게 교체가 되어야 한다(페일오버)
하드웨어 이중화
전원, 장치 등을 이중화한다, 네트워크 인터페이스를 이중화 한다, HDD를 이중화 한다(RAID 기술), 버스 이중화
RAID란?
RAID는 여러 HDD를 묶어서 그룹을 만들고 논리적인 HDD로 인식하는 기술이다. 논리적인 HDD를 LU라고 하고 서버가 인식하는 HDD는 LU이다.
RAID의 장점
1. 안정성 확보
HDD에 장애가 발생해도 데이터가 손실되지 않도록 데이터 기록을 이중화 한다
2. 성능 향상
여러 개의 HDD를 병렬로 동시에 동작하기 때문에 하나의 HDD를 동작시킬 때보다 I/O 처리 성능이 높아진다.
3. 용량 확장
논리 HDD 이므로 물리적인 한계를 넘어서 자유롭게 용량을 결정할 수 있다.
RAID 구성 패턴
주로 RAID 1, RAID 5, RAID 1+0등이 있다
RAID 5는 이중화 확보를 위해 패리티라는 오류 수정 부호를 분산해서 기록한다. I/O는 스트라이프 크기로 분할돼서 HDD 기록이 동시에 이루어진다.

RAID 1+0은 RAID 1 방식인 미러링 방식(데이터 복제만 한다)과 striping 방식(신뢰도 상관없이 분산 저장)을 합친 방식이다.
RAID 5에서는 패리티 연산이 이루 어지 때문에 I/O 성능이 RAID 1+0에 비해 느리다. 하지만 이중화 부분이 적다(HDD 수 -1) 개의 용량 사용 가능. RAID 1+0은 HDD 전체 용량의 1/2 밖에 사용 못한다
HDD가 고장 나면 이중화했기 때문에 데이터는 망가지지 않지만, 이중화 구조가 망가진다. 따라서 이중화 회복을 위해 핫 스페어라고 하는 디스크를 이용한다.
서버 이중화
프로세스/스레드를 여러 개 가동해서 병렬로 처리한다.
웹 서버를 이중화하는 방법
1. DNS를 이용해서 하나의 호스트 명에 대해 복수의 IP 주소를 반환한다.
이 경우 DNS가 서버 상태를 감시해서 파악하지 않기 때문에 서버가 정지된 경우에도 이 서버의 주소를 반환한다. 또한 DNS가 세션 상태를 파악하지 않기 때문에 다음 접속 시에 동일 서버에 접속해야 하는 경우 부적합하다.
2. 부하분산 장치를 이용하 웹 서버 이중화
부하 분산 장치가 이전에 어느 웹 서버에 요청을 할당했는지 쿠키를 저장하고 있다. 클라이언트 측에서 쿠키 사용을 허가하면 두 번째 이후 접속부터 HTTP 요청 헤더에 쿠키를 저장해서 접속한다. 부하 분산 장치는 이 쿠키를 읽어서 같은 서버에 요청을 할당한다. 이를 통해서 세션의 상태를 저장할 수 있다.
세션 상태 저장을 실현하는 기능을 퍼시스턴스 기능이라고 하고 주요 퍼시스턴스는 소스 IP 주소, 쿠키, URL 등이 있다.
부하분산 장치 할당 알고리즘
라운드 로빈 : 서버 IP 주소에 순서대로 요청을 할당한다
최소 연결 : 활성 세션 수보다 세션 수가 가장 적은 서버의 IP 주소에 요청을 할당한다.
응답 시간 : 가장 부가 적은 서버 IP 주소에 요청을 할당한다
세션 정보 역시 이중화할 수 있다. 세션 정보를 클러스터 내에 다른 서버에 보조로 복제를 하고 서버 장애 시 보조로 쓰인 서버로 리디렉션 한다.
애플리케이션 서버는 DB 서버에 접속 시에 사용할 연결을 사전에 여러 개를 생성하는 연결 폴링 기능을 사용한다.
데이터 베이스 서버 이중화
액티브-스탠바이형
데이터의 일관성을 중시하는 시스템에 적합하며, 액티브는 실제 서비스가 되는 서버이고 스탠바이는 대기하는 서버를 말한다. 서버가 정상 동작하는지 확인하기 위해 하트비트와 투표 장치 같은 기능이 존재한다. 하트비트란 상호 간에 정상 동작을 하는지 확인하기 위해 정보를 공유하는 것이다. 이것을 통해 장애를 감지한다. 만약 하트비트를 통해 상태를 인식 못하는 경우 스플릿 브레인이라고 하는데 이때는 투표 장치를 통해 살아남을 노드를 결정한다.
액티브-액티브 형
일관성보다 확장성을 중시하는 시스템에 적합하다. shared everything 형과 shared nothing 형이 있다. shared everything의 경우 모든 노드가 디스크, 데이터를 공유한다. 이에 반에 shared nothing은 각 노드별로 디스크를 가지고 있으며 데이터가 분산된다.
감시
컴포넌트가 정상 동작하는지 확인하는 기능이다. 대표적으로 생존 감시, 로그(에러) 감시, 성능 감시가 있다.
생존 감시 - ping 명령을 정기적으로 실행 해서 서버 인터페이스에 대한 통신을 확인하는 감시이다
로그 감시 - 로그의 내용을 선별해서 중요한 로그 정보 일 때 메시지를 보내는 것
성능 감시 - 리소스 상태 파악이나 네트워크 응답 상태 파악하는 것
백업
데이터를 복제해서 별도 장소에 보관하는 것. 복구 지표를 정해서 백업을 설계해야 한다.
RTO(복구 목표 시간)과 RPO(복구 기준 시점) 이 있다.