본문 바로가기

카테고리 없음

요즘 개발자를 위한 시스템 설계 수업 chap. 01, 02, 03

chap01.시스템 설계의 정의

 

소프트웨어 시스템은 특정 작업이나 일련의 작업을 수행하려고 함께 동작하는 컴포넌트를 말함.

분산 소프트웨어 시스템은 각 구성요소가 소프트웨어 시스템적 특징을 가지며 모든 구성요소는 어떤 특정한 공통 목표를 위해 네트워크를 통해 연결되어 있음.

 

시스템 설계는 소프트웨어 시스템과 분산 소프트웨어 시스템의 아키텍쳐, 컴포넌트 모듈, 인터페이스 및 상호작용을 정의 하며 기능적,비기능적 요구사항을 채우는 과정이다. -> 요구사항을 시스템구조, 구현, 유지보수 방식을 설명하는 청사진인나 계획으로 변환하는 작업이다.

 

시스템 설계를 진행하는 일반적인 과정

1. 요구사항 분석

2. 상위 수준의 아키텍쳐 설계 - 시스템 아키텍쳐, 데이터 흐름, 확장성, 장애 허용 시스템 등을 고려하여 설계

3. 하위 수준의 상세 설계 - 알고리즘, 데이터구조(자료구조), API, 코드 최적화 등을 고려하여 설계

4. 사용자 인터페이스 설계 

5. API 설계

6. 데이터 베이스 설계

 

 

chap.02 분산 시스템의 속성

 

분산 시스템의 속성을 한단어로 요약하면 다중성이라고 생각한다. 다중으로 서버, db등을 운용하여 가용성을 포함한 여러 속성들을 이어갈 수 있다.

 

분산 시스템의 일반적인 속성 8가지

 

- 일관성 : 분산된 서버와 db들이 일관된 데이터 상태를 유지하는가에 초점이 맞춰져 있다. 강한 일관성, 최종 일관성으로 나뉜다. 강한 일관성은 순차처리(낙관적 락), 최종 일관성은 마지막엔 결과가 같다(비관적 락)의 개념으로 보였다. 

- 가용성 : 사용자 경험면에서 시스템 장애나 오류시에도 지속적으로 서비스를 제공할 수 있는 능력. 다중화, 복제(레플리케이션), 로드 밸런싱, 장애 감지 및 복구, 장애 전환 및 복귀 등의 방식들이 있다.

- 파티션 허용성 - 네트워크 파티셔(연결이 어떤 이유로 중단되는 상황)이 발생하더라도 시스템이 계속 정상적으로 작동할 수 있는 능력. 이도 가용성에 관련된 특성이다.

- 지연 시간 - 분산 시스템에 들어온 요청에 대한 응답이 돌아오기 까지 걸리는 시간. 네트워크 최적화, 캐싱, 데이터 지역화, 비동기 통신, 성능 튜닝 등의 방법론을 통하여 단축이 가능하다. 지연시간에만 집중하다보면 일관성이나 장애 허용성이 꺠질 수 있으므로 균형을 잘 잡아야한다.

- 내구성 - 오류가 발생하더라도 데이터 손실이 일어나지 않게 하는 속성. 내구성을 키우려고 분산 데이터를 늘리면 일관성을 유지하는 시간이 올라가기도 한다. 내구성, 일관성, 가용성 등을 종합적으로 고려하는 것이 필요함.

- 신뢰성 - 여러 문제가 발생해도 시스템이 원래 기능을 꾸준히 제공할 수 있는 능력. 다중화, 복제, 로드밸런싱 등을 통해 신뢰성 확보가 가능하다.

- 장애 허용성 - 분산 시스템에 장애요소가 생겨 일부가 고장나더라도 시스템이 정상적으로 작동을 할수 있도록 하는 속성, 장애 탐지 하고 복구할 수 있도록 설계하고 구현하는 것을 포함하여 사람이 없이도 문제 해결이 가능하도록 만듬.

- 확장성 - 수직적 확장, 수평적 확장으로 나눌 수 있다. 수직적 확장은 더 좋은 부품등으로 교체하여 더 많은 처리를 할 수 있도록하는 방법이다. 수평적 확장은 동일한 스펙의 인스턴스들의 개수를 확장하여 처리를 분산하여 나누는 방식이다.

 

chap 03.  분산 시스템의 이론과 데이터 구조

 

01 - 가용성이냐 일관성이냐

CAP 정리 : 일관성, 가용성, 장애허용을 모두 만족하는 분산 시스템은 없다.

PACELC 정리 :  CAP 정리에 Etc(그외 조건)을 추가한 정리 장애 발생시에 가용성과 일관성 택일, 장애 아닐시에 지연성과 일관성 중 택일

02 - 일관성을 위한 합의 알고리즘들

팩소스 알고리즘 

1. 제안자가 고유 번호를 생 성후 수용자들에게 준비 요청을 보냄

2. 수용한 제안 목록을 응답으로 반환(더 높은 제안 번호가 있으면 해당 제안 거부)

3. 반복하며 수용자가 제안을 수용하면 합의가 됨.

래프트 알고리즘

1.추종자가 리더를 찾거나 없으면 새로운 선거 주기임을 확인

2.시간 초과시, 새로운 리더 선출 시작

3.후보자가 추종자에게 투표 요청시 시간 초과하면 다시 1로 돌아감.

4. 추종자의 과반 수 이상 표를 받으면 리더로 승격

5. 리더가 더 높은 임기를 가진 서버를 찾으면 추종자로 돌아감

비잔티움 장군 문제

장군들이 있는데 서로 메시지를 통해서만 의사소통이 가능함.

요구사항

- 충성스러운 장군이 과반수를 넘을 경우 합의에 도달

- 전체 장군이 N일인데 배신자수가 F라면 배신자가 있어도 합의가 가능해야함.

(단 F < (N-1)/2)

- 충성스러운 장군들이 합의를 내리는 데 적장한 시간이 필요하며, 즉각적으로 합의는 할 수 없다.

FLP 불가능성 정리 - 장애 허용성을 하는 한 일관성과 가용성 모두 충족할 수 없다. 장애 허용성이냐 아니면 합의 상태, 종료 상태만 있을 뿐이다. (합의가 매우 어렵다)

03 - 데이터 빨리 찾기 분산?

일관된 해싱 - 시스템이 어디 하나 고장나더라도 빠르게 다른 곳으로 데이터 트래픽을 분배가 가능하다.

블름 필터 - 해싱 + 비트 배열로 문자열의 존재 여부를 빨리 찾을 수 있음. 단 거짓 양성 가능성이 있다. (거짓 양성은 실제로 존재할 수도 있고 아닐 수도 있지만 해싱값이 겹치므로 존재하는지 안하는지 정확하지 않은 상태)

카운트 민 스케치 - 데이터 빈도를 근사치로 표현하지만 카운터를 늘리면 정확도는 올라가고 메모리 사용량은 증가함. 해시함수를 더 많이 사용하면 정확도는 올라가지만 계산비용이 추가로 발생.

하이퍼 로그로그 - 아주 큰 값을 해시로 표현하고 비트로 바꿨을때 마지막 0비트들을 로그2로 바꿔서 근사값을 세는 방법