prometheus

3 개의 포스트

신뢰성 향상을 위한 SLI/SLO 활용 1편 - SLI/SLO 프레임워크 및 서비스 상태 확인 도구 LINE Status 개발기 (새 탭에서 열림)

서비스 신뢰성을 관리하기 위한 공통 언어로서 SLI/SLO를 전사적으로 확산하기 위해, 반복되는 도입 과정을 표준화한 'SLI/SLO 프레임워크'를 정립하고 이를 시각화하는 'LINE Status' 도구를 개발했습니다. 단순한 장애 여부가 아닌 사용자 경험(CUJ) 관점에서 서비스 상태를 정의함으로써, 기술적 지표에 매몰되지 않고 조직 전체가 동일한 기준으로 서비스 품질을 파악하고 의사소통할 수 있는 기반을 마련했습니다. 이러한 체계는 운영 자동화와 데이터 기반의 거버넌스 구축을 가능하게 하여 장기적인 서비스 신뢰성 향상을 이끌어냅니다. **SLI/SLO 프레임워크의 5단계 구조** * **CUJ 선정 및 SLI 정의:** 서비스의 본질적인 사용자 경험을 파악하여 핵심 여정(Critical User Journey)을 선정하고, 이를 측정 가능한 지표인 SLI로 구체화합니다. * **계측 및 메트릭 설계:** Prometheus나 OpenTelemetry의 표준 네이밍 규칙을 적용하여 CUJ에 적합한 메트릭을 설계하고 구현합니다. * **대시보드 및 기록 규칙 구성:** Grafana를 통해 SLO 달성 여부를 직관적으로 확인하며, 복잡한 연산은 Recording Rules로 사전 처리하여 조회 효율을 높입니다. * **SLO 및 알람 설정:** 28일 롤링 윈도우 기반으로 초기 SLO를 설정하고, 단계적으로 목표치를 확정하며 대응을 위한 Runbook을 정의합니다. * **에러 예산 기반 운영:** 릴리스 속도와 안정성 사이의 균형을 맞추고, 정기적인 리뷰를 통해 목표를 점검하며 거버넌스를 확립합니다. **사용자 경험 중심의 LINE Status 도구** * **CUJ 기반 상태 정의:** 단순한 서버 장애 유무가 아니라, 사용자가 서비스를 원활히 이용하고 있는지(User Happiness)를 기준으로 상태를 판단합니다. * **기능 중심의 명칭 노출:** "API 500 에러"와 같은 기술 용어 대신 "메시지 전송", "읽음 표시" 등 사용자가 체감하는 기능 단위로 상태를 표현하여 직관성을 높였습니다. * **자동화된 상태 관리:** 각 서비스의 SLI/SLO 알림을 웹훅(Webhook)으로 수집하여 실시간으로 상태를 갱신하고, 이벤트 발생 이력을 DB에 저장해 추적합니다. * **시각적 편의 기능:** AI를 활용한 한 줄 분석 요약, 직관적인 신호등 색상 표현, 타임라인 기반의 이벤트 히스토리 페이지 등을 제공합니다. **AI 활용과 프레임워크의 연결 효과** * **바이브 코딩과 명확한 기획:** 프런트엔드 개발 경험이 부족하더라도 AI를 적극 활용하여 UI를 구현했으며, 마크다운 형식의 구체적인 요구사항 정의가 결과물의 완성도를 결정함을 확인했습니다. * **공통 창구 제공:** 개발자와 운영자가 각자의 대시보드를 보는 대신, LINE Status라는 단일 창구를 통해 사용자 경험에 미치는 영향을 즉각적으로 파악할 수 있습니다. * **확산 가능한 운영 기반:** 프레임워크를 통해 서비스를 정의하고 그 결과를 LINE Status에 등록하는 일련의 과정을 통해, 특정 인원에 의존하지 않는 지속 가능한 신뢰성 관리 체계를 구축했습니다. **실용적인 결론** 성공적인 SLI/SLO 도입을 위해서는 기술적 측정보다 **'사용자 경험(CUJ)의 명확한 정의'**와 **'조직 간의 공통 언어 수립'**이 선행되어야 합니다. 또한, 표준화된 템플릿과 자동화된 상태 확인 도구를 결합함으로써 커뮤니케이션 비용을 줄이고 데이터에 기반한 의사결정 속도를 높일 수 있습니다.

