scalability

11 개의 포스트

Amazon S3 20주년과 다음 단계 구축 | Amazon Web Services (새 탭에서 열림)

Amazon S3는 2006년 출시 이후 20년 동안 단순한 객체 스토리지를 넘어 전 세계 데이터 및 AI 워크로드의 핵심적인 보편적 기반으로 진화했습니다. 기술적 혁신을 통해 11나인(99.999999999%)의 내구성과 완벽한 하위 호환성을 유지하면서도, 비용을 85% 절감하고 엑사바이트 단위의 확장을 실현하며 클라우드 인프라의 표준을 제시하고 있습니다. **비약적인 규모의 확장과 경제성 확보** * 2006년 당시 1PB 수준이었던 총 용량은 현재 500조 개 이상의 객체와 수백 엑사바이트의 데이터를 수용하는 규모로 성장했습니다. * 최대 객체 크기는 5GB에서 50TB로 1만 배 증가했으며, 초당 요청 수는 전 세계적으로 2억 건을 상회합니다. * 기가바이트당 비용은 출시 초기 15센트에서 현재 약 2센트로 85% 감소했으며, 'S3 Intelligent-Tiering'을 통해 고객들은 표준 대비 60억 달러 이상의 비용을 절감했습니다. * S3 API는 업계 표준이 되어 수많은 벤더가 이를 채택하고 있으며, 2006년에 작성된 코드가 수정 없이 오늘날에도 그대로 동작할 만큼 엄격한 하위 호환성을 보장합니다. **규모의 한계를 극복하는 엔지니어링 혁신** * **지속적 데이터 감사:** 마이크로서비스 기반의 감사(Auditor) 시스템이 모든 바이트를 실시간으로 검사하며, 열화 징후가 발견되는 즉시 자동 복구 시스템을 가동하여 데이터 손실을 방지합니다. * **수학적 정확성 증명:** 인덱스 하위 시스템과 액세스 정책 등에 정형 기법(Formal methods)과 자동 추론을 적용하여 시스템의 일관성과 정확성을 수학적으로 증명합니다. * **Rust 언어 전환:** 성능에 민감한 요청 경로와 디스크 스토리지 코드를 Rust로 재작성하여 메모리 안전성을 확보하고, 대규모 운영 환경에서 발생할 수 있는 버그를 컴파일 단계에서 제거했습니다. * **규모의 경제 활용:** "규모가 곧 장점"이라는 철학 아래 시스템이 커질수록 개별 워크로드 간의 상관관계가 낮아지도록 설계하여 전체적인 안정성을 높였습니다. **데이터와 AI를 위한 미래 지향적 기능** * **S3 Tables:** Apache Iceberg 테이블을 완전 관리형으로 제공하며, 자동화된 유지보수를 통해 쿼리 효율을 높이고 스토리지 비용을 최적화합니다. * **S3 Vectors:** RAG(검색 증강 생성) 및 시맨틱 검색을 위해 최대 20억 개의 벡터를 인덱싱하며, 100ms 미만의 낮은 지연 시간으로 네이티브 벡터 검색을 지원합니다. * **S3 Metadata:** 대규모 버킷을 일일이 나열(List)하지 않고도 중앙 집중식 메타데이터를 통해 즉각적으로 데이터를 발견할 수 있어 데이터 레이크 분석 시간을 획기적으로 단축합니다. **권장 사항** S3는 이제 데이터를 저장만 하는 공간이 아니라, 데이터를 이동시키지 않고도 직접 분석하고 AI 모델에 활용할 수 있는 통합 플랫폼입니다. 비용 효율성을 극대화하기 위해 'Intelligent-Tiering'을 기본적으로 활용하고, 복잡한 데이터 파이프라인 대신 'S3 Tables'나 'S3 Metadata' 같은 최신 기능을 도입하여 데이터 관리의 복잡성을 줄이는 전략이 필요합니다.

디자인 시스템 다시 생각해보기 (새 탭에서 열림)

