JHyeok

MongoDB.local Seoul 2023

September 17, 2023☕️ 5 min read

작년에 이어 이번에도 MongoDB.local Seoul 2023을 다녀왔습니다.

DevOps Engineer의 저녁이 있는 삶, MongoDB Atlas 도입기 (임성빈 프로, 삼성전자 DA사업부 AI Solution 그룹)

  • 스마트홈 서비스 MongoDB Atlas 도입, 샤딩까지 어떻게 했는지
  • MongoDB Atlas를 도입하고 DB 장애건수 0건

사용자 기기를 등록하는 서버 DB를 MySQL로 2014년에 처음 시작 (개발 및 운영 시작)

  • 2015년에 스마트홈에 실제 기기에서 발생하는 실시간 이벤트 데이터를 수집하고 이 수집된 데이터를 전처리해서 외부에 공유하는 API를 오픈
  • 실제 가전의 데이터가 JSON 포맷

NoSQL 도입 결정

  • 2015년에 EC2에 MongoDB 커뮤니티 버전을 사용해서 자체 구축해서 사용
  • 초기에는 문제가 없었음
  • 트래픽이 적었기 때문, 트래픽이 늘어나면서 점점 병목이 발생
  • MongoDB DBA 인력 없음
  • 커뮤니티 버전 오픈소스에 대한 기술 지원을 받기 어려웠음
  • 가용성 보장을 위해 MongoDB 기술적인 백그라운드가 기반이 되어야지 잘 구성을 할 수 있는데 좀 부족했음
  • 모니터링을 하는데 어려움을 느꼈음
  • Max IOPS 30k (peak season)

마이그레이션

  • MongoDB Cluster(EC2)에서 MongoDB Atlas로 마이그레이션
  • Mongomirror 유틸리티를 사용하는 방식으로 결정

아키텍처

  • Producer(WAS) - RabbitMQ Cluster - Consumer(Warker) - MongoDB 컬력센에 데이터 Write

마이그레이션 이후 아키텍처

  • Smart Home VPC / MongoDB Atlas VPC를 분리시킴

마이그레이션 이후 효과

  • 평균 응답속도 개선: 8ms -> 3ms
  • Disk read lateny 감소: 최대3s/평균25ms -> 최대18ms/평균1ms
  • 이슈가 19건에서 0건으로 감소

Replica Set to Sharded Cluster

  • 주로 기기 상태 이벤트에 대한 updates
  • 에어컨 등 가전제품 사용이 많은여름 성수기에 workload 트래픽 급증
  • Replica Set 기반 스케일업 전략으로 peak 시즌의 워크로드를 다루는데 한계 직면, shard 환경 기반 스케일업/아웃 전략 추진
  • 아키텍처가 샤드 라우팅 엔드포인트로 변경 (커녁센스트링의 변경이 없었기 때문에 애플리케이션 코드 배포 없이 진행)

마이그레이션 이후 결과

  • 업데이트 오퍼레이션이 25k에서 2샤드가 균등하게 10k-15k씩 분배
  • 커넥션 수도 샤드별로 균등하게 밸런싱
  • Disk IOPS, Disk Queue Depth 등 샤드 전환후에 2분의 1로 감소

결론

  • 장애 관련 이슈 0건 (2022년 5월 - NOW)
  • High Availability 확보
  • Workload Throughput 향상
  • MongoDB 관리 overhead를 줄이고, Biz logic 및 Application 개발에 집중

What’s New in MongoDB 7.0 (김준 전무, MongoDB Korea)

개선된 개발자 경험

  • New in Query: operators, variables and indexes
  • Wildcard indexes 지원
  • Bitwise 연산자, 백분위수 연산자
  • 시스템 변수 $$USER_ROLES 추가
  • 시계열 컬렉션에 대한 Update/Delete 지원
  • 임의의 도큐먼트에 대한 단일, 다중 삭제 지원
  • 확장성 향상
  • 성능 최적화
  • 부분적인 TTL 인덱싱 지원
  • 쿼리 수행 속도 향상
  • 체인지스트림
  • 대규모 이벤트 처리에 대한 확장
  • Shard Key advisor commands 지원
  • sk를 제공하지 않고도 UpdateOne 사용

성능

  • Big Routing Table로 인한 성능 저하
  • auto-merger
  • 동일한 샤드 내 연속되어져 있는 청크를 병합 빠른실행, 조각모음 절차사항 많은 부분을 차지함, 마이그레이션 실행하지 않음
  • 향상된 쿼리 성능
  • $group, $project, $match, $sort, $lookup
  • 7.0에서 쿼리 엔진이 변경됨

