VioletaBabel

시스템 설계 및 규모 확장성 본문

기본개념/알고리즘공부
시스템 설계 및 규모 확장성
Beabletoet 2017. 9. 14. 13:38

문제를 다루는 방법


1. 소통하라 : 시스템 설계 문제는 의사소통 능력을 평가하기 위함이므로 끊임없이 의사소통하도록 한다. 질문을 던지고 발생할 수 있는 문제점을 열린 마음으로 받아들여라.


2. 처음엔 포괄적으로 접근하라 : 알고리즘으로 바로 뛰어들지 말라. 한 부분만 과도하게 파고들지 마라.


3. 화이트보드를 사용하라 : 내가 제안하는 그림을 그리며 설명하라.


4. 면접관이 우려하는 부분을 인정하라 : 면접관이 짚은 문제점을 인정하고 적절하게 수정하라.


5. 가정을 할 때 주의하라 : 잘못된 가정을 주의하라.


6. 가정을 명확히 언급하라 : 내가 실수를 했을 때 바로잡아줄 수도 있고, 내가 어떤 가정을 했는지를 다른 사람들도 알 수 있게 해준다.


7. 필요하다면 어림잡아 보라 : 내가 알고 있는 다른 데이터를 이용해 크기를 어림잡아 볼 수 있다.


8. 뛰어들라 : 반드시 면접관과 이야기도 나눠야 하고, 동시에 문제도 풀어내야 한다. 질문을 하고 장단점을 열린 마음으로 받아들이며 계속해서 파고들어라.



--

시스템 설계 : 단계별 접근법


1단계 : 문제의 범위를 한정하라

정확히 무엇을 구현해야 하는지를 알아야 문제의 범위를 한정시킬 수 있다.



2단계 : 합리적인 가정을 만들라

가정을 세우는 것도 괜찮지만 합당해야 한다.



3단계 : 중요한 부분을 먼저 그려라

시스템의 주요한 부분을 다이어그램으로 그려라.

시스템이 처음부터 마지막까지 어떻게 동작하는지 흐름을 보여라.



4단계 : 핵심 문제점을 찾으라

어느 부분이 병목지점인지, 이 시스템이 풀어야 할 주된 문제는 무엇인지를 알아야 한다.

이 부분에 대해 가이드를 해준다면 그 조언을 받아들이고 시스템에 적용하라.



5단계 : 핵심 문제점을 해결할 수 있도록 다시 설계하라

핵심 문제를 알았다면 시스템 전체를 갈아 엎거나 몇몇 자잘한 부분을 수정하여 해결하여야 한다.

다이어그램을 바뀐 설계에 맞게 수정하라.

내가 알고있는 제약 사항에 대해 면접관과 이야기하는 것도 중요하다.



--

규모 확장을 위한 알고리즘 : 단계별 접근법


1단계 : 질문하라

문제를 제대로 이해했는지 확인하기 위한 질문 시간이 필요하다.

언급되지 않은 세부사항이 있을 수도 있으니 문제를 무엇인지 확실히 이해하라.



2단계 : 현실적 제약을 무시하라

메모리 제약이 없고, 컴퓨터 한 대에서 모든 데이터를 다 처리할 수 있다고 가정해보라.

이게 정답의 윤곽을 그리는 데에 도움이 될 것이다.



3단계 : 현실로 돌아오라

컴퓨터 한 대에 저장할 데이터의 크기는 얼마나 되고, 데이터를 쪼갰을 때 어떤 문제가 발생할 지 생각하라.

어떻게 데이터를 나누고 어떤 데이터 조각을 어떤 컴퓨터가 가지고 있는지 어떻게 알 수 있을 것인가.



4단계 : 문제를 풀어라

앞에서 발생할 문제점들을 어떻게 해결할지 생각하라.

순환적 접근법을 활용하라. 3단계에서 문제를 발견하면 그 문제를 해결해나가고 또 문제를 찾고 해결해나감을 반복하라.



--

시스템 설계의 핵심 개념


수평적(horizontal) vs 수직적(vertical) 규모 확장

1. 수직적 규모 확장 : 특정 노드의 리소스 양을 늘리는 방법. ex)서버에 메모리를 추가해 처리 능력 향상

2. 수평적 규모 확장 : 노드의 개수를 늘림 ex)서버를 추가해 한 대마다 다루는 부하량을 줄임



서버 부하 분산 장치(load balancer)

규모 확장성이 있는 웹사이트의 프론트앤드 부분은 서버 부하 분산 장치를 통해 제공된다.

서버에 걸리는 부하를 여러 대의 서버에 균일하게 분산하기 위함이다.

이렇게 하기 위해서는 서버 여러 대가 근본적으로 똑같은 코드와 데이터를 사용하도록 하는 네트워크를 필요로 한다.



데이터베이스 역정규화

SQL의 조인 연산은 시스템이 커질수록 느려지므로 역정규화로 읽기 연산 속도를 향상시킨다.



--

데이터베이스 분할(샤딩:sharding)

데이터를 여러 컴퓨터에 나눠서 저장하고, 어떤 데이터에 어떤 컴퓨터에 있는지 알 수 있는 방식


수직적 분할 : 자료의 특성 별로 분할. 단점은 특정 테이블의 크기가 일정 수준 이상으로 커지면 DB를 재분할해야 할 수 있음.

키 혹은 해시 기반 분할 : mod(key, n)의 값을 이용해 N개의 서버에 분할 저장. 문제점은 서버의 개수가 고정되어 있어야 한다. 서버를 새로 추가할 때마다 모든 데이터를 다시 재분배하는, 비용이 큰 작업을 요구한다.

디렉토리 기반 분할 : 데이터를 찾을 때 사용되는 조회 테이블(lookup table)을 유지하는 방법. 상대적으로 서버를 추가하기 쉬우나 테이블을 읽는게 전체 성능에 영향을 줄 수 있고 조회 테이블이 단일 장애 지점이 될 수 있다.


캐싱(caching) : 인메모리 캐시를 사용하면 결과를 빠르게 가져올 수 있다. 인메모리 캐시는 키와 값이 쌍으로 이루어진 간단한 구조이다. 데이터가 필요하면 우선 캐시를 확인하고, 캐시에 없으면 데이터 저장소를 확인한다.


비동기식 처리 & 큐 : 속도가 느린 연산은 비동기식으로 처리해야 한다. 그리고 연산을 미리 해서 큐에 넣어둘 수도 있다.


네트워크 성능 척도

1. 대역폭 : 단위 시간에 전송할 수 있는 데이터의 최대치

2. 처리량 : 단위 시간에 실제로 전송된 데이터의 양

3. 지연 속도 : 데이터를 전송하는 데 걸리는 시간



--

시스템 설계 시 고려할 점

1. 실패 : 시스템의 어떤 부분이든 실패 가능성이 존재하고, 각 부분이 실패했을 때의 대비책을 준비해야 한다.

2. 가용성 : 사용 가능한 시스템의 시간을 백분율로 나타낸 것

3. 신뢰성 : 특정 단위 시간에 시스템이 사용 가능할 확률

4. 읽기 중심 vs 쓰기 중심 : 읽는 연산이 많은지 쓰는 연산이 많은지에 따라 설계가 달라진다.

5. 보안 : 보안 위협은 시스템에 엄청난 해를 가할 수 있다.



'기본개념 > 알고리즘공부' 카테고리의 다른 글

테스팅  (0) 2017.09.15
정렬과 탐색  (0) 2017.09.14
객체 지향 설계  (0) 2017.09.13
비트 조작  (0) 2017.09.11
그래프  (0) 2017.09.09
Comments