디자인 시스템은 성장에 따라 경직되기 마련이며, 시스템이 제품 팀의 변화하는 요구사항을 제때 수용하지 못할 경우 팀은 시스템을 우회하거나 파편화된 코드를 생성하게 됩니다. 토스의 디자인 시스템(TDS)은 디자인 시스템을 통제 수단이 아닌 '하나의 제품'으로 정의하고, 수요자의 니즈에 따라 유연하게 대응할 수 있는 설계 구조를 지향합니다. 이를 위해 단순함과 유연함을 동시에 잡을 수 있는 하이브리드 API 전략을 도입하여 일관성과 생산성을 모두 확보하는 해결책을 제시합니다. ### 시스템의 경직성과 파편화 문제 * 조직이 커지고 제품이 다양해지면 기존 시스템의 제약 내에서 해결할 수 없는 UI 요구사항이 빈번하게 발생합니다. * 제품 팀은 빠른 해결을 위해 피그마 컴포넌트를 해제(detach)하거나 라이브러리 코드를 복제(fork)하여 로컬에서 수정해 사용하게 됩니다. * 이러한 우회 방식은 시스템 업데이트와의 연결을 끊어버려 UI 불일치를 초래하고, 장기적으로 디자인 시스템의 핵심 가치를 무너뜨립니다. * 결국 디자인 시스템이 팀의 속도를 늦추는 장애물이 되지 않으려면, 강력한 규칙보다 '우회할 이유를 줄이는 유연한 설계'가 필요합니다. ### 확장성을 고려한 컴포넌트 API 패턴 비교 * **Flat 패턴**: 내부 구조를 숨기고 모든 변형을 props로 처리하는 방식입니다. 사용이 직관적이고 간결하지만, 예외적인 요구사항이 늘어날수록 props가 기하급수적으로 증가하여 유지보수가 어려워집니다. * **Compound 패턴**: 하위 컴포넌트(Header, Body, Footer 등)를 제공하여 사용자가 직접 조합하는 방식입니다. 시스템이 예측하지 못한 레이아웃도 유연하게 구현할 수 있으나, 코드량이 늘어나고 구조에 대한 학습 비용이 발생한다는 단점이 있습니다. * 두 패턴은 상충하는 장단점을 가지고 있으므로, 단순히 하나의 패턴을 강요하는 것은 사용자의 이탈을 막기에 부족합니다. ### TDS의 하이브리드 전략과 Primitive 레이어 * TDS는 단순하고 빈번한 케이스를 위한 **Flat API**와 복잡한 커스텀을 위한 **Compound API**를 동시에 제공합니다. * 사용자는 별도의 커스텀이 필요 없을 때는 간결한 Flat 형식을 선택하고, 세밀한 제어가 필요할 때는 Compound 형식을 선택하여 시스템 내부에서 문제를 해결할 수 있습니다. * 디자인 시스템 팀은 관리 효율을 위해 **Primitive(기초 단위)** 레이어를 먼저 구축합니다. * 내부적으로는 동일한 Primitive 컴포넌트를 공유하면서 외부로 드러나는 API만 두 가지 형태로 노출함으로써, 유지보수 부담을 최소화하면서도 사용자 경험을 극대화합니다. 디자인 시스템은 팀을 가두는 울타리가 아니라 안전하게 안내하는 가드레일이 되어야 합니다. 중앙에서 모든 것을 통제하려 하기보다, 규칙에서 벗어난 예외 상황까지 시스템 안에서 지원할 수 있는 유연한 설계를 갖출 때 진정한 일관성을 유지할 수 있습니다.

런타임 보안을 위한 e (새 탭에서 열림)

대규모 분산 시스템에서 발생하는 초당 수백만 건의 커널 이벤트를 실시간으로 처리하기 위해선 기존의 사용자 공간 필터링 방식으로는 성능적 한계가 명확합니다. 이 글은 eBPF(Extended Berkeley Packet Filter)를 활용하여 이벤트가 발생하는 커널 내부에서 불필요한 데이터를 직접 필터링함으로써 시스템 부하를 최소화하는 아키텍처를 제안합니다. 이를 통해 CPU 사용량을 최적화하고 데이터 유실 없는 안정적인 대규모 파일 모니터링 시스템을 구축한 기술적 성과를 다룹니다. ### 기존 모니터링 방식의 병목 현상 * 수십억 개의 파일 이벤트를 사용자 공간(User-space)으로 모두 전송한 뒤 필터링하는 방식은 과도한 컨텍스트 스위칭과 데이터 복사 비용을 발생시킵니다. * 커널에서 사용자 공간으로 데이터를 넘겨주는 버퍼가 가득 찰 경우, 처리 속도가 발생 속도를 따라가지 못해 중요한 보안 또는 운영 이벤트가 누락되는 문제가 발생합니다. * 특정 프로세스의 반복적인 작업이나 무의미한 임시 파일 생성과 같은 '노이즈'가 전체 시스템 리소스의 대부분을 점유하여 모니터링 효율을 저해합니다. ### eBPF 기반의 인-커널(In-Kernel) 필터링 * eBPF를 사용하여 파일 시스템 관련 시스템 콜(open, read, write 등)이 호출되는 즉시 커널 내에서 필터링 로직을 실행합니다. * 사용자 공간의 제어부(Control Plane)가 모니터링 대상 경로(Allowlist)나 제외 대상(Denylist) 정보를 eBPF Map에 저장하면, 커널 내 eBPF 프로그램이 이 맵을 참조해 데이터를 즉시 선별합니다. * 유의미한 이벤트만 선별하여 전송하기 때문에 사용자 공간으로 전달되는 데이터의 양을 90% 이상 획기적으로 줄일 수 있습니다. ### LPM Trie를 활용한 경로 매칭 최적화 * 파일 경로는 단순 문자열 비교로 처리하기에 복잡하므로, 가장 긴 접두사 일치(LPM, Longest Prefix Match) Trie 구조를 사용하여 필터링 효율을 높입니다. * 특정 디렉토리 하위의 모든 파일이나 특정 패턴을 포함하는 경로를 효율적으로 식별하며, 규칙이 늘어나도 $O(L)$(L은 경로 깊이)의 일정한 검색 속도를 보장합니다. * 이 방식을 통해 수천 개의 복잡한 필터링 규칙이 적용된 환경에서도 커널 성능 저하 없이 실시간 매칭이 가능해집니다. ### Ring Buffer를 통한 안정적인 데이터 전달 * 기존의 Perf Buffer 방식 대신 최신 커널의 BPF Ring Buffer를 활용하여 메모리 효율성과 데이터 공유 성능을 극대화했습니다. * Ring Buffer는 여러 CPU 코어에서 동시에 발생하는 이벤트를 안전하게 처리하며, 메모리 경합을 줄이고 사용자 공간과의 통신 오버헤드를 최소화합니다. * 특히 가변 길이의 파일 경로 데이터를 처리할 때 메모리 할당 효율이 뛰어나 데이터 유실 가능성을 크게 낮춥니다. 실시간 대규모 모니터링을 설계할 때 가장 중요한 것은 '데이터 처리의 위치'입니다. eBPF를 통해 데이터의 발생지인 커널에 가깝게 필터링 로직을 전진 배치함으로써 인프라 비용을 절감하고 시스템 관측성을 높일 수 있습니다. 성능 저하 없는 정밀한 보안 감시나 실시간 파일 추적이 필요한 환경이라면 eBPF 기반의 조기 필터링 아키텍처 도입을 적극 권장합니다.

