data-migration

4 개의 포스트

meta4분 읽기큐레이션 요약

메타급 규모에서 데이터 수집 시스템 마이그레이션하기

Meta는 수 페타바이트 규모의 소셜 그래프 데이터를 매일 MySQL에서 데이터 웨어하우스로 수집하는 시스템을 기존 고객 소유 파이프라인에서 단순한 자체 관리형 아키텍처로 전환했다. 이 과정에서 수천 개 작업을 단계적으로 검증하고, 데이터 품질·지연 시간·리소스 사용량을 비교하며 안전하게 마이그레이션했다. 섀도 작업, 리버스 섀도, 자동화된 데이터 품질 분석, 신속한 롤백 체계를 통해 전체 워크로드를 성공적으로 이전하고 레거시 시스템을 폐기했다. ## 대규모 데이터 수집 시스템 개편 배경 - Meta의 소셜 그래프는 세계 최대 규모의 MySQL 환경 중 하나에서 운영된다. - 데이터 수집 시스템은 매일 수 페타바이트의 데이터를 증분 방식으로 데이터 웨어하우스에 적재한다. - 적재된 데이터는 다음과 같은 용도로 활용된다. - 분석 및 리포팅 - 머신러닝 모델 학습 - 제품 개발 - 사내 의사결정 및 데이터 기반 서비스 - 기존 시스템은 소규모에서는 효과적이었지만, 규모가 커지면서 엄격해진 데이터 적재 시간 요구사항을 안정적으로 충족하기 어려워졌다. - 이에 따라 고객 팀이 직접 운영하던 파이프라인을 단순한 자체 관리형 데이터 웨어하우스 서비스로 대체했다. ## 마이그레이션 성공 기준 각 작업은 다음 조건을 충족해야 다음 단계로 진행됐다. - **데이터 품질 일치** - 기존 시스템과 신규 시스템의 행 개수를 비교했다. - 데이터 체크섬을 비교해 두 시스템의 결과가 완전히 일치하는지 검증했다. - **적재 지연 시간 개선** - 신규 시스템의 데이터 적재 지연 시간이 기존보다 개선되거나 최소한 동등해야 했다. - **리소스 사용량 개선** - 컴퓨팅 및 스토리지 사용량이 기존보다 줄어들거나 최소한 비슷해야 했다. - **핵심 테이블 추가 기준** - 중요 테이블은 해당 데이터를 사용하는 팀들과 별도의 마이그레이션 조건을 합의했다. ## 1단계: 섀도 단계 - 사전 운영 환경에 신규 시스템 기반의 섀도 작업을 생성했다. - 섀도 작업은 운영 작업과 동일한 실제 데이터를 읽지만, 별도의 섀도 테이블에 결과를 기록했다. - 실제 운영 데이터와 동작을 사용하므로 다음과 같은 문제를 사전에 발견할 수 있었다. - 데이터 변환 오류 - 특수한 데이터 패턴에서 발생하는 예외 - 신규 시스템의 리소스 부족 - 운영 테이블과 섀도 테이블의 행 개수 및 체크섬을 지속적으로 비교했다. - 불일치가 발생하면 원인을 조사하고 사전 운영 환경에 수정 사항을 배포한 뒤 재검증했다. - 동시에 섀도 작업의 컴퓨팅·스토리지 사용량을 측정해 운영 환경에 충분한 자원이 있는지 확인했다. - 기준을 통과한 작업은 운영 환경에서도 안정적으로 실행되는지 추가로 검증했다. ## 2단계: 리버스 섀도 단계 - 신규 시스템의 섀도 작업이 운영 테이블에 데이터를 기록하도록 전환했다. - 기존 시스템의 운영 작업은 섀도 테이블에 데이터를 기록하게 했다. - 이로써 신규 시스템이 실제 운영 작업이 되고, 기존 시스템은 비교용 섀도 작업으로 역할이 바뀌었다. - 이 방식의 장점은 다음과 같다. - 전환 이후에도 기존 시스템과 신규 시스템의 결과를 계속 비교할 수 있다. - 데이터 불일치가 발견되면 기존 작업을 다시 구성하지 않고 즉시 되돌릴 수 있다. - 신규 시스템이 실제 운영 환경에서 지속적으로 안정적인지 확인할 수 있다. ## 3단계: 마이그레이션 정리 - 두 시스템의 결과를 계속 비교하면서 불일치 여부를 감시했다. - 문제가 발견되지 않으면 기존 시스템에서 실행 중인 섀도 작업을 제거했다. - 이후 신규 시스템이 운영 작업으로서 데이터 적재를 계속 수행하며 마이그레이션이 완료됐다. ## 자동화된 데이터 품질 분석 도구 - 각 섀도 테이블 파티션과 대응하는 운영 테이블 파티션을 읽어 행 개수와 체크섬을 비교했다. - 불일치 내역은 Meta의 실시간 데이터 분석 시스템인 Scuba에 기록했다. - 매시간 Scuba 로그를 분석해 불일치를 일으킨 실제 예시 행을 찾았다. - 원인 분석에 필요한 상세 디버깅 정보도 다시 Scuba에 기록했다. - 이를 통해 엔지니어는 다음을 빠르게 판단할 수 있었다. - 불일치의 근본 원인 - 이미 알려진 문제인지 여부 - 해당 문제가 수정 진행 중인지 여부 - 이 도구는 마이그레이션 이후에도 릴리스 검증 과정에서 계속 사용되고 있다. ## CDC 기반 구조와 롤백 문제 - 기존 시스템과 신규 시스템 모두 CDC(Change Data Capture)를 사용해 변경분을 대상 테이블에 증분 반영했다. - 각 작업은 다음 테이블을 관리한다. - 소스 데이터베이스의 전체 덤프를 저장하는 내부 테이블 - 소스 변경 사항을 저장하는 델타 테이블 - 데이터 소비자가 사용하는 대상 테이블 - 작업 엔터티, 테이블 이름, 스키마 등의 메타데이터는 중앙 관리 서비스가 관리했다. - CDC에서는 이전에 적재된 데이터가 이후 데이터 생성에 다시 사용된다. - 따라서 과거 데이터에 문제가 있으면 해당 문제가 신규 적재 데이터로 계속 전파될 수 있다. - 마이그레이션 후 문제가 발생하면 잘못된 데이터가 계속 확산되는 것을 막기 위해 신속한 롤백이 필요했다. ## 조기 신호와 신속한 롤백 - 데이터 소비자가 문제를 발견할 때까지 기다리지 않고, 리버스 섀도 단계에서 두 시스템의 결과를 지속적으로 비교했다. - 이를 통해 마이그레이션 성공 여부에 대한 조기 신호를 확보했다. - 문제가 발견되면 기존 시스템이 이미 섀도 작업으로 실행 중이므로 빠르게 이전 상태로 되돌릴 수 있었다. - 마이그레이션 작업을 처음부터 다시 생성하거나 재구성하지 않아도 된다는 점이 롤백 위험을 줄였다. 대규모 데이터 시스템을 이전할 때는 한 번에 전환하기보다, 실제 데이터 기반의 섀도 실행과 양방향 역할 전환을 통해 검증하는 방식이 안전하다. 특히 행 개수·체크섬·지연 시간·리소스 사용량을 자동 비교하고, 문제가 생겼을 때 즉시 롤백할 수 있는 구조를 마이그레이션 설계에 포함하는 것이 중요하다.

