PORTFOLIO · 홍성빈 · Infra Service Engineer

서버가 멈춰도 서비스는 이어지게,
장애는 고객보다 먼저 보이게 운영해 왔습니다.

CJ올리브네트웍스 · 2026년 하반기 신입사원 · Infra Service Engineer 지원
모플 Infra Engineer 인턴 2023.11–2024.06 / 이후 Data Engineer 2024.06–2025.11 · h0422ys@naver.com · github.com/VertexToEdge
#사례문제 → 결과공고 업무쪽
01모니터링·알람 구축장애 포인트 식별 시간 30분 → 5분 [실측]모니터링·장애 관리02
02단일 장애 지점 제거컴포넌트 하나만 멈춰도 서비스 중단
→ 5개 핵심 컴포넌트 이중화 · 서버실 3곳 연결
온프레미스 구축·운영03
03운영 작업 자동화재배치는 담당자 1명만 가능 → 재배치 CLI 자동화, 부재 중 동료가 재배치 수행서버 운영04
04장시간 쿼리 무한 대기 장애10분 넘는 쿼리만 응답 없음 → 커널 keepalive 튜닝, 재발 없음 [관찰]장애 관리05
05장애 전환 버그 수정리더 교체 후 전 레플리카 접속 실패 → upstream 수정 머지장애 관리06
수치 옆에 실측 · 관찰 · 추정을 구분해 표기합니다. PoC와 운영을 구분해 적습니다.
01 / 06
01 / 모플 · 온프레미스 모니터링

장애를 고객 문의로 알던 팀이, 알람으로 먼저 알게 됐습니다.

주식회사 모플 · Infra Engineer 인턴 · 2023.11–2024.06 · AI 기반 물류 최적화 스타트업(6명)

문제

모니터링이 없어 장애를 고객 문의로 알았습니다. 장애가 나면 담당 엔지니어들이 모여 SSH로 서버마다 접속해 로그를 뒤졌습니다.

영향

  • 장애마다 6명 팀의 제품 개발 시간이 빠져나감
  • 특정 컴포넌트 장애는 그 담당자만 대응 가능

해결 · 도구보다 필요한 정보부터

  1. 담당자별로 장애 때 무엇을 확인하는지 인터뷰
  2. Prometheus(지표) · Loki(로그) ·
    Grafana(대시보드·알람) 구축
  3. 담당자별 확인 정보를 대시보드와 알람 규칙에 표준화

As-is → To-be · 장애 포인트 식별 시간 [실측]

약30분→약5분
장애 인지고객 문의→알람으로 선인지
대응 가능 인원컴포넌트 담당자→팀 전원
Prometheus · Loki · Grafana · Alerting
02 / 06
02 / 모플 · 단일 장애 지점(SPOF) 제거

하나만 멈춰도 서비스가 멈추는 구조를, 이중화와 서버실 간 연결로 바꿨습니다.

서버실 A서버실 B서버실 C WireGuard 오버레이 (Netmaker) 개념도 · 실제 서버 배치와 다름

문제

MariaDB · PostgreSQL · HDFS · Redis · Airflow가 각각 단일 장애 지점이었고, 서버실 3곳의 워크로드가 분리돼 서버실을 넘는 이중화가 어려웠습니다.

결정 지점검토한 대안선택기준
서버실 연결 방식Kubernetes 멀티클러스터
+ Calico CNI
(문서·아키텍처 조사, k3s PoC)
기존 워크로드 유지 + 네트워크 계층부터 분리팀 학습 곡선
인수인계 비용
VPN 솔루션IPSec 기반 DMVPN(FRR) PoCWireGuard 기반 MeshVPN(Netmaker) PoC 후 채택인수인계
유지보수 용이성
종합 비용
PostgreSQL 이중화—새 데이터웨어하우스의 일관성 전략 수립가장 까다로웠던 트레이드오프

결과

  • 5개 핵심 컴포넌트 이중화 · 서버실 3곳 간 오버레이 네트워크 · VPN 2종 PoC 비교
  • AI 추론용 워크스테이션 서버 8대 운영 · Airflow로 자원 할당·워크플로우 관리, PLG로 상태 모니터링

기술 선정 기준

도입 후보는 추상적인 장단점이 아니라 작은 PoC로 리소스 모델, 장애 진단 경로, 네트워크 동작, 운영 전환 비용을 함께 검증합니다.

MariaDB · PostgreSQL · HDFS · Redis · Airflow · WireGuard · Netmaker · FRR
03 / 06
03 / 모플 · 오버레이 네트워크 HA 인프라 운영 자동화

담당자만 할 수 있던 재배치를, 부재 중에도 동료가 이어받게 만들었습니다.

