주녁, DevNote
article thumbnail

출처

- 원글 : The Architecture of Serverless Data Systems — Jack Vanlightly (jack-vanlightly.com)

- 번역 : 서버리스 데이터 시스템의 아키텍처 | GeekNews (hada.io)

 

이 글은 원글과 GeekNews의 요약을 보고 개인 의견 메모를 위해 작성되었습니다.

요약

  • 클라우드 데이터 서비스의 미래는 "대규모, 다중 테넌트" 구조
    • S3와 같은 최상위 SaaS 서비스들이 단순성, 신뢰성, 내구성, 확장성, 저렴한 가격을 제공하는 이유는 이 서비스의 기술들이 이러한 것들을 제공하기 위해 구조적으로 설계되었기 때문
    • 대규모 자원 풀을 통해 고객에게 서비스를 제공하는 것은 규모에 따른 효율성과 신뢰성을 보장함

[서버리스 멀티 테넌트 (Serverless Multi Tenant) 시스템 정의]

"Multi-Tenancy"의 정의

  • 다중 테넌트는 공유 하드웨어에서 작업 부하를 공동으로 배치시켜서 자원을 공유하는 것에 관한 것
  • 다중 테넌트를 "공유된 자원(가상화된 서버, 드라이브 및 PaaS 빌딩 블록 서비스 등)에서 여러 테넌트에게 서비스를 제공하는 것"으로 정의
  • 클라우드에서 시스템을 구축하는 것은 여러 테넌트가 공유된 컴퓨팅 서비스를 받는 것을 의미
  • 여러 리소스 공유 모델을 사용할 수 있으며, 일부 시스템은 컴포넌트 전체에 걸쳐서 여러 공유 모델을 결합
    • 공유 프로세스: 동일한 소프트웨어 프로세스가 여러 테넌트에 서비스를 제공. 데이터 및 보안 격리는 논리적임
    • 컨테이너: 단일 테넌트 노드를 실행하고 호스트당 여러 컨테이너를 패키징. 일반적으로 특정 K8s 노드가 수많은 테넌트의 포드를 호스팅하는 Kubernetes를 통해 이루어짐
    • 가상화: VM(예: QEMU) 또는 microVM(예: Firecracker)에서 단일 테넌트 노드를 실행하고 호스트당 여러 VM을 패키징합. Kubernetes는 Kata 컨테이너를 통해 VM과 함께 사용할 수도 있음
  • 테넌트가 동일한 V8 프로세스를 공유하면서 별도의 경량 컨텍스트에서 사용할 수 있는 V8 격리 방법도 있지만, 아직 데이터 시스템에서 이를 본 적은 없음

서버리스 정의

  • 고객은 서버 유형을 선택하거나 하드웨어를 명시적으로 선택하지 않음
  • 이러한 시스템들은 고객이 하드웨어의 크기를 명시적으로 조정할 필요 없이 모든 워크로드의 수요를 처리할 수 있도록 일정 수준의 탄력성과 이동성에 의존
    • 탄력성: 워크로드의 필요에 따라 서비스를 확장/축소하고 축소/증설할 수 있는 기능
    • 이동성: 성능 및 안정성 요구 사항을 충족하기 위해 내부적으로 워크로드를 이동하고 균형을 맞출 수 있는 서비스 기능
  • 서버리스 모델은 고객에게 점점 더 중요해지고 있는 사용량 기반 요금제를 사용
    • 많은 고객이 미리 큰 규모의 약정을 맺는 것을 원하지 않고 단순히 사용한 만큼만 요금이 청구되는 것을 선호
    • 사용량 기반 요금제에는 워크로드 및 기본 시스템 구현에 따라 크게 달라지는 다양한 변형이 있음
      • (백만) 오퍼레이션당 지불
      • 워크로드의 CPU 및 메모리 사용량에 대한 비용 지불
      • 스토리지 GB당 지불
      • 리소스 및 작업 속도와 관련된 가상 성능/용량 단위(예: DynamoDB의 RCU/WCU)에 대해 비용을 지불
      • 고객이 일부 기본 용량에 대해 비용을 지불하고 그 이상의 사용량에 대해 비용을 지불하는 하이브리드 모델("기본 비용 내고, 피크는 지불")

[공통된 도전 과제]