원문 읽기(새 탭에서 열림)
line원문

LINE 앱의 다자간 대화 기능 통합 (새 탭에서 열림)

LINE은 서로 다른 용도로 운영되던 '여러 명과의 대화'와 '그룹' 기능을 '그룹 대화'라는 단일 모델로 통합하여 사용자 경험을 개선하고 시스템 리소스를 효율화했습니다. 기존의 이원화된 구조에서 발생하던 기능 제한과 중복 대화방 생성 문제를 해결하기 위해 통합 API 설계 및 점진적인 데이터 마이그레이션을 수행했습니다. 이를 통해 사용자는 생성 방식에 관계없이 모든 기능을 동일하게 사용할 수 있게 되었으며, 중복 방 생성 비율을 획기적으로 낮추는 기술적 성과를 거두었습니다. ### 이원화된 대화 모델의 한계 * **여러 명과의 대화(Room):** 별도의 승인 없이 즉시 대화가 가능하지만, 일시적 목적으로 설계되어 앨범이나 노트 같은 그룹 전용 기능을 사용할 수 없었습니다. * **그룹(Group):** 초대 승인 절차가 필요한 대신 장기적인 소통에 적합한 다양한 편의 기능을 제공했으나, 초기 진입 장벽이 존재했습니다. * **사용자 혼란 및 리소스 낭비:** 사용자들이 두 모델의 차이를 이해하지 못해 기능이 제한된 방을 잘못 만들거나, 동일한 구성원의 대화방을 중복으로 생성하여 서버와 클라이언트의 리소스가 불필요하게 소모되었습니다. ### 그룹 대화로의 기술적 마이그레이션 * **점진적 API 전환:** 새로운 그룹 대화 API를 설계한 후, '이중 읽기(Dual Read)' 방식을 도입하여 이전 API와의 호환성을 유지하며 단계적으로 전환을 진행했습니다. * **데이터 배치 처리:** 기존의 모든 그룹 데이터를 배치 처리를 통해 신규 모델로 이관하였으며, 안정성이 확인된 후 이중 읽기를 중단하고 그룹 대화 시스템으로 단일화했습니다. * **통합 모델 확립:** 그룹 모델의 아키텍처를 기반으로 여러 명과의 대화 모델을 흡수하여, 향후 추가될 모든 신규 기능이 모든 대화방에 동일하게 적용되도록 구조를 개선했습니다. ### 사용자 경험 최적화 및 운영 성과 * **초대 메커니즘 단일화:** 대화방 생성 UI를 통합하여 '즉시 참여'와 '수락 후 참여' 여부를 사용자가 상황에 맞게 직접 선택할 수 있도록 개선했습니다. * **중복 생성 방지 힌트:** 동일한 구성원으로 새로운 방을 만들려 할 때 기존 대화방을 안내하는 '힌트' 기능을 제공하여 불필요한 대화 목록 생성을 방지했습니다. * **정량적 성과:** 프로젝트 결과, 동일 구성원으로 중복 생성되는 대화방 비율이 기존 15%에서 0.78%로 급감하며 데이터 관리 효율성이 크게 향상되었습니다. 대규모 서비스에서 유사한 기능을 통합할 때는 사용자에게 갑작스러운 변화를 강요하기보다, 점진적인 API 전환과 기능적 일원화를 통해 자연스러운 이동을 유도하는 것이 중요합니다. 이번 통합 사례는 시스템의 복잡성을 줄이면서도 데이터 일관성과 사용자 편의성을 동시에 확보할 수 있는 구체적인 마이그레이션 전략을 보여줍니다.