Infra Engineer 기간 마지막 약 1개월

문제

컴포넌트마다 이중화 방식과 연결 규칙이 달랐습니다. MQTT는 HA에 고정 포트가 필요했고, 리버스 프록시(Caddy)는 keepalived로 이중화해야 했습니다. 노드 간 재배치는 내부 구조를 아는 한 사람만 할 수 있었습니다.

해결 · 원하는 배치를 선언하면 도구가 구성을 계산, 서버 간 마이그레이션은 CLI 명령 1개로 자동화

입력

컴포넌트별 이중화 개수
가용 영역(서버실)별 할당

→

계산

고정 IP · 포트포워딩
컴포넌트 간 external 설정

→

출력

즉시 배포 가능한 docker-compose 파일
마이그레이션 절차 문서

선택과 대안

  • 수작업 절차 문서화: 통신 구조를 숙지해야 하는 부담이 남아 제외
  • Golang: 팀에 Go 사용자가 없어 Python 선택

검증 [관찰]

본인 휴가 중 동료가 서버 간 마이그레이션을 대신 수행했습니다.

운영 기준

검증된 구성을 사람이 반복하지 않고 도구가 재현하게 만들면 운영 작업의 속인성이 사라집니다.

Python · docker-compose · keepalived · WireGuard
04 / 06
04 / 모플 운영 장애 · Data Engineer 재직 중 · Docker 기반 백엔드·데이터 파이프라인

쿼리는 끝났는데 응답이 오지 않던 장애를, 연결 계층까지 좁혀 해결했습니다.

기본값조치 후 네트워크 경로 idle timeout 약 10분 → 연결 제거 첫 probe 7,200초 (시간축 비례 아님) 300초마다 probe → 연결이 idle로 판정되지 않음

01 문제

약 10분 이상 걸리는 PostgreSQL 쿼리에서만 간헐적으로 결과가 안 돌아옴. 서버는 쿼리 완료, 클라이언트는 무한 대기.

02 원인

TCP 세션 비교: 서버엔 없고 클라이언트에만 남음 → 연결 계층 문제. 쿼리 시간 조절로 재현:
idle 약 10분 < keepalive 기본 7,200초.

03 제약과 선택

timeout 장비는 제어 권한 없음. 앱 타임아웃은 대기만 끊을 뿐 → keepalive probe를 먼저 보냄.

04 조치 · 세 계층 모두 적용

  • 접속 문자열 keepalive 활성화
  • tcp_keepalive_time 7,200초 → 300초
  • 컨테이너 network namespace에도 동일 sysctl

전역 설정 부하 검토 [추정]

상시 세션 약 50개 기준 약 0.33 pps

05 결과 [관찰]

장시간 쿼리 정상 반환, 동일 장애 재발 없음.

검증 기준

설정 뒤 동작 조건까지 확인. SO_KEEPALIVE가 꺼져 있으면 커널 값을 낮춰도 probe가 안 나가고, 컨테이너는 호스트 설정만으로 적용을 보장할 수 없음.

Linux TCP keepalive · sysctl · Docker network namespace · PostgreSQL
05 / 06
05 / 모플 인턴 · 운영 중 발견 · 오픈소스 upstream 기여

이중화한 구성이 장애 순간에 멈추는 버그를, 원인 라이브러리까지 추적해 고쳤습니다.

Netmaker레플리카 옛 리더 (종료됨) 새 리더 (선출됨) 수정 전: 계속 접속 시도·실패 수정 후: 새 리더로 전환

문제

Netmaker를 HA로 운영하던 중, 설정 저장소인 분산 DB rqlite의 리더를 종료하자 새 리더는 선출됐는데 레플리카 전부가 죽은 리더에게만 계속 접속을 시도했습니다.

원인 → 조치

Netmaker 코드가 아니라 DB 연결을 맡은 구버전 gorqlite 라이브러리의 버그. gorqlite 업그레이드와 InitRqliteDatabase() 호출 방식 수정 (+5 / −3).

결과

gravitl/netmaker#2799 머지 (2024-02) · v0.23.0 릴리스 포함

운영하며 발견한 문제를 upstream에서 고친 다른 사례

프로젝트문제 → 수정PR · 반영
Apache Airflow대시보드 로딩 약 10초, 정적 파일 캐시 해제 → 12시간 캐싱 복원#39345 · v2.9.2
Mattermost채널 멤버 검색 불일치 → substring 매칭#35017 · v11.7.0
tap-postgres스트림별 조건 지정 불가 → custom WHERE 추가#628 · v0.2.0
rqlite · Go · 분산 DB 리더 선출
06 / 06