워크로드에 의해 부과된 제약 조건 내에서 작업

  • 주어진 데이터 시스템의 작업 부하에 의해 부과된 많은 제약 조건들이 기본 아키텍처의 중요한 동인임.
    • 지연 시간/가용성 요구 사항
    • 일관성 요구 사항
    • 요청과 데이터 간의 상관관계/종속성
    • 순차적 액세스 패턴과 무작위 액세스 패턴
    • 요청당 수행되는 작업의 다양성
    • 데이터 크기
    • 세션 대 요청 지향 프로토콜, 푸시 대 풀 메커니즘
    • 작업의 컴퓨팅 강도
  • 느슨한 지연 시간과 일관성 요구 사항은 엔지니어에게 더 많은 자유도를 제공함
    • 지연 시간이 짧은 시스템에서는 지연 시간이 긴 구성 요소를 도입하는 데 제약이 있기 때문에 클라우드 오브젝트 스토리지의 저비용 및 높은 내구성 이점을 활용하는 것이 좋은 예
    • Eventually Consistent한 시스템은 데이터를 동기식 데이터 핫 경로에 포함하지 않고 오브젝트 스토리지에 비동기식으로 기록함으로써 이러한 딜레마를 피할 수 있음
    • 지연 시간이 짧고 일관성이 강한 시스템에는 이러한 면죄부 카드가 없음
  • 짧은 지연 시간 같은 제약 조건이 결합하면 워크로드의 공간적, 시간적 로컬리티가 아키텍처 선택에 영향을 미칠 수 있음
    • 예를 들어, 순차적 스캔이 특징인 워크로드는 디스크에서 빠르고 효율적인 스캔을 위해 연속적인 데이터 범위를 함께 유지하는 것이 좋음
    • 이러한 범위를 더 작은 하위 범위로 세분화하면 핫스팟 관리에 도움이 되지만, 이 두 가지는 서로 상충되는 문제이므로 둘 사이의 균형을 찾아야 함
    • 개별 요청 간의 상관관계가 거의 없는 무작위 액세스 패턴은 여러 서버에 균일하고 얇게 분산할 수 있는 플랫 주소 공간의 이점을 활용할 수 있음
  • 영구 연결을 설정하는 세션 지향 프로토콜은 일반적으로 각 요청이 마지막 요청과 독립적인 요청 지향 프로토콜에 비해 더 어려움
    • 영구 연결에는 연결 풀링이 필요할 수 있으며 롤링 노드 및 데이터 밸런싱과 같은 교란이 발생하면 클라이언트에 외부적으로 눈에 띄는 영향을 미칠 수 있음
  • 객체 스토리지나 Kafka API와 같이 단순한 스토리지 API인 시스템도 있고, SQL 데이터베이스와 같이 컴퓨팅 집약적인 시스템도 있음
    • 이는 각 요청을 처리하는 데 필요한 작업량의 예측 가능성과 가변성이라는 주제로 이어짐
    • 극단적인 예로, 연속된 레코드 블록을 단순히 검색해야 하는 Kafka와 같은 데이터 스트리밍 API가 있고, 다른 쪽 끝에는 쿼리마다 작업량에 큰 차이를 초래할 수 있는 SQL이 있음

테넌트 격리

  • 자원 공유는 하드웨어 활용도를 높이지만, 한 테넌트의 작업 부하가 다른 테넌트에게 영향을 미치는 자원 경합을 초래할 수 있음
  • 다중 테넌트 시스템에서는 공유된 하드웨어 자원에서 서비스를 받는 테넌트가 자신만의 전용 서비스에서 서비스를 받는 것처럼 보장해야 함