스트림 뒤편: 라이브 이벤트를 위한 실시간 추천 3부 | 넷플릭스 기술 블로그 | 넷플릭스 테크블로그 (새 탭에서 열림)

넷플릭스는 수천만 명의 시청자가 동시에 접속하는 라이브 이벤트 상황에서 시스템 과부하를 방지하면서도 실시간 개인화 추천을 제공하기 위해 '프리페칭(Prefetching)'과 '실시간 브로드캐스팅'이라는 2단계 전략을 도입했습니다. 이 시스템은 이벤트 시작 전 미리 데이터를 기기에 저장해 두었다가, 실제 시작 시점에는 최소한의 신호만 보내 로컬에서 추천 정보를 활성화함으로써 '천둥 번개 효과(Thundering Herd)' 문제를 효과적으로 해결합니다. 이를 통해 넷플릭스는 클라우드 자원을 무리하게 확장하지 않고도 전 세계 수억 대의 기기에 지연 없는 실시간 스트리밍 경험을 제공할 수 있게 되었습니다. **라이브 이벤트와 시동 시간의 제약** * VOD와 달리 라이브 이벤트는 모든 시청자가 특정 시점에 동시에 접속하므로, 짧은 시간 내에 수억 개의 기기에 업데이트를 전달해야 하는 기술적 난관이 존재합니다. * 단순히 서버를 증설하는 선형적 확장은 비효율적이며, 다른 핵심 서비스의 자원을 고갈시킬 위험이 있습니다. * 성공적인 실시간 추천을 위해서는 업데이트 소요 시간(Time), 서비스 처리 용량(Request Throughput), 요청의 다양성(Compute Cardinality)이라는 세 가지 제약 조건을 동시에 최적화해야 합니다. **프리페칭을 통한 트래픽 분산** * 이벤트 시작 전 사용자가 평소처럼 앱을 탐색하는 동안, 라이브 이벤트와 관련된 메타데이터, 아트워크, 개인화된 추천 리스트를 미리 기기 캐시에 저장합니다. * 이를 통해 서버 요청을 시간에 따라 자연스럽게 분산시켜, 이벤트 직전 발생하는 트래픽 스파이크를 제거하고 시스템 안정성을 확보합니다. * 서버 측에서 미리 계산된 '구체화된 추천(Materialized Recommendations)'을 제공함으로써 기기별 요청의 복잡도를 낮춥니다. **저카디널리티 실시간 브로드캐스팅** * 이벤트가 실제로 시작되거나 일정이 변경될 때, 넷플릭스의 푸시 서비스(Zuul Push)를 통해 연결된 모든 기기에 '저카디널리티(Low-cardinality)' 메시지를 전송합니다. * 이 메시지는 복잡한 데이터를 담지 않고 단순히 미리 캐싱된 데이터를 화면에 표시하라는 트리거 역할만 수행하여 네트워크 부하를 최소화합니다. * '최소 한 번(At-least-once)' 전달 방식을 채택하여 네트워크 상태가 불안정한 기기도 다시 온라인 상태가 되면 누락된 업데이트를 즉시 따라잡을 수 있도록 설계되었습니다. **데이터 기반의 동적 적응** * 라이브 이벤트의 특성상 경기 시간이 지연되거나 일정이 변동될 수 있는데, 브로드캐스팅 시스템은 이러한 실시간 제작 상황에 맞춰 전송 타이밍을 동적으로 조절합니다. * 수천만 대의 기기가 동시에 서버에 데이터를 재요청하는 대신 로컬 데이터를 활용하게 함으로써, 전 세계 모든 사용자가 동일한 순간에 일관된 추천 UI를 볼 수 있게 합니다. 라이브 이벤트와 같은 초고부하 상황에서는 무조건적인 서버 증설보다는 클라이언트의 로컬 자원을 활용하고 서버 부하를 시간적으로 분산하는 아키텍처가 필수적입니다. 실시간성이 중요한 서비스라면 모든 데이터를 실시간으로 전송하기보다, 정적인 데이터는 미리 배치하고 상태 변화를 알리는 최소한의 신호만 실시간으로 처리하는 하이브리드 접근 방식을 권장합니다.

디스코드 업데이트: 2 (새 탭에서 열림)

