전체 글 (59) 썸네일형 리스트형 [Kubernetes] Kubernetes 아키텍처 - kubectl 명령 이후의 동작 이 글은 Kubernetes를 처음 접하는 사람들이 "도대체 내가 입력한 명령이 어디로 가는 거지?" 라는 궁금증을 해소할 수 있도록, 아키텍처 전체를 순서대로 뜯어보는 글이다.Kubernetes란 무엇인가?컨테이너를 혼자 쓰면 어떤 문제가 생길까?Docker를 처음 배우면 docker run 명령 하나로 컨테이너를 실행하는 것이 마법처럼 느껴진다. 하지만 실제 서비스를 운영하다 보면 금방 한계에 부딪힌다.컨테이너가 죽으면? → 직접 다시 실행해야 한다트래픽이 갑자기 몰리면? → 수동으로 컨테이너를 늘려야 한다서버가 10대, 100대면? → 어느 서버에서 무엇이 실행되는지 파악하기 어렵다배포 중 서비스를 중단하지 않으려면? → 복잡한 스크립트를 직접 작성해야 한다이 문제들을 해결하기 위해 등장한 것이 컨.. [MySQL] Container MySQL Primary-Replica 셋팅 읽기와 쓰기가 같은 DB 인스턴스를 공유하면 검색 쿼리가 커넥션과 CPU를 독점하여 쓰기 트랜잭션이 타임아웃된다.이 문서는 기존 데이터를 유지하면서 단일 MySQL 컨테이너를 Primary(쓰기 전용) - Replica(읽기 전용) 구조로 전환하는 전 과정을 다룬다.아키텍처 개요[Application] │ ├── Write (INSERT/UPDATE/DELETE) → [Primary :3306] 쓰기 전용 └── Read (SELECT) → [Replica :3307] 읽기 전용[Primary] Binlog(ROW) ──── 비동기 복제 ────→ [Replica] max_connections=60 max_connection.. [Redis] Cache Stampede: 캐시가 만료되는 순간, 모든 요청이 DB로 몰린다면 Cache Stampede란?Cache Stampede(Thundering Herd)는 동일한 캐시 키가 만료되는 시점에 다수의 요청이 동시에 DB로 몰리는 현상이다.정상적인 캐시 흐름에서는 Cache Miss가 발생하면 하나의 요청이 DB에서 데이터를 가져와 캐시에 저장하고, 이후 요청은 캐시에서 처리된다. 하지만 캐시가 만료되는 바로 그 순간에 여러 요청이 동시에 도착하면 상황이 달라진다.모든 요청이 캐시 미스를 경험하고, 각각 독립적으로 DB에 동일한 쿼리를 실행한다. 요청이 수백, 수천 건이라면 DB에 순간적인 부하 폭증이 발생한다.왜 발생하는가?Write Through로 해결할 수 없는가?"캐시를 항상 최신 상태로 유지하면 만료될 일이 없지 않은가?"라는 생각이 들 수 있다. Write Thro.. [Redis] Cache Penetration: 존재하지 않는 데이터에 대한 요청이 캐시를 뚫고 DB를 때린다면 Cache Penetration이란? Cache Penetration은 존재하지 않는 데이터에 대한 요청이 캐시를 무력화시키는 현상이다.일반적인 캐시 조회 흐름을 먼저 살펴보자.이 흐름은 데이터가 존재하는 경우에는 잘 동작한다. Cache Miss가 발생해도 DB에서 조회한 결과를 캐시에 저장하므로, 이후 동일한 요청은 캐시에서 처리된다.그런데 존재하지 않는 데이터를 요청하면 어떻게 될까?DB 조회 결과가 null이면 캐시에 저장할 값이 없다. 따라서 같은 요청이 반복될 때마다 매번 캐시를 통과해서 DB에 직접 도달한다. 이것이 Cache Penetration이다.왜 위험한가?단순히 한두 건의 요청이라면 큰 문제가 아니다. 하지만 다음과 같은 상황을 생각해보자.악의적인 사용자가 존재하지 않는 ID를 랜덤.. [Docker] Docker Compose로 Grafana / Prometheus / Loki 로컬 테스트 환경 구성하기 애플리케이션 개발과 운영에서 모니터링은 필수적인 요소이다. 하지만 Grafana, Prometheus, Loki와 같은 강력한 모니터링 도구들을 처음부터 완벽하게 구축하는 것은 결코 쉬운 일이 아니다. 특히 로컬 개발 환경이나 소규모 테스트 환경에서는 복잡한 설정보다는 빠르고 쉽게 동작하는 모니터링 스택이 필요하다.위 환경을 AWS EC2 (Amazon Linux) 환경에서 Docker Compose를 활용하여 Grafana, Prometheus, Loki 스택을 구축하고, 나아가 Spring Boot 애플리케이션의 메트릭과 로그를 연동하는 방법을 알아보자.목표AWS EC2 (Amazon Linux 2023) 인스턴스 위에서Docker Compose를 사용하여Grafana, Prometheus, Loki.. [Spring Boot] Multi-DataSource Routing 구현 삽질기 동일한 스키마, 동일한 데이터, 동일한 API에 대해 MySQL과 PostgreSQL의 성능 차이를 비교하기 위한 플랫폼을 구상하여 만들던 중 DataSource Routing에 관련한 문제를 겪어 해결하기 위해 삽질한 기록을 공유하고자 한다. 이 프로젝트에서는 구체적으로는 다음을 목표로 했다.LIKE '%keyword%' 같은 Full Scan 쿼리의 실행 속도 비교인덱스 종류(B-Tree, GIN, Full-Text 등)별 성능 차이 분석EXPLAIN / EXPLAIN ANALYZE 실행 계획의 상세 비교동일 조건에서 두 DB 엔진의 옵티마이저 동작 차이 관찰이를 위해 하나의 Spring Boot 애플리케이션에서 요청 헤더(X-Database-Type)로 MySQL/PostgreSQL을 런타임에 전환.. [Spring Boot] ApplicationEventPublisher를 활용한 도메인 간 역할 분리 OOP 기반으로 애플리케이션을 설계하다 보면 자연스럽게 도메인 간의 영역, 역할, 책임에 대해 고민하게 된다.처음에는 기능이 정상 동작하는 것에 집중하지만, 시간이 지날수록 이런 질문이 반복된다."이 로직이 정말 이 도메인에 속하는 게 맞는가?" 예를 들어 주문이 생성되면 다음과 같은 작업이 연쇄적으로 발생할 수 있다.포인트 적립알림 발송감사 로그 기록외부 시스템 연동통계 집계이때 주문 서비스에서 관련 서비스들을 직접 호출하기 시작하면,주문 도메인이 여러 도메인에 강하게 결합된 중앙 허브가 되어버린다.이 방식은 초기 개발 속도는 빠르지만, 코드가 커질수록 다음과 같은 문제가발생한다.도메인 간 결합도 증가테스트 복잡도 상승변경 영향 범위 확대책임 집중사이드 이펙트 증가기능 확장 시 기존 코드 수정 필요이 .. Docker Docker는 전통적인 하이퍼바이저 기반 가상머신(VM)과 달리, 리눅스 커널이 제공하는 다양한 기능을 조합해 호스트 커널을 공유하면서도 독립된 프로세스 환경을 제공하는 경량 컨테이너 플랫폼이다. OS 수준의 가상화(OS-level virtualization)라고 부르며, 프로세스 격리와 자원 제어만으로 빠르고 효율적인 애플리케이션 배포·운영을 가능케 한다.컨테이너 vs VM 가상머신 (VM) 컨테이너(Docker) 커널각 VM마다 별도 커널과 OS호스트 커널을 공유가동 시간수십 초 이상 (부팅 필요)수 밀리초~수 초 (프로세스로 실행)오버헤드메모리·디스크·CPU 오버헤드 큼최소한의 사용자 공간 레이어만 추가격리 수준꽉 막힌 격리네임스페이스·Cgroups 기반 격리컨테이너는 결국 “독립된 프로세스”이.. 이전 1 2 3 4 5 6 7 8 다음