toss원문

레거시 결제 원장을 확장 가능한 시스템으로 (새 탭에서 열림)

토스페이먼츠는 20년 된 레거시 결제 원장의 구조적 한계와 도메인 간 강한 결합을 해결하기 위해 MySQL 기반의 신규 원장 시스템을 구축했습니다. 데이터 불변성을 보장하는 INSERT-only 원칙과 이벤트 기반 아키텍처를 도입하여 복합 결제 지원 등 비즈니스 확장성을 확보했습니다. 이 과정에서 발생한 데이터 불일치와 타임아웃 문제를 해결하며 시스템의 자가 회복 능력을 강화하고 안정적인 운영 환경을 마련했습니다. ### 레거시 원장 시스템의 한계와 과제 - **데이터 구조의 불일치:** 결제수단별로 테이블 구조가 다르고, 동일한 성격의 데이터가 서로 다른 테이블에 저장되어 유지보수와 온보딩에 큰 비용이 발생했습니다. - **도메인 간 강한 결합:** 결제, 정산, 회계 등 여러 서비스가 하나의 원장 테이블과 컬럼을 공유하여, 작은 기능 수정 시에도 전사적인 영향도 분석이 필요했습니다. - **구조적 확장성 부족:** 결제와 결제수단이 1:1 관계로 묶여 있어, 더치페이나 복합 결제(카드+포인트)와 같은 현대적인 결제 시나리오를 지원할 수 없었습니다. ### 신규 원장 설계의 3가지 전략 - **데이터 불변성과 일관성:** 모든 승인 내역을 공통 테이블(`approve`)에 저장하고, 수정 대신 INSERT-only 방식을 채택하여 데이터의 정합성을 높이고 데드락을 방지했습니다. - **이벤트 기반의 도메인 분리:** 각 도메인이 직접 DB를 조회하는 대신 Kafka 이벤트를 구독하여 데이터를 처리하게 함으로써 도메인 간 의존성을 제거했습니다. - **결제와 승인 개념의 분리:** '결제'는 주문의 상태를, '승인'은 실제 결제수단의 실행을 의미하도록 분리하여 하나의 결제에 여러 승인 수단이 연결될 수 있는 유연한 구조를 만들었습니다. ### 무중단 마이그레이션 및 정합성 검증 - **비동기 점진적 적재:** 실서비스 장애를 방지하기 위해 기존 원장에 먼저 저장한 후, 신규 원장에는 별도의 ThreadPool을 통한 비동기 방식으로 데이터를 적재했습니다. - **검증 배치 운영:** 비동기 적재 중 발생할 수 있는 누락을 방지하기 위해, 매 5분마다 Read-Only DB를 기반으로 기존 원장과 신규 원장의 데이터를 비교하고 보정하는 배치를 실행했습니다. - **고성능 이관 작업:** 수억 건의 데이터 이관을 위해 Bulk Insert를 도입하고, 네트워크 지연 최소화를 위해 마이그레이션 서버를 DB와 동일한 가용 영역(AZ)에 배치했습니다. ### 운영 중 장애 대응과 시스템 고도화 - **쿼리 최적화:** 옵티마이저의 판단 오류로 발생한 풀 스캔(Full Scan) 문제를 인덱스 힌트(Index Hint) 추가와 롤백 시스템을 통해 빠르게 해결했습니다. - **타임아웃 및 정합성 관리:** MSA 구조에서 서버 간 타임아웃 설정을 일치시키고, 외부 원천사와의 상태 불일치를 해결하기 위한 망취소(Network Cancellation) 로직을 강화했습니다. - **이벤트 처리의 신뢰성:** 아웃박스(Outbox) 패턴과 로그 기반 복구를 통해 이벤트 누락을 방지하고, 헤더에 멱등키를 포함해 중복 이벤트 처리 문제를 해결했습니다. 신규 시스템으로의 전환은 단순한 DB 교체가 아니라 시스템의 지속 가능성을 확보하는 과정입니다. 초기 설계의 완벽함보다 중요한 것은 운영 중 발생하는 예외 상황에 시스템이 스스로 대응하고 회복할 수 있는 '자가 회복 구조'를 갖추는 것이며, 이를 위해 데이터 보정 배치와 로깅 시스템 같은 안전장치를 반드시 고려해야 합니다.