보안

  • 데이터베이스 엑세스를 위한 OpenID Connect 지원

마이그레이션

  • Cluster-to-Cluster Sync (mongosync)
  • 동일하거나 다른 환경에 있는 두 MongoDB Cluster간에 지속적인 데이터 동기화(단방향)
  • 한 클러스가 망가지면 다른 클러스터 사용 가능
  • 워크로드를 나눠서 처리할 수 있다는 의미
  • 다른 클러스터에서 분석 작업 가능
  • 데이터가 싱크되어 있기 때문
  • Atlas Live Migrate 활용

Streaming Processing을 활용한 실시간 이벤트 처리 (김규동 상무, MongoDB Korea)

Schema 변경에 빠른 대응 (이벤트들은 페이로드 변경이 있음)

  • 발생하는 이벤트들을 확인하려면 배치 형태의 애플리케이션이 늘어날 수 밖에 없음
  • 이벤트에 대한 양도 늘어남

MongoDB는 연속되는 데이터에 대한 강력한 연산 (어그리게이션 파이프라인을 가지고 있음)

  • Stage 1번 연산 - Stage 2번 연산 같은 형태로 쿼리를 작성
  • 파이프라인이라는 형태로 여러가지 Stage를 조합해서 그 안에서 원하는 데이터를 찾게 하는 핵심이 있음

Streaming Processing

  • 무한 반복 쿼리 수행, 강력한 Pipeline 연산
  • Aggregate, Filter, Route, Alert, Emit

서비스의 이름은 Atlas Streaming Processing

  • 도큐먼트 모델을 이용한 유연한 스키마
  • 유효성 검사 및 상태 저장 Window Processing
  • MongoDB Atlas를 활용하여 실시간 생성되는 데이터와 기존 데이터를 결합
  • 별도의 애플리케이션을 만들지 않아도 됨
  • 개발자가 신경을 덜 쓸 수 있음
  • 이벤트에 대한 데이터가 만들어질 때 마다 유효성 검사, 개발자분들이 개발하지 않고
  • 서비스가 서버리스로 제공되기 때문에 쿼리가 실행될 때마다 필요한 자원들이 유기적으로 할당되기 때문에 신경을 덜 쓸 수 있음
  • 개발에 대한 생산성에 대해서 중요하게 생각하는데 그 부분을 제공함 (가장 큰 장점이자 지향점)

Connection Registry (Key Store) / Steam Instance
Steam에 대한 그룹 - Window (TumblingWindow, HoppingWindow)

  • 1 분이라는 시간 동안에 데이터를 계산할거야
  • 주식 같은 경우에 30분 평균, 10분 평균, 1분에 한 번씩 10분동안의 평균 주가 지수를 계산하는 부분들 이런 범위 인터벌에 대한 레인지에 대한 평균을 계산하겠다.
  • 시간동안의 평균을 움직이는 형태로 가져가기 위한 Window 제공

Pipeline

  • 다양한 연산 제공
  • Life Cycle Management 제공
  • 서버리스한 형태로 작동
  • 이벤트 스트리밍 100만 건이 들어왔을 때, 일시적으로 많은 리소스를 할당받는 형태와 같은 것이 정의가 가능함

Relational Migrator를 활용한 애플리케이션 현대화 (조건호 상무, MongoDB Korea)

  • 해당 발표는 조금 재미있게 풀어가셨으며 아래 내용을 진지하게 생각하지 않아도 됨

Relational Migrator 이번에 GA

  • SQL DB를 MongoDB로 전환 (스키마 변환, 데이터 복제)

Why NoSQL?

  • SQL을 사용하지 말자가 아니라 여러가지 DB를 사용하자

현재의 애플리케이션 변화

  • 데이터 증가 속도가 가파르다
  • 우리 애플리케이션이 처리할 데이터 양은 점점 늘어난다
  • SQL은 JOIN을 기반으로 한 DB
    • 성능을 포기하던가, 엄청난 비용을 들여서 하드웨어 스펙 보안
  • 사업 환경의 변화
    • 변화에 대한 신속한 대응/혁신 -> 유연한 스키마가 필요
  • 개발 주기의 단축
  • 전체적인 개발 프로세스의 시간이 줄어듬
  • 도메인에서부터 Top-Down을 시작하자가 요즘의 추세인데 이것을 DB에도 적용
    • SQL, NoSQL
    • SQL은 row-col table 부터 시작
    • NoSQL은 애플리케이션이 사용할 데이터를 그냥 스토리지에 저장