디스코드의 2025년 9월 업데이트는 사용자 프로필의 시각적 강화와 대규모 커뮤니티를 수용하기 위한 기술적 확장에 초점을 맞추고 있습니다. 활동 스택과 팝아웃 창을 통해 멀티태스킹 환경을 개선했으며, 서버 수용 인원을 무려 2천 5백만 명으로 대폭 늘리는 등 플랫폼의 성능과 확장성을 동시에 확보했습니다. 이번 업데이트를 통해 사용자들은 더욱 개성 있는 테마와 프로필로 자신을 표현하고, 전례 없는 규모의 서버에서 원활하게 소통할 수 있게 되었습니다. ### 사용자 프로필 및 멀티태스킹 고도화 * **프로필 디자인 개편:** 데스크톱 버전의 사용자 프로필이 새롭게 단장되어, 사용자의 자기소개와 최근 플레이한 게임 등의 세부 정보를 더욱 명확하게 보여줍니다. * **활동 스택(Activity Stacking):** 게임 플레이, 음악 감상, 음성 채널 참여 등 여러 활동을 동시에 할 경우, 이를 카드 형태로 쌓아서 프로필에 모두 표시해 주는 기능이 추가되었습니다. * **액티비티 팝아웃:** '함께 보기(Watch Together)'와 같은 액티비티를 별도의 플로팅 창으로 분리할 수 있습니다. 이를 통해 서버 메시지를 확인하거나 DM을 보내면서도 끊김 없이 콘텐츠를 즐길 수 있습니다. * **카메라 활성화 알림음:** 개인 프라이버시 보호를 위해 카메라가 켜질 때마다 소리로 상태를 알려주는 직관적인 피드백이 도입되었습니다. ### 서버 확장성 및 편의 기능 강화 * **서버 수용 인원 대폭 확대:** 서버당 최대 수용 인원 기본값이 2,500만 명으로 늘어났습니다. 이는 대규모 커뮤니티 운영을 지원하기 위한 백엔드 최적화의 결과입니다. * **메시지 고정(Pin) 한도 증설:** 기존 50개였던 메시지 고정 한도가 250개로 5배 늘어나 중요한 정보를 더 많이 보관할 수 있게 되었습니다. * **AV1 코덱 및 임베드 개선:** 비디오 첨부 파일과 임베드에 AV1 코덱 지원을 추가하여 고화질 영상 로딩 속도를 높였으며, 텀블러(Tumblr) 링크 공유 시 태그와 상세 설명이 포함된 세련된 임베드 형식을 제공합니다. ### 개인화 테마 및 서버 배지 * **커스텀 그라데이션 테마:** Nitro 사용자는 최대 5가지 색상을 조합하여 자신만의 그라데이션 테마를 제작할 수 있습니다. 제작된 테마는 모바일 기기와도 실시간으로 동기화됩니다. * **신규 서버 태그 배지:** 서버 태그를 꾸밀 수 있는 '반려동물(Pet)' 팩과 '플렉스(Flex)' 팩이 새롭게 추가되어, 귀여운 동물 아이콘이나 왕관 아이콘으로 개성을 나타낼 수 있습니다. 이번 업데이트는 단순한 기능 추가를 넘어, 대규모 서버 운영자와 멀티태스킹을 즐기는 파워 유저 모두를 만족시킬 수 있는 강력한 인프라 개선을 담고 있습니다. 더욱 정교해진 프로필 설정과 커스텀 테마를 활용해 나만의 디스코드 환경을 구축해 보시기 바랍니다.

차분 프라이버시 파티 (새 탭에서 열림)

