토스페이먼츠, 수천 대 서버 설정을 '코드처럼' 관리하는 비법 공개

by DD
4개월 전
조회수 42

복사-붙여넣기 방식의 API 서버 설정 관리의 문제점을 인지하고, 오버레이 아키텍처(Overlay Architecture)템플릿 패턴(Template Pattern)을 도입하여 설정 중복을 해결

Jenkins Job-DSL 플러그인 어댑터를 활용하여 개발자의 반복적인 Jenkins 설정 작업을 줄이고, 선언형(Declarative) 방식으로 Job 정의를 단순화

Dynamic Provisioning 인프라를 도입하여 배치 서버의 메모리 부족 문제를 해결하고, 전용 노드(Dedicated Node)를 동적으로 할당하여 비용 효율성을 확보

설정에 코드 삽입(Code Injection)조건부 적용(Conditional Application) 기능을 추가하여 유연성을 높이고, 개발자가 설정에 더욱 집중할 수 있도록 지원

오버레이 아키텍처(Overlay Architecture)를 활용한 API 서버 설정 관리

토스페이먼츠는 API 서버 설정 관리를 위해 오버레이 아키텍처(Overlay Architecture)를 도입하여 설정의 계층 구조를 구축했다. global, cluster, phase, app 순으로 계층을 나누어, 하위 계층에서 상위 계층의 설정을 덮어쓰는 방식으로 유연성을 확보했다.

계층별 역할 분담: 각 계층은 K8S 클러스터, 애플리케이션 그룹, 환경(dev/staging/prod), 개별 애플리케이션 등 특정 요구사항에 대응

설정 디렉토리 구조: 애플리케이션별, 환경별 설정을 체계적으로 관리하여, 설정 변경의 용이성을 높임

CI/CD 통합: CI/CD 파이프라인에서 현재 환경에 맞는 설정을 자동으로 선택하여 적용, 개발 환경별 설정을 일관되게 관리

템플릿 패턴(Template Pattern)을 이용한 설정 중복 제거

오버레이 아키텍처(Overlay Architecture)만으로는 해결하기 어려운 문제를 해결하기 위해, 토스페이먼츠는 템플릿 패턴(Template Pattern)을 도입했다. 이를 통해 설정 내에서 변수를 사용하여 중복을 줄이고, 설정의 재사용성을 높였다.

JVM_OPTION 예시: `-Xmx{{MAX_HEAP}}m`과 같이 변수를 사용하여, 힙 메모리 크기(Heap Memory Size)와 같은 값을 환경별로 유연하게 변경

오버레이와의 조합: 템플릿 패턴은 오버레이 아키텍처 위에서 동작하며, 각 계층의 우선순위에 따라 템플릿 변수가 최종적으로 조합

설정 내 코드 삽입: 파이썬(Python) 스크립트를 설정 파일에 포함하여, 동적으로 값을 생성하고, 조건부 설정을 적용하여 유연성을 극대화

Jenkins Job-DSL 플러그인 어댑터(Adapter)를 활용한 배치 설정 자동화

토스페이먼츠는 Jenkins Job-DSL 플러그인을 활용하여, 개발자가 Jenkins 설정을 쉽게 관리할 수 있도록 Job-DSL 플러그인 어댑터(Adapter)를 구현했다. 이를 통해 개발자는 Groovy 코드를 사용하여 Jenkins Job을 선언적으로 정의할 수 있게 되었다.

선언형 설정: JavaRunBatchJobBuilder와 같은 빌더 패턴을 사용하여, Jenkins 설정을 간결하게 정의

자동 완성 지원: IDE 자동 완성 기능을 통해 설정 항목을 쉽게 확인하고, 오류를 줄임

공통 인프라 연동: Pinpoint, Scavenger, Prometheus, Async profiler 등 토스페이먼츠 공통 인프라 연동 설정을 간편하게 적용

Dynamic Provisioning 인프라를 통한 배치 서버 자원 관리

토스페이먼츠는 배치 서버의 메모리 부족 문제를 해결하기 위해 Dynamic Provisioning 인프라를 도입했다. 이 시스템은 배치 작업의 필요에 따라 자동으로 전용 노드를 할당하고, 사용하지 않는 노드는 자동으로 종료하여 자원 효율성을 높였다.

자동 프로비저닝: 배치 실행 요청 시, 사용 가능한 노드가 부족하면 새로운 노드를 자동으로 프로비저닝

Jar 파일 자동 배포: 새 노드에 Jar 파일 등 필요한 자원을 자동으로 배포하여, 배치 실행 준비

비용 절감: 사용하지 않는 노드는 자동으로 종료되어, 자원 낭비를 방지하고, OS 보안 패치 등 유지보수 비용 절감

설정의 진화: 코드처럼 관리하는 인프라

토스페이먼츠는 설정 관리 방식을 지속적으로 개선하며, 설정 자체를 코드처럼 관리하는 철학을 보여준다. 오버레이 아키텍처(Overlay Architecture)와 템플릿 패턴(Template Pattern) 도입, Job-DSL 플러그인 어댑터(Adapter) 구현, Dynamic Provisioning 인프라 구축 등 끊임없는 진화를 통해 유연하고 확장 가능한 설정을 구축했다.

지속적인 개선: 개발자들의 요구사항을 반영하여, 설정 관리 방식을 지속적으로 개선

유연성 확보: 설정에 코드 삽입, 조건부 적용 등 다양한 기능을 추가하여, 유연성을 높임

개발 생산성 향상: 개발자들이 설정 관리로 인한 어려움 없이, 애플리케이션 개발에 집중할 수 있도록 지원

배치 설정의 핵심: 단순함과 진화

토스페이먼츠는 배치 서버 설정 관리에 있어 단순함(Simplicity)을 강조하며, 지속적인 진화를 통해 시스템을 개선해왔다. Jenkins를 선택하고, Job-DSL 플러그인 어댑터(Adapter)를 활용하여 개발 생산성을 높이는 동시에, Dynamic Provisioning 인프라를 통해 자원 관리 효율성을 극대화했다.

단순한 구조: 복잡한 솔루션 대신, Jenkins와 같은 단순한 도구를 선택하여, 학습 곡선(Learning Curve)을 낮춤

테스트 자동화: 설정 테스트를 통해, 배포 안정성을 높이고, 개발자의 실수를 방지

지속적인 발전: 개발자들의 요구사항을 반영하여, 설정 관리 시스템을 지속적으로 개선

수천 개의 API/BATCH 서버를 하나의 설정 체계로 관리하기