Home Data Intensive Application - 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 어플리케이션
Post
Cancel

Data Intensive Application - 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 어플리케이션

데이터 시스템

일반적으로 오늘날의 데이터 중심 어플리케이션들은 아래와 같은 부분들을 필요로 한다.

  • 데이터 수집 및 저장(데이터베이스)
  • 읽기 속도 향상을 위해 결과 기억(캐시)
  • 사용자가 키워드로 데이터를 검색 하거나 필터링할 수 있게 제공(검색 색인(search index))
  • 비동기 처리를 위해 다른 프로세스로 메세지 전송(스트림 처리(stream processing))
  • 주기적으로 대량의 누적된 데이터 분석(일괄 처리(batch processing))

대부분의 소프트웨어 시스템에서는 아래와 같은 세가지 관심사가 존재한다.

  • 신뢰성(Reliability)
    • 하드웨어나 소프트웨어 결함, 심지어 휴먼 에러와 같은 상황이더라도 시스템은 지속적으로 동작해야 함
  • 확장성(Scalability)
    • 시스템의 데이터 양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 함
  • 유지보수성(Maintainability)
    • 시간이 지남에 따라 여러 사람들이 시스템 상에서 작업하므로, 모든 사용자가 시스템 상에서 생산적으로 작업할 수 있어야 함

신뢰성(Reliability)

잘못 될수 있는 일을 결함(fault) 이라 부른다. 그리고 결함을 예측하고 대처할 수 있는 시스템을 내결함성(fault-tolerant) 또는 탄력성(resilient) 을 지녔다고 말한다.

결함은 장애(failure) 와 동일하지 않다. 일반적으로 결함은 사양에서 벗어난 시스템의 한 구성요소로 정의되지만, 장애는 사용자에게 필요한 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우을 말한다. 결함 확률을 0으로 줄이는 것은 불가능 하므로 보통 결함으로 인한 장애가 발생하지 않게끔 내결함성 구조를 설계하는 것이 가장 좋다.

확장성(Scalability)

확장성은 증가하는 부하에 대처하는 시스템 능력을 성멸하는데 사용하는 용어지만 시스템에 부여하는 일차원적인 표식은 아니다. 즉, “시스템이 특정 방식으로 커지면 이에 대처하기 위한 선택은 무엇인가? 추가 부하를 다루기 위해 계산 자원을 어떻게 투입해야 하는가?” 와 같은 질문을 고려한다는 의미이다.

확장성을 기술하기 위해선 먼저 시스템의 현재 부하를 기술해야한다. 그래야 부하 성장 질문(현재 시스템에서 부하가 두배로 되면 어떻게 되는가?)을 논의할 수 있다.

부하는 부하 매개변수(load parameter) 라 부르는 몇개의 숫자로 나타낼수 있으며 아래와 같은 수치들을 부하 매개변수로 불수 있다.

  • 웹 서버의 초당 요청수
  • 데이터베이스의 읽기 대 쓰기 비율
  • 대화방의 동시 활성 사용자(active user)
  • 캐시 적중률

성능 기술하기

하둡과 같은 일괄처리 시스템은 보통 처리량(throughput)(초당 처리할 수 있는 레토드수나 일정 크기의 데이터 집합으로, 작업을 후행할 때 걸리는 전체 시간) 에 관심을 가지고, 일반적인 온라인 시스템에서 더 중요한 사항은 서비스의 응답 시간(response time). 즉 클라이언트가 요청을 보내고 응답을 받는 사이의 시간이다.

클라이언트가 몇번이고 반복해서 동일한 요청을 보내더라도 실제로 다양한 요청을 다루는 시스템에서의 응답시간은 많이 변하므로 응답 시간은 단일 숫자가 아니라 측정 하능한 값의 분포 로 생각해야 한다.

1-2

일반적으로는 평균 응답시간 보다는 백분위(percentile) 을 사용하는 편이 좋다. 응답 시간 목록을 가지고 가장 빠른 시간부터 제일 느린 시간까지 정렬하면 중간 지점인 중앙값(median) 이 되며 이는 사용자가 보통 얼마나 오랫동안 기다려야 하는지 알수 있는 좋은 지표가 된다.

부하 대응 접근 방식

사람들은 확장성과 관련해 용량 확장(scaling up)(수직 확장(vertival scaling))규모 확장(scaling out)(수평 확장(horizontal scaling)) 으로 구분해서 말한다.

특정 어플리케이션에 적합한 확장성을 갖춘 아키텍처는 주요 동작이 무엇이고 잘 하지 않는 동작이 무엇인지에 대한 가정을 바탕으로 구축한다. 이 가정은 곧 부하 매개변수가 된다. 이 가정이 잘못되면 확장에 대한 엔지니어링 노력은 헛수고가 되고 오히려 역효과를 낳을수도 있다.

유지보수성(Maintainability)

유지보수를 위해 주의를 기울여야 할 소프트웨어 시스템 설계 원칙은 다음 세가지 이다.

  • 운용성(operability)
    • 운영팀이 시스템을 원활하게 운영할 수 있게 쉽게 만들어야 함
  • 단순성(simplicity)
    • 시스템에서 복잡도를 최대한 제거하여 새로운 개발자가 시스템을 이해하기 쉽게 만들어야 함
  • 발전성(evolvability)
    • 개발자가 이후에 시스템을 쉽게 변경할 수 있도록 만들어야 함

참고

  • Data Intensive Application - Martin Kieoomann
This post is licensed under CC BY 4.0 by the author.

LeetCode - 620. Not Boring Movies

Programmers - 키패드 누르기