Cilium eBPF로 kube-proxy 없이 서비스 로드밸런싱하기
왜 kube-proxy가 병목이 되는가 쿠버네티스의 ClusterIP/NodePort 서비스는 기본적으로 kube-proxy가 iptables 규칙으로 구현한다. 문제는 서비스와 엔드포인트가 늘어날…
왜 kube-proxy가 병목이 되는가 쿠버네티스의 ClusterIP/NodePort 서비스는 기본적으로 kube-proxy가 iptables 규칙으로 구현한다. 문제는 서비스와 엔드포인트가 늘어날…
왜 프로브가 필요한가 컨테이너 프로세스가 살아 있다고 해서 트래픽을 받을 준비가 된 것은 아니다. JVM은 워밍업 중이고, DB 커넥션 풀은 아직 비어 있으며, 마이그레이션이 끝나지 않았을 수 있다…
HOL 블로킹이 왜 문제인가 HTTP/2는 하나의 TCP 연결에서 여러 스트림을 다중화(multiplexing)한다. 애플리케이션 계층에서는 스트림이 독립적이지만, 그 아래 TCP는 바이트 스트림을…
왜 3-way 핸드셰이크가 문제인가 일반적인 TCP 연결은 SYN → SYN-ACK → ACK의 3단계를 거친 뒤에야 데이터를 보낼 수 있다. 즉 실제 요청 바이트를 전송하기 전에 최소 1 RTT(…
왜 ARC가 문제가 되는가 ZFS의 ARC(Adaptive Replacement Cache)는 기본적으로 시스템 물리 메모리를 적극적으로 점유한다. 리눅스에서 ARC는 페이지 캐시와 별개로 커널 슬…
비동기 메시징을 도입하면 거의 필연적으로 “같은 메시지가 두 번 처리됐다”는 사고를 겪습니다. 결제가 두 번 청구되고 재고가 두 번 차감됩니다. 대부분의 브로커가 기본 보장하는 것이 at-least…
왜 RBD 지연이 문제가 되는가 Ceph RBD는 여러 OSD에 객체를 분산 저장하기 때문에, 단일 쓰기 요청도 프라이머리 OSD와 레플리카 OSD들의 응답을 모두 기다려야 완료된다. 이 구조에서 …
왜 샤드 크기가 힙을 압박하는가 Elasticsearch에서 각 샤드는 독립적인 Lucene 인덱스이며, 열려 있는 동안 세그먼트 메타데이터, term dictionary, doc values 캐시…
복제 지연은 왜 생기는가 MySQL의 비동기 복제에서 소스(source)는 트랜잭션을 병렬로 처리하지만, 레플리카(replica)는 전통적으로 릴레이 로그를 단일 SQL 스레드 가 순차적으로 재생(…
왜 UPDATE가 인덱스를 갉아먹는가 PostgreSQL의 MVCC는 UPDATE를 "기존 튜플을 죽이고 새 튜플을 삽입"하는 방식으로 처리한다. 문제는 이 새 튜플이 다른 물리적 위치(다른 페이지…
왜 스트리밍 응답이 끊기거나 지연되는가 SSE(Server-Sent Events), LLM 토큰 스트리밍, 대용량 파일 다운로드 같은 응답은 백엔드가 데이터를 조금씩 흘려보낸다. 그런데 클라이언트에…
왜 단일 PUT은 한계에 부딪히는가 수백 MB에서 수 GB에 달하는 파일을 단일 PUT으로 올리면 세 가지 문제가 동시에 터진다. 첫째, 대부분의 object storage는 단일 오브젝트 업로드에…
왜 임계값 기반 알림은 실패하는가 많은 팀이 "CPU 80% 초과", "에러율 1% 초과" 같은 고정 임계값으로 알림을 건다. 문제는 두 가지다. 첫째, 임계값이 사용자 경험과 무관하다. 야간 배치…
단일 리전에서 안정적으로 돌아가던 서비스도 리전 전체 장애 앞에서는 무력합니다. 가용 영역(AZ) 하나가 죽는 상황은 멀티 AZ 배치로 흡수할 수 있지만, 특정 리전 전체가 네트워크·전원·컨트롤 플…
왜 DB 마이그레이션이 문제인가 애플리케이션 코드는 블루-그린 배포로 무중단 전환이 쉽지만, DB는 상태(state)를 가지기 때문에 같은 방식이 통하지 않는다. 스키마를 바꾸는 순간 구버전 코드와…
왜 커넥션 풀 고갈이 문제인가 대부분의 HTTP 클라이언트는 매 요청마다 TCP 연결을 새로 맺지 않고, 미리 만들어 둔 연결을 재사용하기 위해 커넥션 풀을 둔다. 풀 크기는 유한하므로, 응답이 느…
컨테이너는 왜 "가벼운 격리"인가 컨테이너를 VM처럼 생각하면 디버깅이 어렵다. VM은 하이퍼바이저가 하드웨어를 가상화하지만, 컨테이너는 커널을 호스트와 공유한 채 프로세스에 격리된 뷰 만 제공한다…
사용자가 서울에 있고 오리진 서버가 미국 동부 리전에 있다면, 요청 하나가 왕복하는 데만 물리적으로 200ms 이상이 소요됩니다. 광속은 협상 대상이 아니므로, 지연을 줄이는 유일한 방법은 연산과 …
드리프트는 왜 생기고 왜 위험한가 드리프트(drift)는 코드로 선언한 인프라 상태와 클라우드의 실제 상태가 어긋나는 현상이다. 장애 대응 중 콘솔에서 수동으로 보안 그룹을 열거나, 다른 팀이 오토…
왜 핸드셰이크가 병목이 되는가 TLS 연결마다 전체(full) 핸드셰이크가 발생하면, 인증서 검증과 키 교환에 필요한 왕복(RTT)과 비대칭 암호 연산이 매번 반복된다. TLS 1.2 full 핸드…
쿠버네티스를 운영하다 보면 “잘 돌던 파드가 갑자기 재시작됐다”는 상황을 반복적으로 만납니다. kubectl get pods 를 보면 RESTARTS 가 올라가 있고, 상세에는 OOMKilled 또…
왜 밸런서가 운영 문제가 되는가 MongoDB 샤딩 클러스터는 청크(chunk) 단위로 데이터를 분산한다. 밸런서는 샤드 간 청크 수가 불균형해지면 자동으로 청크를 이동시켜 균형을 맞춘다. 문제는 …
파티션 프루닝이란 무엇인가 선언적 파티션(Declarative Partitioning)에서 프루닝(Pruning)은 쿼리 조건에 맞지 않는 파티션을 실행 대상에서 제외하는 최적화다. 1000개 파티…
왜 문제가 되는가 스팟 인스턴스는 비용을 크게 줄여주지만 클라우드 사업자가 언제든 회수할 수 있다. AWS는 회수 2분 전, GCP는 약 30초 전에 중단 신호를 준다. 이 짧은 시간 동안 파드를 …
왜 문제가 되는가 프라이빗 레지스트리에 올린 이미지를 파드가 당겨오려 할 때 흔히 ErrImagePull 또는 ImagePullBackOff 가 발생한다. 원인은 대부분 인증이다. kubelet은 …
왜 컨트롤플레인 VIP가 필요한가 온프레미스나 베어메탈에 kubeadm으로 클러스터를 올리면 API 서버 엔드포인트가 문제가 된다. 컨트롤플레인이 3대라도 kubeconfig와 kubelet은 하나…
왜 free()를 해도 RSS가 안 줄어드나 운영 중인 서비스에서 트래픽 스파이크 뒤 메모리 사용량(RSS)이 다시 내려오지 않는 현상을 자주 겪는다. 애플리케이션은 분명 객체를 해제했는데도 top…
왜 지금 Quorum 큐인가 Classic 미러링 큐( ha-mode 정책 기반)는 RabbitMQ 3.8부터 문제로 지적되어 왔다. 네트워크 파티션 상황에서 마스터가 바뀔 때 미러 동기화가 완전하…
마이크로서비스가 열 개를 넘어가는 순간, “이 요청이 왜 느린가”라는 질문에 답하기가 급격히 어려워집니다. 게이트웨이에서 결제·재고·알림 서비스를 거쳐 데이터베이스까지 이어지는 호출 경로를 로그만으…
왜 DNS 응답을 손봐야 하는가 쿠버네티스 클러스터를 운영하다 보면 표준 DNS 해석만으로는 부족한 순간이 온다. 특정 외부 도메인을 내부 프록시로 강제 우회시켜야 하거나, 레거시 온프레미스 존을 …
컨테이너 격리는 왜 부족한가 기본 컨테이너는 호스트 커널을 공유한다. 네임스페이스와 cgroup으로 프로세스를 나누지만, 시스템 콜은 결국 하나의 리눅스 커널에 도달한다. 커널에 취약점이 하나라도 …
왜 RAID만으로는 부족한가 오브젝트 스토리지를 운영하다 보면 디스크 장애는 예외가 아니라 상수다. 전통적인 하드웨어 RAID는 컨트롤러 종속성이 크고, 리빌드 중 두 번째 디스크가 죽으면 볼륨 전…
왜 컴팩션이 읽기 성능을 좌우하는가 ScyllaDB(및 Cassandra 계열)는 쓰기를 memtable에 모은 뒤 immutable한 SSTable로 flush한다. 같은 파티션 키의 데이터가 여…
왜 데몬 하드닝이 필요한가 대부분의 서비스 유닛은 별도 설정 없이 root 또는 광범위한 권한으로 실행된다. 이 상태에서 애플리케이션에 원격 코드 실행 취약점이 하나 생기면, 공격자는 곧바로 파일시…
왜 롤링 배포가 느려지는가 롤링 배포는 인스턴스를 하나씩 교체하며 무중단을 노린다. 그런데 실제로는 배포 한 대에 몇 분씩 걸리는 경우가 흔하다. 원인의 대부분은 로드밸런서(LB) 헬스체크 설정이다…
왜 네트워크 열화 테스트가 필요한가 대부분의 서비스는 개발자의 유선 LAN이나 같은 리전 내부처럼 빠르고 안정적인 네트워크에서 검증된다. 그러나 실제 사용자는 3G/LTE, 혼잡한 카페 와이파이, …
왜 압축 방식 선택이 문제가 되는가 HTTP 응답 압축은 전송량을 줄여 응답 시간을 단축한다. 하지만 압축은 공짜가 아니다. 압축률을 높일수록 CPU 시간이 늘어나고, 트래픽이 몰리면 압축 자체가 …
왜 pg_upgrade와 덤프/복원으로는 부족한가 pg_upgrade 는 빠르지만 실행 중 데이터베이스를 정지시켜야 하고, 롤백이 사실상 어렵다. pg_dump / restore 는 대용량에서 수 …
왜 Pub/Sub와 List로는 부족한가 Redis의 Pub/Sub는 fire-and-forget 방식이다. 구독자가 순간적으로 끊겨 있으면 그 사이 발행된 메시지는 그냥 사라진다. LPUSH/BR…
왜 시간이 어긋나면 시스템이 무너지는가 서버 시계는 조용히, 그러나 꾸준히 틀어진다. 하드웨어 오실레이터의 온도 편차, 가상화 환경의 CPU steal, 라이브 마이그레이션으로 인한 타이머 점프가 …
왜 설정 리로드가 문제인가 HAProxy는 설정 변경을 반영할 때 프로세스를 재시작하거나 리로드한다. 문제는 전통적인 리로드 방식에서 이미 열려 있는 리스닝 소켓을 잠깐 닫았다가 새 프로세스가 다시…
왜 스키마 변경이 문제가 되는가 운영 중인 MySQL에서 ALTER TABLE 은 단순해 보이지만, 대용량 테이블에서는 서비스 장애의 직접 원인이 된다. 예전 방식( COPY 알고리즘)은 전체 테이…
왜 B-tree가 시계열에서 부담이 되는가 센서 로그, 결제 이벤트, 접속 기록 같은 시계열 데이터는 하루에도 수천만 건씩 쌓입니다. 이런 테이블의 created_at 에 관행적으로 B-tree 인…
좀비 커넥션은 어떻게 생기는가 TCP 연결은 명시적으로 닫히지 않는 한 커널 입장에서 계속 "살아있는" 상태로 유지된다. 문제는 상대방이 정상 종료(FIN) 없이 사라지는 경우다. 서버 프로세스 강…
프로덕션에서 “왜 이 요청이 느린가”를 추적하다 보면 애플리케이션 로그만으로는 부족한 순간이 옵니다. 커넥션이 어디서 끊겼는지, 어떤 시스템콜에서 블로킹됐는지는 커널의 관점에서만 정확히 답할 수 있…
왜 DNS가 장애 전파의 통로가 되는가 DNS는 단순한 이름 조회처럼 보이지만, 실제로는 여러 계층의 캐시(리졸버, OS, 애플리케이션 런타임)가 겹쳐 있는 분산 시스템이다. 이 구조 때문에 문제가…
왜 스케줄러 튜닝이 필요한가 한 대의 서버에서 배치 잡, 로그 수집, API 워커가 CPU를 두고 경쟁하면 지연이 튀는 구간이 생긴다. 리눅스 기본 스케줄러인 CFS(Completely Fair S…
왜 TCP 재전송이 지연의 주범이 되는가 애플리케이션 로그상 정상인데 특정 요청만 수백 ms에서 수 초까지 튀는 경우, 상당수는 TCP 재전송에서 비롯된다. 패킷이 유실되면 송신 측은 ACK를 기다…
왜 Redis 영속성이 문제가 되는가 Redis는 인메모리 저장소이므로 프로세스가 죽거나 서버가 재시작되면 데이터가 사라진다. 캐시 용도라면 상관없지만, 세션·랭킹·큐·카운터처럼 유실이 곤란한 데이…
레벨 트리거 vs 엣지 트리거 epoll은 두 가지 통지 모드를 제공한다. 레벨 트리거(LT)는 fd에 처리할 데이터가 남아 있는 한 계속 이벤트를 올린다. 엣지 트리거(ET)는 상태가 "변할 때"…
왜 커넥션 풀링이 필요한가 PostgreSQL은 커넥션 하나당 백엔드 프로세스를 하나 생성한다. 프로세스는 수 MB의 메모리를 잡고, max_connections 를 늘릴수록 컨텍스트 스위칭과 락 …
왜 파일시스템 선택이 성능 문제로 이어지는가 리눅스 서버에서 ext4는 오랜 기본값이고 XFS는 RHEL 7 이후 기본 파일시스템이다. 둘 다 저널링을 지원하지만 저널링 대상과 동시성 처리 방식이 …
새 버전을 프로덕션에 올리기 직전, “실제 트래픽에서는 어떻게 동작할까”라는 질문에 명쾌하게 답할 수 있는 팀은 많지 않습니다. 스테이징을 통과한 코드가 실 사용자 요청 패턴, 특정 헤더 조합, 예…
왜 복합 인덱스 순서가 문제인가 복합 인덱스 (a, b, c) 는 "a로 정렬하고, 같은 a 안에서 b로 정렬하고, 같은 b 안에서 c로 정렬한" 정렬된 목록이다. 전화번호부가 성 → 이름 순으로 …
왜 CSI 스냅샷이 필요한가 스테이트풀 워크로드를 운영하다 보면 PVC 데이터를 순간적으로 고정하고 복제해야 하는 순간이 온다. 스키마 마이그레이션 직전, 배포 롤백 대비, 장애 조사용 데이터 확보…
리밸런싱이 왜 지옥이 되는가 카프카 컨슈머 그룹은 파티션을 멤버에게 나눠 갖는다. 멤버가 들어오거나 나가면, 혹은 구독 토픽이 바뀌면 파티션을 다시 배분하는 리밸런싱 이 일어난다. 문제는 기본 프로…
왜 APF가 필요한가 API 서버는 클러스터의 단일 관문이다. 특정 컨트롤러가 폭주하거나, 노드가 대량으로 재기동하면서 kubelet들이 동시에 LIST 요청을 쏟아내면, API 서버의 처리 능력이…
왜 L4 로드밸런서로는 부족한가 gRPC는 HTTP/2 위에서 동작한다. HTTP/2의 핵심은 하나의 TCP 커넥션을 오래 유지하면서 그 위로 수많은 요청(스트림)을 멀티플렉싱하는 것이다. 문제는 …
왜 문제가 되는가 노드 자원이 부족해지면 새 파드는 Pending 상태로 멈춘다. 이때 모든 파드를 동등하게 취급하면, 배치 잡이 노드를 선점하고 있어서 결제·인증 같은 핵심 서비스가 스케줄되지 못…
왜 파드 분산이 문제가 되는가 레플리카를 3개로 늘렸다고 가용성이 확보되는 것은 아니다. 스케줄러는 기본적으로 리소스 여유가 있는 노드를 우선하기 때문에, 아무 제약이 없으면 3개 파드가 같은 노드…
리드 레플리카는 읽기 부하를 분산하는 가장 손쉬운 확장 수단이지만, 동시에 서비스 데이터 정합성을 가장 흔하게 무너뜨리는 원인이기도 합니다. 방금 작성한 글이 목록에서 사라지거나 결제 직후 잔액이 …
왜 acks=all만으로는 부족한가 많은 팀이 "프로듀서에 acks=all 을 걸었으니 메시지가 안전하다"고 믿는다. 하지만 이 설정만으로는 데이터 유실을 막지 못한다. acks=all 은 "현재 …
왜 쓰기가 "빠른데" 데이터는 사라지는가 애플리케이션이 write() 를 호출하면 데이터는 디스크가 아니라 커널의 페이지 캐시(page cache)에 먼저 들어간다. 그래서 write 자체는 마이크…
왜 리텐션이 운영에서 문제가 되는가 Kafka 브로커의 디스크는 생각보다 빨리 찬다. 토픽마다 파티션이 있고, 파티션은 세그먼트 파일로 나뉘어 쌓인다. 기본 리텐션은 7일이지만, 트래픽이 몰리는 토…
왜 분산 락이 어려운가 단일 프로세스의 뮤텍스와 달리 분산 락은 네트워크 지연, 노드 장애, GC 스톱 같은 변수를 함께 다뤄야 한다. 흔한 실수는 "락을 잡았다"는 사실과 "지금도 여전히 잡고 있…
카디널리티가 왜 문제인가 Prometheus에서 하나의 시계열(time series)은 메트릭 이름과 라벨 조합으로 유일하게 식별된다. 라벨 하나가 추가되거나 라벨 값의 종류가 늘어나면 시계열 개수…
왜 갑자기 지연 스파이크가 생기는가 Redis는 단일 스레드로 명령을 처리한다. 그래서 하나의 작업이 오래 걸리면 그 뒤에 줄 선 모든 명령이 함께 밀린다. 평소 P99가 1ms인데 특정 순간에만 …
메모리 단편화가 왜 문제인가 Redis는 기본 할당자로 jemalloc을 사용한다. jemalloc은 요청 크기를 미리 정의된 size class(예: 8, 16, 32… 바이트)로 반올림해 할당한…
동시 접속 수만 건을 처리하는 서버를 운영하다 보면, 애플리케이션 코드는 최적화가 끝났는데도 처리량이 어느 지점에서 벽에 부딪히는 경험을 하게 됩니다. CPU도 메모리도 여유가 있는데 새 연결이 거…
기본 상태: 모든 파드는 서로 통신할 수 있다 쿠버네티스 클러스터를 처음 구성하면 네임스페이스와 무관하게 모든 파드가 서로 자유롭게 통신할 수 있는 상태다. 개발 단계에서는 편하지만, 운영 환경에서…
팬텀 리드가 왜 문제인가 팬텀 리드(Phantom Read)는 같은 트랜잭션 안에서 동일한 조건으로 범위를 조회했는데, 그 사이 다른 트랜잭션이 조건에 맞는 행을 삽입해 결과 건수가 달라지는 현상이…
왜 버퍼풀이 병목이 되는가 InnoDB는 데이터와 인덱스 페이지를 버퍼풀(buffer pool)에 올려두고 처리한다. 워킹셋이 버퍼풀보다 커지면 자주 쓰는 페이지조차 디스크에서 다시 읽어야 하고, …
증상: 연결은 되는데 큰 데이터에서 멈춘다 MTU/MSS 문제의 전형적인 증상은 "SSH 접속은 되는데 ls 출력이 긴 순간 멈춘다", "HTTP 헤더는 오가는데 큰 응답 바디에서 hang이 걸린다…
오프로드가 왜 필요한가 10G 이상 회선에서 패킷을 1500바이트씩 나눠 커널이 하나하나 처리하면 초당 수백만 개의 인터럽트와 스택 순회가 발생한다. TSO/GSO는 송신 시 큰 세그먼트를 만들어 …
S3 요금 청구서를 처음 뜯어보면 대부분 놀랍니다. 저장 용량보다 요청·검색 요금이 생각보다 크고, 몇 년째 아무도 읽지 않는 오래된 객체가 여전히 표준 클래스에서 최고 단가로 과금되고 있기 때문입…
왜 기존 비동기 I/O가 병목이 되는가 리눅스에서 오랫동안 쓰인 epoll은 소켓 같은 준비 상태(readiness) 기반 이벤트에는 잘 맞지만, 파일 I/O에는 사실상 비동기가 아니다. 일반 파일…
왜 단일 CPU에서 패킷 처리가 병목이 되는가 고성능 네트워크 서버에서 흔히 겪는 문제는 트래픽이 늘어도 특정 CPU 코어 하나만 100%에 붙어 있고 나머지 코어는 놀고 있는 상황이다. 원인은 대…
Kafka를 운영하다 보면 결국 마주하는 지표가 컨슈머 랙(consumer lag) 입니다. 프로듀서가 쌓아 놓은 마지막 오프셋(LOG-END-OFFSET)과 컨슈머가 커밋한 오프셋(CURRENT-…
CPU steal time이란 무엇인가 클라우드 VM에서 애플리케이션은 멀쩡한데 응답이 느려질 때가 있다. CPU 사용률은 낮은데 지연이 튀는 전형적인 증상의 원인 중 하나가 steal time 이…
문제 상황: VIP는 넘어갔는데 트래픽은 안 온다 keepalived로 액티브-스탠바이를 구성하면 마스터 장애 시 VIP(가상 IP)가 백업 노드로 넘어간다. 그런데 페일오버 직후 수 초에서 수십 …
왜 노드 유지보수가 까다로운가 커널 패치, 인스턴스 타입 교체, 하드웨어 점검처럼 노드를 잠시 내려야 하는 순간은 반드시 온다. 문제는 노드 위에서 Pod가 돌고 있다는 점이다. 아무 조치 없이 노…
왜 잠금이 문제가 되는가 PostgreSQL은 MVCC 덕분에 "읽기가 쓰기를 막지 않는다"는 원칙을 지키지만, 쓰기끼리는 여전히 행 잠금(row lock)과 테이블 잠금을 통해 직렬화된다. 트랜잭…
쿠버네티스 클러스터를 처음 띄우면 모든 파드는 서로 자유롭게 통신할 수 있습니다. 프론트엔드 파드가 결제 DB에 직접 붙고, 이름 모를 배치 잡이 인증 서비스의 내부 API를 호출할 수도 있습니다.…
왜 혼잡제어 선택이 문제가 되는가 대역폭이 충분한데도 처리량이 오르지 않거나, 특정 지역 사용자만 유독 느린 경험은 대부분 TCP 혼잡제어 알고리즘과 관련이 있다. Linux 기본값인 CUBIC은 …
왜 정기 백업만으로는 부족한가 매일 새벽 한 번 덤프를 뜨는 백업 전략에는 근본적인 구멍이 있다. 오후 3시에 운영자가 실수로 DELETE 를 잘못 날리거나 데이터가 손상되면, 복구 지점은 그날 새…
왜 리샤딩이 문제가 되는가 Redis 클러스터는 16384개의 해시 슬롯을 노드에 나눠 갖는다. 트래픽이 특정 노드로 쏠리거나 새 노드를 추가할 때, 슬롯 소유권을 옮겨야 한다. 문제는 이동 중인 …
왜 드레인이 위험한가 노드 업그레이드나 스케일 다운을 위해 kubectl drain 을 실행하면, 해당 노드의 파드들이 한꺼번에 evict된다. 문제는 이 축출(eviction)이 롤링 업데이트와 …
PostgreSQL은 커넥션 하나를 OS 프로세스 하나 로 매핑하는 프로세스 기반 아키텍처입니다. 안정성과 격리에는 장점이지만, 커넥션이 수백 개로 늘어나는 순간 스케줄링 오버헤드와 메모리 압박이 …
마이크로서비스 환경에서 하나의 느린 백엔드가 전체 서비스를 끌어내리는 장애를 겪어 본 팀이라면 서킷브레이커의 필요성을 몸으로 압니다. 응답이 지연되는 업스트림에 요청이 쌓이면 커넥션과 스레드가 고갈…
왜 오브젝트 스토리지 비용이 방치되는가 오브젝트 스토리지는 "일단 넣어두면 싸다"는 인식 때문에 정리 없이 무한정 쌓이는 경우가 많다. 문제는 저장 용량뿐이 아니다. 멀티파트 업로드가 실패한 뒤 남…
수억 건이 쌓인 시계열 테이블은 어느 순간부터 조용히 서비스를 갉아먹습니다. 인덱스가 메모리에 다 올라가지 못해 캐시 히트율이 떨어지고, VACUUM 은 몇 시간씩 돌며, 오래된 데이터를 지우는 D…
왜 프로세스가 갑자기 죽는가 운영 중인 서버에서 로그도 남기지 못하고 프로세스가 사라진 경험이 있다면 대부분 OOM Killer의 소행이다. 리눅스는 메모리를 요청 시점에 실제로 할당하지 않고, 페…
왜 eBPF인가 기존에 커널 내부 동작을 관측하거나 네트워크 패킷을 필터링하려면 커널 모듈을 작성하거나 iptables 규칙을 쌓아야 했다. 커널 모듈은 잘못 짜면 시스템 전체를 패닉시키고, ipt…
왜 리소스 격리가 문제가 되는가 한 호스트에서 여러 컨테이너를 돌리면 특정 프로세스가 CPU와 메모리를 독점하는 "시끄러운 이웃(noisy neighbor)" 문제가 생긴다. 격리 없이 배포하면 배…
어느 인기 상품 페이지의 캐시 키가 TTL 만료로 사라지는 순간, 그 키를 조회하던 수천 개의 요청이 동시에 캐시 미스를 만난다. 각 요청은 저마다 “내가 캐시를 다시 채우겠다”며 일제히 데이터베이…
쿠버네티스에서 오토스케일링은 “켜두면 알아서 잘 되는” 기능이 아닙니다. 기본값으로 HPA를 붙여놓고 트래픽 급증을 맞으면, 파드가 늦게 뜨거나 우르르 떴다가 다시 죽는 플래핑(flapping)을 …
TLS 인증서를 수동으로 관리하던 시절의 악몽은 대개 하나로 요약됩니다. “인증서가 만료됐는데 아무도 몰랐다.” 갱신 담당자가 퇴사했거나, 캘린더 알림을 놓쳤거나, 갱신은 했는데 배포를 잊은 채 서…
디스크 사용량이 이유 없이 계속 늘어난다. 데이터는 몇 달째 비슷한 규모인데 테이블 물리 크기만 부풀어 오르고, 어제까지 멀쩡하던 조회 쿼리가 점점 느려진다. 로그를 뒤져 보면 autovacuum …
서비스 메시는 마이크로서비스 사이의 통신을 애플리케이션 코드 밖으로 빼내어, 트래픽 관리·보안·관측성을 인프라 계층에서 일관되게 처리하는 기술입니다. mTLS 자동 암호화, 재시도와 서킷 브레이커,…
트래픽이 어느 정도 오르기 시작한 서버라면 누구나 한 번쯤 이 로그를 만납니다. Too many open files . 대개는 새벽에, 부하가 몰릴 때, 예고 없이 터집니다. 원인은 리눅스의 파일 …
클러스터를 운영하다 보면 파드가 엉뚱한 곳에 뜨는 순간이 반드시 온다. GPU 노드에 CPU만 쓰는 배치 파드가 스케줄돼 비싼 자원을 놀리거나, 레플리카 3개가 하필 같은 노드에 몰려 그 노드가 죽…
서버가 느려졌다는 알림을 받았을 때, 무작정 재부팅하거나 인스턴스를 키우는 것은 근본 원인을 덮는 임시방편입니다. 리눅스 서버의 부하는 크게 CPU, 메모리, I/O 세 축으로 나뉘며, 각 축마다 …
CDN을 앞단에 붙였는데도 오리진 트래픽이 줄지 않는다면, 십중팔구 캐시 전략이 잘못 설계된 것입니다. CDN은 “일단 앞에 두면 알아서 캐싱해주는 마법”이 아니라, 무엇을 얼마나 오래, 어떤 키로…
분산 시스템에서 장애는 “서버가 죽었을 때”만 발생하지 않습니다. 오히려 더 흔한 원인은 느린 응답 입니다. 하나의 다운스트림 서비스가 평소보다 몇 초 느려지면, 타임아웃을 걸어두지 않은 클라이언트…
사무실 유선망에서는 멀쩡하던 서비스가 지하철이나 엘리베이터에서 유독 버벅인다. 원인을 파고들면 HTTP/2도 완벽하지 않다는 사실에 부딪힌다. HTTP/2는 하나의 TCP 연결 위에 여러 요청을 다…
비동기 메시징을 도입할 때 가장 자주 마주치는 갈림길이 Kafka와 RabbitMQ 사이의 선택입니다. 둘 다 “메시지 큐”로 뭉뚱그려 불리지만, 설계 철학과 강점이 근본적으로 다릅니다. 잘못 고르…
서비스가 다운되고 나서야 알아채는 것은 이미 늦은 것이다. 프로덕션 환경에서 모니터링은 선택이 아니라 생존 전략이다. 이 글에서는 오픈소스 모니터링 스택의 사실상 표준인 Prometheus와 Gra…
마이크로서비스 아키텍처(MSA)를 설계할 때 서비스 간 통신 프로토콜 선택은 전체 시스템 성능과 운영 편의성을 좌우하는 핵심 결정입니다. REST는 수십 년간 표준으로 군림해왔지만, gRPC는 구글…
컨테이너는 격리되어 있다는 착각이 가장 위험하다. 도커 컨테이너는 호스트 OS 커널을 공유하고, 이미지 안에 취약한 라이브러리가 숨어 있거나 root로 프로세스가 실행된다면 침해 사고가 터졌을 때 …
로그는 시스템의 ‘블랙박스’다. 장애가 터졌을 때 로그 파이프라인이 제대로 갖춰져 있지 않으면, 원인 분석에 몇 시간이 아니라 며칠이 걸리기도 한다. 로그 수집 스택을 선택할 때 가장 많이 맞붙는 …
API 응답속도가 느리다는 민원이 들어오면 가장 먼저 손이 가는 해결책이 Redis 캐시입니다. 잘 적용하면 응답 지연을 100ms에서 5ms 이하로 줄이는 것이 현실적으로 가능하지만, 잘못 설계하…
웹 서비스가 트래픽 피크를 맞이하면 가장 먼저 무너지는 곳은 대개 데이터베이스 레이어입니다. “Too many connections” 에러, 쿼리 타임아웃, 결국 서비스 전체 다운 — 이 패턴은 커…
트래픽이 갑자기 10배로 폭증하는 상황을 상상해보세요. 평소에는 문제없이 돌아가던 서비스가 순식간에 500 에러와 응답 지연으로 무너집니다. 원인의 상당수는 애플리케이션 코드가 아니라 그 앞에 놓인…
수동으로 AWS 콘솔을 클릭해 인프라를 구성하던 시대는 끝났습니다. 클라우드 리소스가 수십, 수백 개로 늘어날수록 클릭 기반 관리의 한계는 명확해집니다. 설정 드리프트, 재현 불가능한 환경, 팀원 …
시스템이 복잡해질수록 “지금 무슨 일이 벌어지고 있나?”라는 질문에 답하기가 어려워집니다. 단일 프로세스 시절에는 로그 몇 줄로 충분했지만, 마이크로서비스가 수십 개 얽히고 쿠버네티스 위에서 수백 …
쿠버네티스 클러스터를 운영하다 보면 어느 날 갑자기 파드가 OOMKilled 상태로 재시작되거나, CPU 사용률은 낮은데 응답 지연이 급증하는 현상을 마주하게 됩니다. 대부분의 경우 원인은 reso…
컨테이너 이미지 용량은 배포 속도, 저장 비용, 공격 표면(attack surface) 세 가지에 직접 영향을 미칩니다. CI/CD 파이프라인에서 이미지를 매번 풀(pull)해야 한다면 500 MB…