스토리지와 컴퓨트의 분리

  • 스토리지와 컴퓨트의 분리는 지금까지 조사된 모든 시스템이 어느 정도 구현한 핵심 설계 원칙임
  • 하드웨어 트렌드로 인해 스토리지와 컴퓨팅의 분리는 점점 더 현실화되고 있으며, 이는 부분적으로는 네트워크가 더 이상 예전과 같은 병목 현상을 일으키지 않기 때문
  • 네트워크 처리량은 증가하고 있지만, 클라우드 오브젝트 스토리지가 우선순위를 차지하면서 이러한 분리에 따른 새로운 과제가 여전히 존재
    • 클라우드 오브젝트 스토리지는 여전히 상대적으로 지연 시간이 길고 내구성이 뛰어나며 비용이 저렴
    • 하지만 OLTP 데이터베이스와 같이 일반적으로 지연 시간이 짧은 워크로드에 도입하기는 어려울 수 있음
    • 또한 클라우드 오브젝트 스토리지의 경제적인 모델은 많은 작은 오브젝트에 의존하는 설계에 불리하게 작용하며, 더 적은 요청으로 더 큰 오브젝트에 데이터를 축적해야 하므로 저지연 시스템의 수명을 더욱 복잡하게 만듦
  • 엔지니어는 지연 시간이 짧은 시스템에 오브젝트 스토리지를 포함시키되, 느린 오브젝트 스토리지 앞에 내구성 있고 내결함성 있는 쓰기 캐시 및 예측 읽기 캐시를 배치하여 오브젝트 스토리지의 지연 시간 문제에 대응할 수 있음
    • 이 내구성 있는 쓰기 캐시는 기본적으로 복제 프로토콜을 구현하고 블록 스토리지에 데이터를 쓰는 서버 클러스터임
      • 백그라운드에서 클러스터는 더 적은 수의 대용량 파일을 쓰는 경제적인 패턴에 따라 데이터를 오브젝트 스토리지에 비동기식으로 업로드
      • fault-tolerant 쓰기 캐시는 짧은 레이턴시의 쓰기를 잘 지원함
    • 이 아키텍처에서 문제가 될 수 있는 것은 읽기 캐시
      • 이벤트 스트리밍과 같은 순차적 워크로드는 간단하고 매우 효과적
      • Aggregate Prefetching(집계 프리페팅)이 수요를 따라잡는 한, 읽기는 항상 로컬 읽기 캐시에 도달해야 함
      • 데이터베이스는 예측하기 어려운 랜덤 액세스 패턴으로 인해 이보다 더 어려운 문제를 겪지만, 테이블 스캔은 여전히 읽기 선행 작업의 이점을 누릴 수 있음
  • 복제 프로토콜로 분산형 내결함성 쓰기 캐시를 구현하는 것은 그리 간단한 일이 아니며, 다중 AZ 환경에서는 교차 AZ 요금과 같은 다른 비용이 발생할 수 있음
    • 하지만 현재로서는 저렴하고 내구성이 뛰어난 오브젝트 스토리지를 기본 데이터 저장소로 사용하고자 하는 저지연 시스템을 위한 대안이 없음
    • 지연 시간이 짧은 다른 시스템은 클라우드 오브젝트 스토리지 사용을 아예 피해야 하며, 무엇보다도 예측 가능한 짧은 지연 시간을 선호
    • 클라우드 스토리지는 널리 사용되고 있지만 지연 시간 상충 관계로 인해 보편적이지 않습니다.

열 관리

  • 열 관리는 지연 시간 급증이나 초당 작업 수 감소와 같이 외부에서 눈에 보이는 성능 문제를 일으킬 수 있는 핫스팟을 피하기 위해 여러 스토리지 노드에 걸쳐 가능한 한 균등하게 부하를 분산하는 것
  • 이를 로드 밸런싱이라고도 할 수 있지만, 보통 상태 비저장 노드에 대한 로드 밸런서라는 용어를 사용
  • 스테이트풀 시스템에서는 특정 스토리지 노드에 수요가 많은 오브젝트가 그룹화되지 않아 경합이 발생할 수 있는 핫스팟이 발생할 수 있음
  • 로드 밸런서는 무작위, 최소 연결 또는 일부 FIFO 변형과 같은 간단한 전략으로 상태 비저장 노드 집합에 부하를 고르게 분산시킬 수 있지만, 상태 저장 시스템은 데이터가 있는 위치에 따라 요청을 노드로 라우팅해야 함
  • 부하를 재분배하기 위해 데이터를 이동하는 것을 리밸런싱이라고 함
  • 더욱 복잡한 문제는 시간이 지남에 따라 부하 분산이 변경될 수 있다는 점
    • 데이터 분산은 작은 데이터 하위 집합에 영향을 미치는 단기적인 피크부터 여러 테넌트에 걸쳐 나타나는 일별 패턴이나 계절적 이벤트로 인한 더 큰 부하 변화까지 모든 것을 처리해야 하는 동적인 프로세스가 됨
  • 대규모 데이터베이스나 처리량이 많은 이벤트 스트림과 같은 대규모 데이터 세트는 부하를 효과적으로 분산하기 위해 샤딩해야 함
    • 리밸런싱은 샤드의 리밸런싱이 되며, 시스템은 로드 분배가 변경됨에 따라 샤드를 분할하고 병합할 수도 있음
    • 그러나 샤드 수와 크기와 관련하여 데이터 로컬리티와 같은 상충되는 문제가 존재할 수 있음
    • 한편으로는 데이터의 공동 위치가 많을수록 검색이 더 효율적
    • 반면에, 너무 많은 샤드에서 가져와야 하는 컴퓨팅 작업의 비용이 더 많은 서버에 부하를 분산시킴으로써 얻을 수 있는 이점을 능가할 수도 있음
  • 열 관리는 단일 테넌트 시스템에서도 필요할 수 있으므로 멀티 테넌트만의 문제는 아님
    • 그러나 MT 데이터 시스템에서는 테넌트가 서비스 품질 변동을 경험하지 않도록 하기 위해 열 관리가 더욱 중요해짐

