데이터 중심 애플리케이션 설계
목차
01장. 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션
요즘 애플리케이션은 계산 중심(compute-intensive)보다는 데이터 중심(data-intensive) 애플리케이션이 대다수이다.
더이상 CPU 성능이 애플케이션을 제한하는 요소가 아니다. 더 큰 문제는 데이터의 양, 데이터의 복잡도, 데이터의 변화 속도이다.
일반적으로 데이터 중심 애플리케이션은 공통으로 다음과 같은 것들을 필요로 한다.
•
나중에 다시 데이터를 찾을 수 있게 데이터를 저장하는 데이터베이스(database)
•
읽기 속도 향상을 위해 값비싼 수행 결과를 기억하는 캐시(cache)
•
사용자가 키워드로 데이터를 검색하거나 다양한 방법으로 필터링할 수 있게 제공해주는 검색 색인(search index)
•
비동기 처리를 위해 다른 프로세스로 메시지를 보내는 스트림 처리(stream processing)
•
주기적으로 대량의 누적된 데이터를 분석하는 일괄 처리(batch processing)
우리가 이런 시스템을 사용하려고할 때, 저장소 엔진을 어떻게 만들지 고민하지 않는다.
그 이유는 이런 시스템들을 제공하는 것들이 추상화가 너무 잘 되어있기 때문이다. 그래서 잘 ‘활용’만 하면된다.
하지만 현실은 그리 쉽지 않다.
단 하나의 도구만으로 충족할 수 없는 상황들이 많아 여러 애플리케이션을 결합해서 활용해야만 한다.
그러나 각 애플리케이션마다 요구사항이 다르고 다양한 특성들을 가지고 있기 때문에, 어떤 접근 방식을 취하냐에 따라 적합한 애플리케이션들이 다르다.
이번 장에서는 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 데이터 시스템을 구축하기 위한 기초적인 노력을 살펴보는 것으로 시작한다.
신뢰성, 확장성, 유지보수성의 의미를 명확히 알고 이를 고려하는 몇 가지 방법을 개략적으로 알아보고자 한다.
신뢰성(Reliability)
“무언가 잘못되더라도 지속적으로 올바르게 동작함”을 보장하는 것이 신뢰성이라고 할 수 있다.
잘못될 수 있는 일을 결함(fault)라고 부른다. 그리고 결함을 예측하고 대처할 수 있는 시스템을 내결함성(fault-tolerant) 또는 탄력성(resilient)을 지녔다고 말한다.
다음은 각 결함에 대해 신뢰성을 보장하기 위한 방법을 알아본다.
하드웨어 결함
하드웨어 결함으로 인해 시스템 장애가 일어나는 경우 이를 해결하기 위해서 각 하드웨어 구성 요소에 중복(redundancy)을 추가하는 방법이 있다.
소프트웨어 오류
또 다른 부류의 결함으로 시스템 내 체계적 오류가 있다. 이 결함은 쉽게 말해 OS 수준에서 발생하는 장애를 말한다.
이 경우 신속한 해결책이 없다. 주의깊게 고려하고 테스트하고 측정하고 모니터링을 하며 대응해야 한다.
인적 오류
사람이 미덥지 않음에도 시스템을 신뢰성있게 만들려면 다음을 준수해야 한다.
•
오류의 가능성을 최소화하는 방향으로 시스템을 설계하라
•
사람의 실수로 장애가 발생할 수 있는 부분을 분리하라
•
장애 발생의 영향을 최소화하기 위해 인적 오류를 빠르고 쉽게 복구할 수 있게 하라
•
성능 지표와 오류율 같은 상세하고 명확한 모니터링 대책을 마련하라
•
조작 교육과 실습을 시행하라 (이 항목의 경우 잘 이해하지 못했다.)