MSA가 어려운 이유

  • 데이터 이동
  • 언어장벽

MSA로 가는 새로운 길

  • MongoDB 하나를 선택
  • 하나의 기종이기 때문에 거기에 따른 ETL을 줄여나갈 수 있음

SQL로 부터 빠르고 안정적으로 MongoDB로의 전환

  • 데모 시청
  • Relational Migrator 다운로드
  • 샘플데이터가 있기 때문에 연습 가능
  • 기존 워크로드에서 가벼운 것부터 연습
  • 그 이후에 직접적으로 마이그레이션 (파트너 지원도 해줌)

더욱 안전한 MongoDB Atlas on AWS 사용 방법 (윤기원 파트너 솔루션 아키텍트, AWS)

AWS PrivateLink를 활용한 사용자 VPC - Atlas간 보안 접속

  • 1 WAY 단방향 통신
  • 보통 전통적인 IP 필터링 방식 사용

AWS KMS, IAM을 이용한 데이터 암호화

  • 데모 시청

Riot Games Korea: Why MongoDB? Why Atlas? (김동인 소프트웨어 엔지니어, RiotGames)

Riot Games Korea 개발팀에서 하는 일

  • PC방 비즈니스
  • 모바일 상점(store.leagueoflegends.co.kr)
  • 한국 게임 퍼블리싱(계정, Player Behavior)
  • 이스포츠 데이터(LCK)

한국 PC방에서 Riot의 게임

  • 게임 동시접속 최대 약 80만
  • PC방 동시접속 최대 약 20만
  • PC 방 세션 1년 약 40억 건
  • 이를 서포트해줄 엔진, 서비스가 필요

플레이어에게 올챔프 혜택, 업주분들에게 과금 및 서비스 제공

  • 업주분들에게는 그 플레이어가 얼마나 게임을 했는지 측정해서 과금 필요
  • 엔지니어 2-6명의 작은 팀
  • 데이터 저장소로 MongoDB를 선택

DB 요구사항

  • 잦은 스키마 변화에도 큰 문제 없이 서비스 개발/운영
  • 필요할 경우 데이터베이스의 수평적 확장 용이
  • (5년전) 처음에는 EC2에 MongoDB 커뮤니티 버전을 설치해서 구성
  • version 3.6.0
  • IOPS 3000

쿼리 성능

  • 1년마다 약 40억개의 세션 관련 도큐먼트가 쌓임
  • 2년 반이 지나고 보니 컬렉션 내 도큐먼트가 무려 100억개에 달함

운영의 부담

  • 매일 크론 잡을 통해 백업 저장
  • 복구 작업이 필요하다면
  • 서비스 중단, 데이터 손실 없이 진행되기 위해 과정이 복잡하고 실수 가능성이 높음
  • AWS 점검
  • AWS EC2의 scheduled maintenance
  • 수동으로 EC2를 껐다 켜고 다시 DB 구동
  • 그동안의 서비스는?
  • 버전 업그레이드
  • 다가오는 현 버전의 EOL
  • 게임 다운타임동안 버전 업그레이드를 무사히 마치고 테스트까지 끝낼 수 있을까?
  • major 버전업이라면?

필요했던 추가 기능

  • 데이터를 보고 싶어하는 stakeholder들이 많은 수 늘어남
  • Chart, Metric 등의 필요성

MongoDB Atlas로의 마이그레이션

  • 클러스터 생성
  • Web UI로 쉽게 가능
  • mongomirror 사용
  • 100억건 기준 sync 10시간
  • 성능 테스트 및 데이터 검증
  • 컷오버
  • 게임서비스 정기점검 때 진행
  • 미러 테일링의 log이 0임을 확인
  • 새로운 DB에 연결된 코드를 배포
  • 테일링은 종료

마이그레이션 그 이후

  • 운영 부담 경감
  • 자동 백업
  • 모니터링
  • Slow query 발생 시 빠르게 모니터링 가능
  • Performance Advisor
  • DB 성능에 도움되는 제안들을 볼 수 있음
  • 주로 인덱스 추가/제거에 참고
  • 차트
  • 모니터링, 인사이트를 위해서 주로 사용
  • 동향 파악
  • Online Archive

JHyeok

JaeHyeok Kim

Written by JaeHyeok Kim
GitHubMedium

© 2019 - 2024, Built with Gatsby