figma3분 읽기큐레이션 요약

피그마 내부: 원격 인

원격 인턴십은 관계 형성과 업무 맥락 습득에 어려움이 있을 수 있지만, 의도적으로 소통 기회를 만들고 적극적으로 질문하면 충분히 의미 있는 경험이 될 수 있다. Jenning Chen은 Figma에서 스타일 피커 개선 프로젝트를 맡아 검색, 색상 스타일 목록 보기, 텍스트 스타일 지표 표시를 구현했으며, 인턴도 실제 사용자 기능의 기획부터 출시까지 주도할 수 있음을 보여준다. 이 과정에서 협업과 피드백, 대규모 데이터 마이그레이션을 경험하며 제품 이해도와 기술 역량을 함께 넓혔다. ## 원격 환경에서의 따뜻한 온보딩 - 입사 직후 Slack 환영 메시지와 온라인 커피챗을 통해 팀원들과 관계를 형성했다. - 동료들이 만든 Figma 환영 카드와 낙서가 담긴 파일을 받으며 대면 없이도 회사의 개방적 문화를 느꼈다. - 원격 근무에서도 신입 구성원이 소속감을 느끼도록 의도적인 환영 절차가 중요했다. ## 원격 인턴십의 우려와 관계 형성 - Slack이나 이메일에서 메시지를 놓치거나 오해할 가능성, 팀원들과 깊은 관계를 만들기 어려울 가능성을 걱정했다. - 회사 전체 쇼앤텔, 기술 강연, 일대일 미팅 등을 통해 다른 팀의 업무와 구성원들의 관심사를 접했다. - 온라인 요리 수업, 방 탈출, 보물찾기 같은 활동은 업무 외적인 관계 형성에도 도움이 됐다. - 원격 환경에서는 우연한 대화가 줄어드는 대신, 조직이 교류 기회를 의도적으로 설계해야 했다. ## 제품 이해도와 질문하는 문화 - 프로젝트를 시작하기 전 Figma의 기능과 디자인 용어를 충분히 익혀야 했다. - 멘토, 팀원, Slack 채널에 적극적으로 질문하며 제품과 업무 맥락을 파악했다. - 문제가 생겼을 때 동료들이 기꺼이 화상 통화를 열어 함께 해결해 주었고, 이는 원격 환경에서도 빠르게 배울 수 있는 기반이 됐다. ## 스타일 피커의 기존 문제 - 스타일 피커는 페인트, 텍스트, 효과, 레이아웃 그리드 스타일을 찾아 적용하는 기능이다. - 스타일 수가 늘어나면서 기존 인터페이스가 복잡해졌다. - 긴 목록을 수동으로 스크롤해야 했고, 특히 색상 스타일의 이름처럼 중요한 정보가 잘 드러나지 않았다. - 사용자가 원하는 스타일을 빠르게 찾고 비교할 수 있도록 개선 요구가 컸다. ## 스타일 피커 개선 기능 - **검색 기능** - 사용자가 몇 글자만 입력해 원하는 스타일을 빠르게 찾을 수 있게 했다. - **색상 스타일 목록 보기** - 기존 격자 보기에서는 가려지던 스타일 이름을 썸네일 옆에 명확히 표시했다. - 목록 보기와 격자 보기를 전환할 수 있도록 했다. - **텍스트 스타일 지표 표시** - 텍스트 스타일을 선택할 때 중요한 글꼴 크기와 줄 높이를 직접 보여줬다. - 스타일을 적용하기 전에 핵심 속성을 확인할 수 있어 선택 시간을 줄였다. ## 여러 기술 스택을 활용한 구현 - 디자인 시스템 팀의 프로젝트 특성상 에디터부터 백엔드까지 전체 기술 스택을 다뤘다. - 에디터에서는 TypeScript와 C++를, 백엔드에서는 Ruby를 사용했다. - 단일 기능을 구현하면서 프론트엔드, 에디터 내부 로직, 백엔드 데이터 처리까지 폭넓은 경험을 쌓았다. ## 출시 과정의 협업과 기술적 난관 - 완성된 기능을 사내 쇼앤텔에서 발표하고 동료들의 피드백을 받았다. - 출시 전 수백만 개의 기존 텍스트 스타일에 글꼴 크기와 줄 높이 메타데이터를 추가하는 마이그레이션이 필요했다. - 해당 마이그레이션만 실행하는 데 하루가 걸렸으며, 리뷰 피드백 반영과 출시 직전 버그 수정도 진행했다. - 구현 과정의 어려움은 제품 구조와 데이터 흐름을 더 깊이 이해하는 계기가 됐다. ## 실용적인 시사점 원격 인턴십이나 신규 프로젝트에서는 정기적인 일대일 미팅, 공개적인 질문 채널, 업무 외 교류 기회를 미리 마련하는 것이 효과적이다. 또한 작은 기능이라도 사용자 문제를 명확히 정의하고, 기존 데이터와 마이그레이션 비용까지 고려하면 실제 출시 가능한 제품으로 발전시킬 수 있다.

원문 읽기(새 탭에서 열림)