높은 자원 활용도 달성

  • 서버리스 멀티테넌트 아키텍처를 구현하는 주요 동기 중 하나는 기본 하드웨어 리소스를 보다 효율적으로 사용하여 더 나은 경제적 성능을 제공하기 위한 것
  • 리소스 풀링을 통해 리소스 활용도를 높이는 것이 가장 중요하지만, 테넌트 격리 및 예측 가능한 성능으로 이를 달성하는 것은 어려운 과제

콜드 스타트

  • 테넌트 단위로 자원을 제로로 축소하는 서버리스 시스템은 테넌트가 작업 부하를 재개할 때 콜드 스타트의 문제에 직면할 수 있음
  • 콜드 스타트는 처음부터 서버리스 기능의 초점이었으며, 일부 서버리스 데이터 시스템에도 영향을 미칠 수 있음
  • 일부 시스템에서는 콜드 스타트가 전혀 발생하지 않는 반면, 다른 시스템에서는 콜드 스타트가 아키텍처와 스케일 투 제로 제품 제공으로 인해 피할 수 없는 일종의 피할 수 없는 것이기도 함
  • 내가 본 모든 사례에서 콜드 스타트 문제는 제품 결정 사항이며, 요금제 및 가격 책정 방식에 따라 리소스 축소 수준이 다를 수 있음
  • 궁극적으로 고객과 공급업체는 각자의 필요에 맞게 절충안을 선택할 수 있음

조사한 시스템들

  • Group 1 - Storage APIs (compute-light)
    • Amazon DynamoDB (chapter 1)
    • Kora - Serverless Kafka engine inside Confluent Cloud (chapter 2)
    • Backblaze B2 (planned)
  • Group 2 - SQL OLTP databases (compute-heavy)
    • Neon - serverless PostgreSQL (chapter 3)
    • CockroachDB’s serverless multi-tenant architecture. (in progress)
    • Planetscale (planned)
  • Group 3 - SQL OLAP databases and data warehouses (compute-heavy)
    • Google BigQuery (planned)
    • ClickHouse Cloud (in progress).
  • 이 작업은 계속 진행되겠지만, 2024년 1월/2월에 일종의 '결론' 포스팅 예정

 


개인 의견

SaaS 관련 업무를 진행하면서 느낀 점과 유사한 포스팅이다.

SaaS에서 중요한 것은 누가, 어떤 행동을, 얼마나 허용할 것인지 규정하는 일이었다.

사용자별로 메뉴도 달라야하고, 결제한 요금제나, 커스텀 메뉴에 따라서도 기능이 달라야 했다.

 

이 포스팅에서는 다중 AZ에 따른 스토리지 읽기/쓰기 지연, 데이터를 효율성 있게 이동하는 리밸런싱 등 글로벌 서비스에서만 겪을 수 있는 다양한 도전 과제를 보여준다. 앞으로 내가 고민해봐야 하는 문제라고 생각이 든다.

현재는 단순히 클러스터를 구성하고 배포하는 단계에 머물러 있다면, 앞으로는 24시간 글로벌 무중단 서비스가 돌아간다는 생각으로 전환이 필요한 시기인 것 같다.

profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!