* 확장의 종류
1) 수직적 확장 (Scale-Up)
- RAM, CPU 등의 주요 리소스를 추가적으로 더 할당하여, 성능을 확보하는 확장의 방법
- 서비스의 규모가 작고, 트래픽양이 적은 경우 적합
[장점]
- 서버 관리가 상대적으로 용이함
- 가장 쉽고 간단한 확장 방법
[단점]
- 수직적 확장에는 한계가 있음 (물리적으로 서버의 리소스가 올라갈 수 있는 한계가 있음)
- 장애에 대한 자동복구(failorver), 다중화(re-dundancy) 전략을 제시하지 못함, 서버에 장애가 발생하면
전체 서비스가 중단됨.
2) 수평적 확장 (Scalue-Out)
- 동일한 역할을 하는 서버를 추가로 배치하여, 요청을 분산 처리하여 성능을 확보하는 확장의 방법
- 서비스의 규모가 크고, 트래픽양이 많은 경우 적합
[장점]
- 확장의 한계가 없음 (여유가 되는 대로 서버를 계속 증설하면 됨)
- 장애에 대한 자동복구(failover), 다중화(re-dundancy) 전략이 다양함, 특정 서버에 장애가 발생해도 전체 장애로
이어지지 않으며 서비스를 지속적으로 제공할 수 있음.
[단점]
- 서버 관리가 상대적으로 여려움 (많은 서버를 동시에 관리해야 하므로)
1) 단일 서버
[장점]
- 작은 규모의 시스템 구성.
- 웹, 앱, 데이터베이스, 캐시 등 모든 구성들이 단 한 개의 서버에 구성됨
- 적은 비용과 빠른 시스템 구성이 가능함
[단점]
- 사용자 수 가 늘어남에 따라 단일 서버로 서비스를 운영하기 힘든 상황이 오게 됨.
- 특정 영역(앱, 데이터베이스, 캐시)에서 장애가 발생했을 시, 전체 장애로 퍼질 가능성이 매우 높음
- 특정 영역에 대한 규모의 확장이 어려움 (ex: 데이터베이스 성능을 높이기 위해, 메모리 또는 CPU를 올리고 싶은 경우)
2) 서비스 서버와 데이터베이스 서버의 분리
[장점]
- 서비스 서버와 데이터베이스 서버로 시스템을 분리하는 경우, 각각의 영역을 필요에 따라 효과적으로 확장할 수 있다.
[단점]
- 기존의 단일 서버 구성과 달리 데이터베이스 서버를 하나 더 운영하므로, 운영비용이 더 들게 된다.
* 어떤 데이터베이스를 사용해야 하는가?
RDBMS - 데이터의 정합성이 중요하고, 다루는 데이터가 정형적(structured)일 때
NoSQL - 낮은 응답 지연시간(latency)이 요구되는 경우, 다루는 데이터가 비정형적(unstructured)일 때, 데이터를 직렬화(Serialize)하거나 역직렬화(deserialize)하기만 하면 될 때, 아주 많은 데이터를 저장할 필요가 있을 때
3) 로드밸런서
- 로드밸런서는 부하 분산 집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 수행
[장점]
- 수평적 확장을 사용하는 경우 로드 밸런서를 통해, 자동복구(failover)를 지원하게 되며 웹 계층의
가용성 (availability)는 향상됨
- 특정 서버가 다운되면, 해당 서버로 가는 트래픽을 다른 서버로 분배해주면 해결됨
- 갑자기 트래픽이 몰리는 경우, 우리는 신규 서버만 추가해주면 큰 트래픽을 로드밸런서가 알아서
트래픽을 분산해서 웹 서버 계층 서버에 전달함
4) 데이터베이스 다중화
- 통상 많은 데이터베이스 관리 시스템 (DBMS)가 다중화를 지원한다
- 보통 서버 사이에 주(Master) - 부(Slave) 관계를 설정하고 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식
- 쓰기 (Write) 연산은 주(Master) 서버에서만 지원하고, 부(Slave) 서버는 읽기만 지원한다
(ex: insert, update, delete -> 주 서버, select -> 부 서버)
- 대부분의 애플리케이션은 쓰기 연산보다 읽기 연산의 비중이 높음, 따라서 통상적으로 부(Slave) 서버의 수가 더 많다
[장점]
- 주-부 다중화 모델에서 각 연산(쓰기(insert, update, delete), 읽기(select))이 분산되므로 더 나은 성능을 보장한다
- 자연재해 등 여러 이유로 데이터베이스 서버 가운데 일부가 파괴되어도 데이터는 보존이 됨, 지역적으로 떨어진
장소에 다중화가 가능하기 때문
- 데이터를 여러 지역에 복제해 둠으로, 하나의 데이터베이스에서 장애가 발생해도 다른 데이터베이스 서버에서
데이터를 가져오면 되므로 높은 가용성을 보장함
* 부 서버(Slave)가 다운된 경우
- 부 서버가 한 대 라면, 일시적으로 부 서버로 가던 읽기 연산이 주 서버로 가게 되고, 즉시 새로운 부 데이터베이스 서버가 장애 서버를 대체할 것임
- 부 서버가 여러 대인 경우 읽기 연산은 나머지 부 데이터베이스 서버로 분산되어 처리될 것이며, 새로운 부 데이터베이스가 장애 서버를 대체할 것임
* 주 서버(Master)가 다운된 경우
- 한 대의 부 데이터베이스만 있는 경우 해당 부 데이터베이스가 주 데이터베이스로 승격되어
일시적으로 읽기, 쓰기 연산을 모두 처리하며, 새로운 주 데이터베이스 서버가 장애 서버를 대체하면 쓰기 연산은
새로운 주 데이터베이스에서만 이루어진다
- 여러 대의 부 데이터베이스가 있는 경우, 특정 한 대의 부 데이터베이스가 주 데이터베이스로 승격되고 쓰기 연산은 승격된 주 데이터베이스에서 이루어지다가, 새로운 주 데이터베이스가 장애 서버를 대체하면 새로운 주 데이터베이스에서만 쓰기 연산을 수행하고 이전에 승격된 주 데이터베이스 서버는 다시 부 데이터베이스로 변경이 되어 읽기 연산만 수행한다
* 장애 상황에서 부 서버에 보관된 데이터가 최신이 아닌 경우
- 데이터 복구 스크립트를 돌려서 누락된 데이터를 추가한다
- 다중 마스터 또는 원형 다중화 방식을 도입하여 데이터의 최신성을 보장한다
출처
http://www.yes24.com/Product/Goods/102819435
'Programming > Infra & Architecture' 카테고리의 다른 글
[네트워크 기본] OSI 7계층 & TCP/IP Model (0) | 2022.04.25 |
---|---|
[DevOps] 로그 수집 및 모니터링 시스템 - Sentry (1탄) (2) | 2019.06.10 |
Elasticsearch 설치 - 우분투(Ubuntu 16.04.1 LTS) (0) | 2017.06.29 |