레거시 인프라 작살내고 하이브리드 클라우드 만든 썰 (새 탭에서 열림)

토스페이먼츠는 20년 된 레거시 인프라의 비효율성을 극복하기 위해 오픈소스 기반의 OpenStack 프라이빗 클라우드를 직접 구축하고, 이를 퍼블릭 클라우드와 결합한 'Active-Active 하이브리드 클라우드' 환경을 구현했습니다. 단 2명의 엔지니어가 운영 경험 없이 시작했음에도 불구하고 자동화와 고가용성 전략을 통해 인프라 제어권을 100% 확보했으며, 결과적으로 어떤 환경에서도 즉시 배포 가능한 유연한 기술 기반을 마련했습니다. ### 1,997개의 라우팅이 보여주는 레거시 인프라의 한계 * 과거 인수한 인프라는 네트워크 장비가 아닌 개별 서버가 직접 라우팅 정보를 관리하는 비정상적인 구조로, 서버당 약 2,000개의 라우팅 경로가 설정되어 있었습니다. * 새로운 경로 추가 시 모든 서버를 일일이 수정해야 하는 관리 포인트의 과부하가 발생했으며, 이는 서비스 확장의 심각한 병목 현상이 되었습니다. * 초기에는 퍼블릭 클라우드 도입으로 대응했으나 비용 증가, 환율 변동, 하이브리드 DR 구성의 어려움 및 가시성 부족이라는 새로운 문제에 직면했습니다. ### OpenStack 기반 프라이빗 클라우드 내재화 * 상용 솔루션 대신 오픈소스인 OpenStack을 선택하여 기술 내재화와 유연한 인스턴스 타입(VM, Container, K8S) 대응력을 확보했습니다. * 부족한 운영 경험을 극복하기 위해 3가지 버전의 OpenStack을 수십 번 설치하고 장애 시나리오를 반복 재현하며 아키텍처 이해도를 높였습니다. * 로드밸런서인 옥타비아(Octavia)의 소스 코드를 직접 수정하여 비즈니스 요구에 맞는 로그 포맷을 생성하는 등 오픈소스의 이점을 극대화했습니다. ### 자동화와 모니터링을 통한 운영 효율 극대화 * Ansible과 Terraform 코드를 활용해 모든 자원의 라이프사이클을 자동화했으며, 골든 이미지를 통해 신규 인스턴스 생성 시간을 10초 이내로 단축했습니다. * Zabbix, Prometheus, Mimir, Grafana 등 다양한 오픈소스 툴을 조합하여 모든 메트릭을 수집하고, 실시간 알람 체계를 구축해 장애 감지 능력을 높였습니다. * 운영 인력의 한계를 극복하기 위해 CMDB와 연동된 봇(Bot)을 구현하여 인프라 현황을 실시간으로 조회하고 관리할 수 있도록 했습니다. ### 고가용성을 위한 다중 클러스터 및 Cluster API 전략 * 장애 발생 시 서비스 가용성을 즉시 확보하기 위해 서로 독립된 3개의 OpenStack 클러스터를 구축하고 평상시 Active-Active로 운영합니다. * 특정 클러스터 장애 시 트래픽을 즉시 차단하는 방식으로 복구 시간을 최소화했으며, 클러스터 간 의존성을 완전히 제거했습니다. * K8S 관리를 위해 Cluster API(CAPI)를 도입하여 쿠버네티스 클러스터 자체를 쿠버네티스 리소스로 관리함으로써 퍼블릭 클라우드 수준의 관리 편의성을 프라이빗 환경에서도 구현했습니다. 전통적인 금융 인프라의 보수성을 탈피하고 오픈소스 기술을 깊이 있게 내재화한다면, 퍼블릭 클라우드의 편리함과 온프레미스의 통제권을 동시에 거머쥘 수 있습니다. 인력 부족이나 기술적 난도는 자동화와 표준화된 도구(CAPI, Terraform 등)를 통해 충분히 극복 가능하므로, 비용 최적화와 기술적 가시성이 필요한 조직이라면 하이브리드 클라우드 전략을 적극 권장합니다.

