프로그램 개발/미분류

[코딩 인터뷰]개념과 알고리즘 - 시스템 설계 및 규모 확장성

(ㅇㅅㅎ) 2023. 1. 2. 13:54
728x90
반응형

 

[ 문제를 다루는 방법 ]

  • 면접관과 소통
  • 처음에는 포괄적으로 접근
  • 종이를 사용하여 계획 및 설명
  • 면접관이 우려하는 부분을 인정
  • 가정 시 주의
  • 가정을 명확히 언급
  • 필요하다면 어림잡아 보기
  • 적극적으로 문제 해결하기

 

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

  1. 문제의 범위를 한정
  2. 합리적인 가정을 만들기
  3. 중요한 부분을 먼저 생각하기
  4. 핵심 문제점을 파악하기
  5. 핵심 문제점을 해결할 수 있도록 다시 설계하기

 

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

  1. 질문하기
  2. 현실적 제약을 무시하기
  3. 현실적 제약에 적용하기
  4. 문제를 풀기

 

[ 시스템 설계의 핵심 개념 ]

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

  • 수직적 규모 확장 : 특정 노드의 자원의 양을 늘리는 방법
    ex) 서버에 메모리 추가하여 서버의 처리 능력 향상
  • 수평적 규모 확장 : 노드의 개수를 늘리는 방법
    ex) 서버를 추가함으로써 서버 한 대가 다뤄야 하는 부하를 줄이는 것

 

👀 서버 부하 분산 장치(Load balancer)

: 서버에 걸리는 부하를 여러 대의 서버에 균일하게 분산시켜서 서버 한 대 때문에 전체 시스템이 죽거나 다운되는 상황을 방지할 수 있습니다. 물론 이렇게 하기 위해선 서버 여러 대가 근본적으로 똑같은 코드와 데이터를 사용하도록 하는 네트워크를 구현해야 합니다.

 

👀 데이터베이스 역정규화

: 데이터베이스에 여분의 정보를 추가해서 읽기 연산 속도를 향상시킨 것입니다.

⭐ SQL과 같은 관계형 데이터베이스의 join 연산은 시스템이 커질수록 굉장히 느려지기 때문에 가능하면 피해야 하고 추가 정보를 입력하는 역정규화를 사용합니다.

 

[ 데이터베이스 분할(샤딩) ]

👀 샤딩

: 데이터를 여러 컴퓨터에 나눠서 저장하는 동시에 어떤 데이터가 어떤 컴퓨터에 저장되어 있는지 알 수 있는 방식입니다.

  • 수직적 분할 : 기본적으로 자료의 특성별로 분할하는 방식
  • 키 혹은 해시 기반 분할
  • 디렉터리 기반 분할

 

👀 캐싱

: 인메모리(in-memory) 캐시를 사용하면 결과를 굉장히 빠르게 가져올 수 있습니다. 인메모리 캐시는 키-값(key-value)을 쌍으로 갖는 간단한 구조로써 일반적으로 애플리케이션과 데이터 저장소 사이에 자리 잡고 있습니다.

 

👀 네트워크 성능 척도

  • 대역폭 : 단위 시간에 전송할 수 있는 데이터의 최대치
  • 처리량 : 단위 시간에 실제로 전송된 데이터의 양
  • 지연 속도 : 데이터를 전송하는데 걸리는 시간(발송자가 데이터를 보낸 시점부터 수신자가 데이터를 받는 시점까지 걸린 시간)

 

👀 MapReduce

: 크기가 아주 큰 데이터를 처리하는 시스템을 설계할 때 널리 사용됩니다.

  1. 시스템이 데이터를 여러 서버에 나눕니다.
  2. 각 서버는 사용자가 제공한 Map 프로그램을 실행합니다.
  3. Map 프로그램은 데이터를 입력으로 받은 뒤 <key, value> 쌍을 반환합니다.
  4. 시스템이 제공하는 Shuffle 프로세스는 키값이 같은 모든 쌍을 한 서버에 보내서 Reduce를 실행할 수 있도록 데이터를 재배치합니다.
  5. 사용자가 제공한 Reduce 프로그램은 키와 값을 통해 데이터를 어떤 방식으로든 '줄이고', 새로운 키와 값을 반환합니다. 데이터를 더 줄이기 위해 해당 결과가 또 다른 Reduce 프로그램으로도 보내질 수도 있습니다.

 

[ 시스템 설계 시 고려할 점 ]

  • 실패
    : 시스템의 어떤 부분이든 실패 가능성이 존재하기 때문에 대비책을 미리 준비해야 합니다.
  • 가용성 및 신뢰성
    가용성 : 사용 가능한 시스템의 시간을 백분율로 나타낸 것
    신뢰성 : 특정 단위 시간에 시스템이 사용 가능할 확률을 나타낸 것
  • 읽기 중심 vs 쓰기 중심
    읽는 연산이 많은지 쓰는 연산이 많은지에 따라 설계 방식이 달라질 수 있습니다.
  • 보안

 

[ '완벽한' 시스템은 없다 ]

 어떠한 시스템도 완벽하게 동작하는 시스템 설계란 존재하지 않습니다. 그러나 모든 시스템에는 장단점이 존재함으로 서로 다른 상황에서 굉장한 성능을 낼 수 있습니다. 이러한 문제를 받았을 때 사례를 잘 이해하고 문제의 범위를 설정하고, 합리적인 가정을 세운 뒤, 명확하게 설계한 시스템을 만드는 것이 중요합니다. 그리고 제일 중요한 것은 시스템의 약점에 대해 열린 마음으로 받아들일 수 있는 점 또한 필요합니다.

반응형