구글 리서치는 대규모 데이터셋에서 개인정보를 보호하면서도 유용한 데이터를 추출할 수 있는 혁신적인 차분 프라이버시(Differential Privacy, DP) 파티션 선택 알고리즘인 'MAD(MaxAdaptiveDegree)'를 공개했습니다. 이 알고리즘은 수천억 개의 아이템이 포함된 방대한 데이터를 처리할 수 있는 병렬 구조를 갖추고 있으며, 기존 비적응형 방식보다 훨씬 더 많은 유효 데이터를 안전하게 식별해 냅니다. 이를 통해 연구자들은 개별 사용자의 민감한 정보를 노출하지 않으면서도 AI 모델 학습이나 데이터 분석에 필요한 고품질의 데이터셋을 확보할 수 있게 되었습니다. **차분 프라이버시(DP) 파티션 선택의 역할** * **개념 정의:** 수많은 사용자가 기여한 방대한 데이터 집합에서 특정 임계치 이상의 빈도를 가진 공통 아이템(예: 자주 사용되는 단어나 n-gram)을 안전하게 선택하는 프로세스입니다. * **프라이버시 보호:** 특정 개별 사용자의 데이터 포함 여부를 알 수 없도록 제어된 노이즈를 추가하며, 노이즈가 섞인 상태에서도 충분히 공통적인 아이템만 최종 리스트에 포함합니다. * **활용 분야:** 대규모 텍스트 코퍼스의 어휘 추출, 데이터 스트림 분석, 사용자 데이터 기반 히스토그램 생성, 프라이버시 보존형 모델 미세 조정(Fine-tuning)의 효율성 증대 등에 필수적입니다. **기존 가중치 산정 방식의 한계** * **표준 패러다임:** 일반적으로 '가중치 계산(빈도 측정) → 노이즈 추가(가우시안 노이즈 등) → 필터링(임계값 적용)'의 3단계를 거칩니다. * **가중치 낭비:** 기존의 비적응형 방식은 매우 인기 있는 아이템에 필요 이상의 가중치를 할당하는 경향이 있으며, 이로 인해 임계값 바로 아래에 있는 유용한 아이템들이 노이즈에 의해 삭제되는 문제가 발생합니다. * **확장성 문제:** 기존의 순차적(Sequential) 알고리즘은 현대의 거대 데이터셋을 처리하기에 속도가 너무 느려 실무 적용에 한계가 있었습니다. **적응형 가중치 재배분을 통한 MAD 알고리즘의 혁신** * **적응형 가중치(Adaptive Weighting):** MAD 알고리즘은 아이템 간의 가중치를 독립적으로 두지 않고, 다른 사용자의 기여도를 고려하여 전략적으로 가중치를 재할당합니다. * **효율적 재배분:** 임계값을 훨씬 상회하는 인기 아이템의 '과잉 가중치'를 식별하고, 이를 임계값 근처에 있는 아이템들에 재배분하여 더 많은 유효 아이템이 프라이버시 기준을 통과하도록 돕습니다. * **병렬 대규모 처리:** 수천억 개의 아이템을 동시에 처리할 수 있는 병렬 구조로 설계되어, 기존 순차 알고리즘 대비 최대 1,000배 더 큰 규모의 데이터셋까지 확장 가능합니다. * **성능 유지:** 가중치를 재배분하면서도 차분 프라이버시의 핵심인 '낮은 민감도(Low-sensitivity)'와 계산 효율성을 그대로 유지합니다. **실용적 의의 및 권고** 데이터 규모가 커질수록 프라이버시 보호와 데이터 유용성 사이의 균형을 맞추는 것이 어려워지지만, MAD 알고리즘은 병렬 처리를 통해 이 문제를 해결했습니다. 대규모 사용자 데이터를 다루는 연구자나 엔지니어는 구글이 오픈소스로 공개한 'DP 파티션 선택' 라이브러리를 활용하여, 데이터의 유실을 최소화하면서도 강력한 프라이버시 보증을 제공하는 데이터 파이프라인을 구축할 것을 권장합니다.

디스코드가 수조 개의 (새 탭에서 열림)

디스코드(Discord)는 수십억 개의 메시지를 효율적으로 검색하기 위해 엘라스틱서치(Elasticsearch)를 기반으로 한 고성능 검색 인프라를 구축했습니다. 초기 설계는 길드(서버)나 DM 단위로 데이터를 샤딩하여 쿼리 속도를 높이고 운영 관리를 용이하게 하는 데 집중했으며, 리소스를 절약하기 위해 지연 인덱싱(Lazy Indexing) 방식을 채택했습니다. 하지만 서비스가 급격히 성장함에 따라 초기 설계의 효율성보다는 대규모 확장성 측면에서 구조적인 한계가 나타나기 시작했습니다. **엘라스틱서치 기반의 샤딩 및 저장 구조** - 데이터의 논리적 네임스페이스인 인덱스를 두 개의 엘라스틱서치 클러스터에 분산 배치하여 관리했습니다. - 모든 메시지는 길드(Guild) 또는 DM ID를 기준으로 샤딩되어, 특정 그룹의 메시지가 동일한 인덱스에 저장되도록 설계했습니다. - 이러한 샤딩 전략은 관련 데이터를 한데 모아 쿼리 실행 속도를 최적화하고, 클러스터 규모를 제어 가능한 수준으로 유지하는 데 기여했습니다. **메시지 큐와 대량 인덱싱 처리** - 모든 사용자가 검색 기능을 사용하는 것이 아니라는 점에 착안하여, 메시지를 즉시 처리하지 않고 필요할 때 인덱싱하는 '지연 인덱싱' 방식을 도입했습니다. - 메시지 큐를 구축하여 워커(Worker)들이 메시지 덩어리(Chunks)를 가져와 처리할 수 있도록 시스템을 구성했습니다. - 엘라스틱서치의 벌크 인덱싱(Bulk-indexing) 기능을 활용하여 대량의 메시지를 한 번에 처리함으로써 인덱싱 효율을 극대화했습니다. 초기 설계 단계에서 데이터 응집도와 리소스 효율성을 고려한 샤딩 및 인덱싱 전략은 시스템의 성능과 비용 효율성을 잡는 데 효과적입니다. 그러나 서비스의 성장에 따라 기존 아키텍처에서 발생하는 병목 현상을 미리 예측하고, 성능 저하가 시작되는 시점에 맞추어 인프라 고도화를 준비하는 과정이 필수적입니다.

dbt 오버클러킹 (새 탭에서 열림)