일 평균 30억 건을 처리하는 결제 시스템의 DB를 Vitess로 교체하기 - 2. 개발 및 운영기 (새 탭에서 열림)

LINE Billing Platform 팀은 일 평균 30억 건의 요청을 처리하는 대규모 결제 시스템을 운영하기 위해 기존 Nbase-T에서 Vitess로 성공적인 데이터베이스 마이그레이션을 수행했습니다. 이 글에서는 성능 문제와 개발 편의성을 고려해 gRPC 대신 MySQL 프로토콜을 선택한 과정과 효율적인 데이터 처리를 위한 샤딩 전략을 상세히 다룹니다. 또한 VTOrc와 Prometheus를 활용한 자동 복구 및 모니터링 체계를 구축하여 분산 데이터베이스 환경에서도 높은 안정성을 확보한 실무 노하우를 공유합니다. ### 프로토콜 선정 및 개발 환경 구축 * VTGate는 gRPC와 MySQL 프로토콜을 모두 지원하지만, gRPC 사용 시 `http2: frame too large` 에러와 CPU 오버헤드가 발생하여 최종적으로 MySQL 프로토콜을 채택했습니다. * Java 클라이언트 사용 시 gRPC 프로토콜은 쿼리 결과를 객체로 변환하는 과정이 번거롭고 Vitess 측에서도 현재 MySQL 프로토콜 사용을 권장하고 있습니다. * 익숙한 MySQL 프로토콜을 사용함으로써 기존 개발 경험을 유지하면서도 Vitess의 샤딩 기능을 안정적으로 활용할 수 있게 되었습니다. ### 키스페이스 설계 및 데이터 처리 방식 * 시스템은 크게 두 개의 키스페이스로 분리되어 있습니다. '글로벌 키스페이스'는 단일 샤드로 구성되어 자동 증가(Auto-increment)하는 샤딩 키를 관리합니다. * 실제 데이터가 저장되는 '서비스 키스페이스'는 N개의 샤드로 분산되어 있으며, 코인 잔액 및 충전/사용 내역 등의 데이터를 저장합니다. * 서비스 키스페이스는 'Hash Vindex'를 사용하여 데이터를 균등하게 분산하며, 애플리케이션이 쿼리에 샤딩 키를 포함하면 VTGate가 해당 샤드를 자동으로 특정해 효율적인 요청 처리가 가능합니다. ### MySQL 호환성 및 주요 기능 활용 * 트랜잭션 격리 수준은 단일 샤드일 경우 `REPEATABLE READ`, 다중 샤드일 경우 `READ COMMITTED`가 적용됩니다. * Vitess는 MySQL 프로토콜을 지원하지만 일부 쿼리 제약 사항이 존재하므로, `unsupported_cases.json`을 통해 사전에 호환성을 확인해야 합니다. * 분산 샤드 간 트랜잭션을 지원하는 'Two-Phase Commit(2PC)' 기능과 쿼리 실행 계획을 분석하는 'VEXPLAIN/VTEXPLAIN' 등을 통해 분산 환경의 제약을 보완하고 있습니다. ### 안정적인 운영을 위한 모니터링 및 장애 복구 * 자동 복구 도구인 'VTOrc'를 도입하여 토폴로지 서버와 VTTablet의 데이터를 기반으로 문제를 자동 감지하고 복구합니다. * Prometheus를 통해 VTOrc의 지표(Metrics)를 수집하며, 장애 발생 시 이메일과 Slack으로 알람이 전달되도록 구성했습니다. * VTAdmin 웹 UI를 활용해 복구 내역을 시각적으로 확인하고, `tablet_alias`를 통해 문제가 발생한 MySQL 노드를 즉각적으로 식별하여 운영 효율성을 높였습니다. 대규모 분산 환경에서 Vitess를 도입할 때는 성능과 유지보수를 위해 gRPC보다는 MySQL 프로토콜 사용을 우선적으로 고려하는 것이 좋습니다. 또한 단일 샤드와 다중 샤드 간의 트랜잭션 격리 수준 차이 및 쿼리 제약 사항을 면밀히 검토하여 애플리케이션 로직을 설계해야 하며, VTOrc와 같은 도구를 적극 활용하여 고가용성 운영 체계를 구축하는 것이 중요합니다.