Skip to main content
람다 아키텍처,
더 깊이 살펴보기
최용호
질의(query) 시 신경써야할 속성들
● 지연시간(latency)
○ 질의를 실행하는 데 걸리는 시간
○ 경우에 따라 허용할 수 있는 지연시간이 다름
■ 밀리초에서부터 시간까지 다양
● 적시성(timeliness)
○ 질의의 결과가 얼마나 최신인지
○ 경우에 따라 허용할 수 있는 누락 범위가 다름
■ 완벽한 적시성을 요구
■ 최근 몇 분이나 몇시간 정도의 누락은 허용
● 정확성(accuracy)
○ 완벽히 정확
■ 데이터 집합의 크기가 작거나 머신 성능이 좋은 경우
○ 근사치
■ 성능이 받쳐주지 못하는 경우
내결함성
● 장애가 발생했을 때의 대책
● 데이터를 일관성있게 할 것인지 가용성 있게 할 것인지 양자택일
○ 일관성 : 질의가 기존에 기록된 모든 데이터를 반영
■ 최신 데이터를 모두 반영
○ 가용성 : 질의가 즉시 응답
■ 일부 데이터가 누락되더라도 지연시간을 제한
● 사람은 온갖 종류의 실수를 하기 때문에 인적 내결함성을 갖추는 것이 지극히
중요!
불변성(immutability)
● 가변성(mutability)가 존재한다는 것은 사람이 데이터를 변경할 수 있다는 것을
의미
○ 언제든 사람이 데이터를 오염시킬 수 있음
● 유일한 해결책은 핵심 데이터가 불변성을 지니게 하는 것
○ 데이터를 삭제하거나 변경하지 못하게 함
○ 데이터 집합은 추가만 가능하므로 계속해서 커지기만 함
○ 이로 인해 데이터의 오염을 방지할 수 있어서 시스템이 견고해짐
람다아키텍처는 최소한의 희생으로 지속적으로 증가하는 불변 데이터 집합에 대한
함수로 질의가 처리되는 이상적인 모습을 달성할 수 있도록 한다.
데이터 추가의 한계
● 수 테라바이트만 되더라도 질의가 몇 초내로 응답이 오길 기대하기 어려움
● 이를 가능하게 하기 위해서는 그만큼의 자원과 비용이 소비됨
● 해결하기 위한 가장 간단한 방법은 사전계산 뷰를 만드는 것
○ 질의를 마스터 데이터 집합에 대해 직접 실행하는 대신 사전 계산된 뷰에 대해 실행
이 부분을 람다아키텍처에서는 일괄처리 계층(batch layer)이라고 부름
일괄처리 계층
● 색인된 뷰를 만들어 내는 것이 목표
● 뷰는 질의를 짧은 지연시간 내에 처리하기 위해 색인됨
● 뷰의 색인과 서빙은 서빙 계층(serving layer)에서 담당
○ 일괄처리 계층에서 처리될 사전계산의 양 및 뷰의 크기, 질의 시간에 필요한 계산의 양 사이에
균형을 잘 잡아야 함
● 성능 지표는 뷰를 갱신하는 데 시간이 얼마나 걸리는지로 측정
○ 서빙계층에 없는 데이터를 보완해주는 역할을 하는 것이 속도 계층이기 때문에 서빙계층에서
뷰를 만드는 시간이 오래걸릴 수록 속도 계층 뷰도 커짐
증분 일괄처리
● 일괄처리 계층의 지연시간을 줄이기 위한 방법
● 마스터 데이터 집합에 존재하는 모든 레코드의 개수만 세는 뷰를 만드는 경우
증분 일괄처리가 효율적
○ 증분 뷰가 재계산 뷰 보다 크지 않음
○ 코드를 증분화 하는 것도 복잡하지 않음
● 마스터 데이터 집합 전체에 대해 반복적으로 재계산 하지 않으므로 막대한 양
의 자원 절약
부분 재계산
● 일괄처리 계층이 실행될 때마다 매번 재계산하는 것은 비효율적
○ 이미 계산된 사전계산 뷰에 변경사항이 없다면 더더욱
● 사전계산 뷰에 변경사항이 발생할 경우 해당 사전계산 뷰만 재계산을 수행
● 전체 재계산을 할 필요 없이 필요한 부분만 재계산이 이루어지기 때문에 효율
적
● 마스터 데이터 집합 전체의 재분할을 피하는 것이 핵심
○ 가장 비용이 높은 작업
○ 재분할은 그룹화, 조인 연산 등의 작업 수행 시 발생
○ 분할이 필요 없는 경우 맵 리듀스 방식으로 각각 처리 후 병합하므로 비용 효율적
블룸 필터(bloom filter)
● 메모리는 제한적. 거대한 데이터 집합을 처리하려면 그만큼의 메모리가 필요
● 블룸필터는 요소들의 집합을 표현하는 소형 자료구조
○ 어떤 요소가 그 집합에 속하는지를 확인할 수 있음
● 질의 연산은 확률적으로 수행하기 때문에 메모리 절약
○ 훨씬 더 거대한 데이터 집합도 처리 가능
● 긍정 오류(false positive)는 있을 수 있지만 부정 오류(false negative)는 없음
○ 집합에 존재하지 않은 원소가 존재한다고 잘못 알려줄 수는 있지만 추가된 원소가 존재하지 않
는다고 알려주는 일은 절대 없음
서빙 계층에서 불변 데이터 사용의 이점
● 견고성
○ 임의 쓰기(데이터베이스처럼 수정이 가능한 경우) 기능이 없다는 것은 코드베이스가 단순할 뿐
만아니라 버그가 있을 가능성도 적다는 의미
● 운영하기 쉬움
○ 데이터베이스가 뭔가 잘못될 가능성이 적기 때문에 걱정거리가 많지 않음
● 성능 예측이 쉬움
○ 임의 쓰기와 읽기가 동시에 실행되는 경우가 없기 때문에 잠금에 대해 걱정할 필요가 없음
○ 읽기/쓰기를 수행하는 데이터베이스는 색인에서 사용되지 않는 부분을 회수하기 위해 압밀화
를 실행해야하는데 불변 데이터는 그럴 필요가 없어서 성능이 저하되지 않음
속도 계층
● 서빙 계층은 갱신에 걸리는 지연시간이 길기 때문에 항상 몇시간 정도 뒤처져 있음
● 대부분의 데이터는 서빙계층에 존재하지만 마지막으로 갱신한 후 도착한 데이터는 존재
하지 않음
● 지난 몇 시간동안의 데이터를 보완해주기 위해 실시간 처리를 해주는 역할이 속도 계층
● 속도 계층은 성능을 우선시함
● 불변 데이터 대신 읽기/쓰기가 가능한 데이터베이스를 사용
○ 짧은 지연시간을 얻기 위함
● 내결함성이 부족할 수 있지만 서빙계층이 지속적으로 속도계층을 무효화하기 때문에 쉽
게 고쳐질 수 있음
● 가장 최근의 데이터만 표현하면 되기 때문에 뷰 크기가 매우 작게 유지될 수 있고 이에
따라 운영상의 어려움을 피할 수 있음
질의 계층
● 람다 아키텍처의 마지막 계층
● 일괄처리 뷰와 실시간 뷰를 사용하여 질의에 응답하는 책임
● 적절한 결과를 위해 어떤 뷰를 사용하고 어떻게 병합할 것인지를 결정
● 각각의 질의는 일괄처리 뷰와 실시간 뷰에 대한 함수로 만들어짐
● 병합로직은 질의에 따라 달라질 수 있음
● 결국 뷰가 병합 가능한 구조여야 하는데 병합이 가능하도록 뷰를 어떻게 구조
화할 것인지 결정하는 것이 중요
감사합니다.