디스코드는 2,500개 이상의 데이터 모델과 100명 이상의 개발자가 협업하는 페타바이트급 데이터 환경을 관리하기 위해, dbt의 기본 기능을 넘어선 커스텀 확장 시스템을 구축했습니다. 초기 도입 시에는 20분이 넘는 컴파일 시간과 개발자 간의 작업 충돌 등 확장성 한계에 부딪혔으나, 이를 자동화된 백필(Backfill)과 생산성 도구로 해결하며 견고한 데이터 분석 기반을 마련했습니다. 이 사례는 대규모 데이터 웨어하우스 환경에서 dbt를 효율적으로 확장하려는 기업들을 위한 기술적 청사진을 제시합니다. ### dbt 선정 배경과 주요 장점 * **엔지니어링 철학과의 일치:** 오픈 소스를 지향하고 엔지니어링의 유연성과 투명성을 중시하는 디스코드의 철학에 따라 dbt를 채택했습니다. * **도구 간 통합 및 모듈화:** 오케스트레이터인 Dagster와의 원활한 통합은 물론, SQL 기반의 모듈식 설계를 통해 코드 재사용성과 유지보수성을 확보했습니다. * **품질 관리:** 데이터 품질을 보장할 수 있는 포괄적인 테스트 프레임워크를 활용하여 신뢰할 수 있는 데이터 변환 프로세스를 구축했습니다. ### 대규모 데이터 환경에서의 한계점 * **긴 컴파일 대기 시간:** 프로젝트 규모가 커짐에 따라 전체 프로젝트를 재컴파일하는 데 20분 이상이 소요되어 개발 생산성이 급격히 저하되었습니다. * **증분 전략의 비효율성:** dbt가 기본적으로 제공하는 증분(Incremental) 구체화 전략은 디스코드의 페타바이트급 데이터 볼륨을 처리하기에 최적화되어 있지 않았습니다. * **동시성 충돌 문제:** 여러 개발자가 동시에 작업하는 과정에서 서로의 테스트 테이블을 덮어쓰는 등 협업상의 혼선과 자원 낭비가 발생했습니다. ### 확장성을 위한 커스텀 최적화 전략 * **성능 중심의 코어 확장:** dbt의 표준 기능을 확장하여 대규모 조직에 적합한 커스텀 시스템을 구축함으로써 개발 사이클을 획기적으로 단축했습니다. * **자동화된 백필 시스템:** 수동 개입이 많이 필요한 복잡한 데이터 백필 과정을 자동화하여 운영 리소스를 절감하고 데이터의 정합성을 높였습니다. * **플랫폼 독립적 설계:** Google BigQuery를 사용하면서도 특정 클라우드 제공업체에 종속되지 않는(Provider-agnostic) 구조를 취해 범용적인 적용이 가능하도록 설계했습니다. 디스코드의 이러한 시도는 단순한 도구 도입을 넘어, 대규모 데이터 스택을 운용할 때 발생하는 병목 현상을 엔지니어링 기반의 커스텀 솔루션으로 해결할 수 있음을 보여줍니다. 데이터 규모가 급격히 성장하는 조직이라면 dbt의 기본 기능에만 의존하기보다, 자사의 인프라에 맞춘 자동화와 확장 도구를 결합하는 전략이 필수적입니다.

12개월 이내에 K8 (새 탭에서 열림)

피그마(Figma)는 급격한 사용자 증가에 따른 데이터베이스 부하 문제를 해결하기 위해 단일 PostgreSQL 환경에서 Vitess 기반의 수평적 샤딩 아키텍처로 성공적으로 전환했습니다. 이 과정에서 피그마는 서비스 중단 없이 대규모 데이터를 마이그레이션했으며, 수직적 확장의 한계를 극복하고 무한한 확장성을 갖춘 데이터 플랫폼을 구축했습니다. 결론적으로 이들은 기술적 부채를 체계적으로 관리하며 분산 데이터베이스 시스템으로의 진화가 서비스 성장의 필수 요소임을 입증했습니다. **수직적 확장과 수직적 분할의 한계** * 피그마는 초기 AWS RDS의 가장 큰 인스턴스(r5.24xlarge 등)를 사용하며 수직적 확장(Vertical Scaling)에 의존했으나, 결국 CPU와 IOPS의 물리적 한계에 도달했습니다. * 이를 해결하기 위해 먼저 테이블 단위로 데이터베이스를 나누는 '수직적 분할(Vertical Partitioning)'을 시행하여 특정 도메인(파일, 조직 등)을 별도 데이터베이스 인스턴스로 분리했습니다. * 수직적 분할은 일시적으로 숨통을 틔워주었지만, 각 도메인 내의 데이터가 계속 비대해지면서 단일 인스턴스가 감당할 수 없는 수준에 이르러 결국 수평적 샤딩이 불가피해졌습니다. **Vitess 도입을 통한 수평적 샤딩** * 피그마는 유튜브와 슬랙 등에서 검증된 오픈소스 데이터베이스 클러스터링 시스템인 Vitess를 도입하여 대규모 수평적 확장을 구현했습니다. * Vitess는 애플리케이션 계층에서 복잡한 샤딩 로직을 처리할 필요 없이, SQL 프록시 역할을 수행하며 쿼리를 적절한 샤드(Shard)로 라우팅해주는 기능을 제공합니다. * 데이터 분산의 핵심인 '샤딩 키(Sharding Key)'를 신중하게 선정하여 데이터가 특정 노드에 쏠리는 핫스팟 현상을 방지하고 부하를 고르게 분산시켰습니다. **무중단 마이그레이션과 데이터 정합성 보장** * 서비스를 운영하면서 데이터를 옮기기 위해 Vitess의 'MoveTables' 및 'VReplication' 기능을 활용하여 구형 데이터베이스에서 신규 샤드 클러스터로 데이터를 실시간 복제했습니다. * 마이그레이션 중 데이터 유실이나 오염을 방지하기 위해 'Shadow Mode'를 운영하여, 실제 쓰기 작업을 수행하기 전 구 데이터베이스와 신규 데이터베이스의 결과를 비교 검증했습니다. * 최종 전환 시점에는 짧은 읽기 전용(Read-only) 모드를 거쳐 트래픽을 신규 클러스터로 전환함으로써 사용자 경험에 지장을 주지 않는 제로 다운타임에 가까운 마이그레이션을 달성했습니다. **운영 자동화와 가시성 확보** * 수백 개의 샤드를 효율적으로 관리하기 위해 데이터베이스 팀은 쿼리 분석 및 자동 킬러(Query Killer) 시스템을 구축하여 비효율적인 쿼리가 전체 시스템에 영향을 주지 않도록 제어했습니다. * 대규모 분산 환경에서의 모니터링을 위해 통합 대시보드를 구축하고, 각 샤드의 성능 지표를 실시간으로 추적하여 병목 현상을 사전에 감지하고 대응하는 체계를 갖추었습니다. 성공적인 데이터베이스 스케일링은 단번에 이루어지는 것이 아니라, 수직적 분할로 시간을 벌고 그 사이 견고한 수평적 샤딩 전략을 수립하는 단계적인 접근이 필요합니다. 특히 Vitess와 같은 미들웨어 도입은 인프라 복잡성을 증가시키지만, 장기적으로는 트래픽 성장에 유연하게 대응할 수 있는 가장 확실한 투자입니다. 데이터 성장이 예견되는 초기 단계부터 데이터 간의 관계를 명확히 정의하고 적절한 샤딩 키를 고민하는 것이 미래의 마이그레이션 비용을 줄이는 핵심입니다.

데이터베이스 아키텍처 (새 탭에서 열림)

피그마(Figma)는 급격한 사용자 증가에 따른 데이터베이스 부하 문제를 해결하기 위해 단일 Postgres 인스턴스에서 분산된 Vitess(MySQL 기반) 클러스터로 전환하는 대규모 샤딩 프로젝트를 성공적으로 완수했습니다. 이 과정에서 피그마 엔지니어링 팀은 서비스 중단 없이 테라바이트급 데이터를 이전하기 위해 정교한 실시간 복제 및 검증 시스템을 구축했습니다. 결론적으로 이들은 인프라의 한계를 미리 예측하고, 애플리케이션 계층의 수정을 최소화하면서도 수평적 확장이 가능한 데이터 아키텍처를 확보하게 되었습니다. ### 수직적 확장의 한계와 샤딩의 필연성 * 초기 피그마는 단일 AWS RDS Postgres 인스턴스에 의존했으나, 트래픽이 급증하며 가장 큰 인스턴스 크기로도 쓰기 부하를 감당할 수 없는 임계점에 도달했습니다. * 수직적 확장(Vertical Scaling)과 읽기 복제본(Read Replicas) 추가만으로는 쓰기 성능 문제를 해결할 수 없음을 인지하고, 데이터를 여러 노드에 나누어 저장하는 수평적 확장(Sharding)을 결정했습니다. * 자체적인 샤딩 솔루션을 구축하는 대신, 유튜브 등에서 검증된 오픈소스 데이터베이스 클러스터링 시스템인 Vitess를 도입하여 운영 복잡성을 관리하기로 했습니다. ### Postgres에서 Vitess로의 대규모 이관 전략 * 기존 Postgres 환경에서 MySQL 기반의 Vitess로 전환하는 것은 데이터 모델과 쿼리 호환성 측면에서 큰 도전이었으며, 이를 위해 'FDB(Figma Database)'라는 중간 레이어를 구축했습니다. * **Shadow Writing(새도우 라이팅):** 모든 쓰기 작업을 기존 DB와 새 Vitess DB에 동시에 수행하여 데이터 정합성을 실시간으로 확인했습니다. * **Logical Replication(논리적 복제):** 기존 데이터를 중단 없이 옮기기 위해 CDC(Change Data Capture) 기술을 활용하여 소스 데이터베이스의 변경 사항을 실시간으로 Vitess에 반영했습니다. ### 무중단 컷오버와 정합성 검증 * 데이터 이전의 신뢰성을 확보하기 위해 'Consistency Checker'를 가동하여 기존 DB와 새 DB의 레코드를 지속적으로 비교하고 불일치를 해결했습니다. * **Query Replay:** 실제 운영 트래픽을 복제하여 대상 시스템에 미리 실행해 봄으로써 성능 병목 지점과 쿼리 호환성 문제를 사전에 파악했습니다. * 최종 전환 시에는 아주 짧은 읽기 전용(Read-only) 시간을 가진 후, 트래픽의 방향을 Vitess로 돌리는 방식을 통해 사용자 경험에 영향을 주지 않고 성공적으로 전환했습니다. ### 개발자 경험 보존을 위한 쿼리 라우팅 * 샤딩된 환경에서도 개발자들이 개별 샤드의 위치를 신경 쓰지 않고 개발할 수 있도록 투명한 쿼리 라우팅 시스템을 구현했습니다. * 크로스 샤드 조인(Cross-shard join)과 같이 분산 환경에서 성능이 저하될 수 있는 쿼리들을 모니터링하고, 필요에 따라 스키마 설계를 최적화하여 분산 시스템의 성능 이점을 극대화했습니다. * 애플리케이션 코드의 대대적인 수정 없이도 샤딩된 데이터베이스를 활용할 수 있게 함으로써 피쳐 개발 속도를 유지했습니다. 급격히 성장하는 서비스에서 데이터베이스 확장은 피할 수 없는 과제이며, 이를 위해 서비스 초기부터 데이터 간의 관계(Entity Groups)를 명확히 정의해두는 것이 추후 샤딩 난이도를 낮추는 데 결정적인 역할을 합니다. 또한, 대규모 인프라 변경 시에는 완벽한 자동화보다는 단계적인 검증과 새도우 트래픽 테스트를 통해 데이터 유실 리스크를 최소화하는 보수적인 접근 방식이 권장됩니다.

피그마 내부 이야기: 내부 웹 (새 탭에서 열림)

피그마는 웹 기반 디자인 도구로서 실시간 협업의 복잡성을 해결하기 위해 단일 모놀리스에서 정교한 분산 시스템으로 인프라를 확장해 왔습니다. 이들은 클라이언트측의 WebAssembly 성능과 백엔드의 안정적인 데이터 동기화 메커니즘을 결합하여, 전 세계 수백만 사용자가 동시에 지연 없이 작업할 수 있는 환경을 구축했습니다. 결과적으로 피그마의 기술적 성공은 화려한 기술의 도입보다는 실제 서비스 성장에 맞춘 실용적인 아키텍처 진화와 지속적인 최적화에 뿌리를 두고 있습니다. ### 실시간 협업을 위한 Multiplayer 서버 아키텍처 * 피그마의 핵심은 'Multiplayer'라고 불리는 상태 유지형(Stateful) 서버 시스템입니다. * 사용자가 파일을 열면 특정 서버 프로세스에 할당되며, 클라이언트는 WebSocket을 통해 이 서버와 실시간으로 통신합니다. * 서버는 문서의 현재 상태를 메모리에 유지하면서 여러 사용자의 편집 요청을 순서대로 처리하고, 변경 사항을 즉각적으로 모든 참여자에게 전파하여 충돌을 방지합니다. ### 데이터베이스 확장과 Vitess 도입 * 초기에는 단일 PostgreSQL 인스턴스로 시작했으나, 데이터 사용량이 폭증함에 따라 데이터베이스 확장성 한계에 직면했습니다. * 이를 해결하기 위해 데이터를 논리적으로 나누는 수직 분할(Vertical Partitioning)을 거쳐, 최종적으로는 수평 샤딩(Horizontal Sharding)으로 전환했습니다. * 이 과정에서 YouTube에서 개발한 오픈소스 데이터베이스 클러스터링 시스템인 'Vitess'를 도입하여, 애플리케이션 코드의 수정 없이도 수만 개의 샤드를 효율적으로 관리할 수 있는 구조를 만들었습니다. ### 성능 극대화를 위한 WebAssembly와 C++ 엔진 * 피그마의 그래픽 렌더링 엔진은 성능 극대화를 위해 C++로 작성되었으며, 이를 WebAssembly(Wasm)로 컴파일하여 브라우저에서 실행합니다. * 이는 일반적인 JavaScript 환경보다 훨씬 빠른 연산 속도를 제공하며, 대규모 디자인 파일에서도 데스크톱 앱 수준의 부드러운 사용자 경험을 보장합니다. * 클라이언트와 서버가 동일한 동기화 로직을 공유할 수 있도록 설계하여, 복잡한 협업 시나리오에서도 데이터의 정합성을 유지합니다. ### 시스템 신뢰성을 보장하는 시뮬레이션 테스트 * 동시성 문제가 발생하기 쉬운 실시간 환경의 특성을 고려하여, '결정론적 시뮬레이션(Deterministic Simulation)' 테스트를 수행합니다. * 수천 명의 가상 사용자가 무작위로 편집을 수행하거나 네트워크 지연이 발생하는 극한의 상황을 재현하여 시스템의 안정성을 검증합니다. * 이러한 철저한 테스트 자동화 덕분에 복잡한 인프라 변경이나 기능 업데이트 시에도 사용자 데이터 손실 없이 안정적인 서비스를 유지할 수 있습니다. ### 점진적 진화와 관찰 가능성(Observability) * 피그마는 초기부터 완벽한 시스템을 설계하기보다 서비스 규모에 맞춰 인프라를 단계적으로 개선하는 전략을 취했습니다. * 모든 시스템 구성 요소에 상세한 로깅과 대시보드를 구축하여, 장애가 발생하기 전 징후를 파악하고 신속하게 대응할 수 있는 환경을 조성했습니다. * 인프라 부서는 단순히 서버를 운영하는 것을 넘어, 제품 엔지니어가 확장성 고민 없이 기능을 개발할 수 있도록 추상화된 플랫폼을 제공하는 데 집중합니다. 피그마의 사례는 서비스 초기부터 오버엔지니어링을 하기보다, 병목 지점을 정확히 파악하고 적시에 Vitess나 WebAssembly 같은 핵심 기술을 도입하는 것이 얼마나 중요한지 보여줍니다. 실시간 협업 서비스를 설계한다면 상태 유지형 서버의 안정성과 데이터베이스 샤딩 전략을 최우선으로 고려할 것을 추천합니다.