평화로운 날
2022년 12월 23일. 크리스마스 이브 전날이자, 코로나 백신 접종으로 얻은 소중한 1일 휴가였다. 오전에는 멘토님, 그리고 그의 제자분과 건대 롯데백화점에서 커피챗을 하며 시간을 보냈다.
하지만 이날의 메인이벤트는 저녁이었다. 크리스마스 기념으로 청담동 우마카세를 예약해 뒀기 때문이다. 인천에서 차를 끌고 올라오는 친구를 기다리며 카페에 앉아있던 오후, 너무나 평화롭게 시간을 때우고 있었다. 오후 6시. 친구가 거의 도착했다는 연락을 받았고, 나는 청담동으로 이동할 채비를 했다. 딱 3분 뒤, 내 휴대전화가 진동하기 전까지는 모든 게 완벽했다.
18:03, 재앙의 시작
장애 알림 문자와 동시에 회사에서 전화가 걸려 왔다. "야 서비스 안된다"
카페 테이블에 급하게 노트북을 펼쳤다. VPN을 통해 서버에 접속해 로그를 훑었다.
'어...? 이건 뭐지?'
3년을 일하면서 웬만한 에러 로그는 눈에 익었다고 생각했는데, 처음 보는 패턴이었다. 단순한 애플리케이션 에러가 아님을 직감했다.
VPN을 통한 터미널 반응 속도는 답답할 정도로 느렸다. 이 속도로는 복잡한 이슈를 트래킹할 수 없다.
"비상비상 나 회사 가야하는데 어쩌냐" 친구에게 전화를 걸어 상황을 설명했다.
친구는 회사 욕을 한 바가지 했다.
예약금이고 뭐고 일단 회사를 가긴 해야하니까 지하철을 타고 회사로 향했다.
꺼지지 않는 서버, 쉴 수 없는 영혼
지하철을 타고 가면서 휴가만 쓰면 이 사단이 나는 서러움과 함께 보상 휴가를 챙겨야겠다는 생각이 들었다.
"분명 불금이고 휴가인데 오후 6시가 지난 시점에 나는 왜 회사를 가고 있는걸까"
서버는 잠들지 않는다. 내가 자고 있을 때도, 밥을 먹을 때도, 소중한 사람과 시간을 보낼 때도 누군가는 이 서비스를 이용한다. 그 끊임없는 연결을 지탱하는 것이 내 일이다.
장애 알림이 울리는 순간, '나'라는 개인의 시간은 멈추고 '엔지니어'로서의 시간이 강제로 흐르기 시작한다.
이게 참 슬픈 일이다. 하지만 동시에, "지금 이 문제를 해결할 수 있는 사람은 나밖에 없다"는 현실이 나를 사무실로 향하게 만든다. 누군가의 비즈니스, 누군가의 편리가 멈춰 서 있는 걸 보고만 있을 수 없다는 그 묘한 직업병.
비싼 소고기보다, 친구와의 약속보다, 지금 당장 죽어있는 저 서버를 살리는 게 우선순위가 되어버린 현실이 씁쓸하면서도, 선택권이 ㅇ벗다는 것을 다시 한번 깨닫는다.
트러블슈팅: 모래사장 그만 뒤지고, 바늘만 있는 곳을 찾자
회사에 도착하자마자 모니터 앞에 앉았다. 트래픽은 계속 들어오고 있었고, 에러 로그는 폭포수처럼 쏟아지고 있었다. 감상은 뒤로하고, 이제는 해결해야 할 시간이다. 내가 3년 동안 구르며 경함한 팁들을 하나를 적용했다.
"그동안 발생했었던 문제가 재발하였는지", "트래픽이 가장 많은 서버 말고, 가장 적은 서버를 보자."
트래픽이 몰리는 메인 서버의 로그를 tail로 걸어두면, 너무 많은 정보가 순식간에 지나가서 정작 중요한 단서를 놓치기 쉽다. 나는 QPS 가 가장 적은 서버를 골라 로그를 분석하기 시작했다.
원인 발견
노이즈가 줄어드니 패턴이 보였다. 특정 클라이언트들과의 통신 핸드쉐이크(Handshake) 과정에서 문제가 발생하고 있었다.
에러를 검색하고 기억을 다듬으니 TLS 1.1 이하 버전이 중단된다는 긱뉴스가 떠올라 통신 문제로 좁혀졌다. 우리쪽이 버전이 낮아서 그랬다.
긴급 조치
원인을 파악했으니 해결을 해야 한다. 인증서 갱신이나 프로토콜 버전 업그레이드를 유도하기엔 당장 서비스가 멈춰 있었다.
우선 급한 불을 끄기 위해 통신 구간을 평문으로 통신하도록 코드를 수정하여 배포했다. 보안상 좋지 않지만, 누군가의 정보가 담긴것도 아니기에 문제가 없다고 생각하고 당장 서비스가 죽어있는 것보다는 낫다는 판단이었다.
코드를 수정하고 배포하여 에러 로그가 멈추는 것을 확인하기까지 약 30분이 걸렸다.
장애 복구는 배포가 끝이 아니다
기술적인 문제는 30분 만에 해결했지만, 진짜 '복구'는 그때부터였다.
- TTL(Time To Live) 캐싱 이슈: DNS나 내부 캐시들이 갱신되는 데 시간이 걸려 일부 사용자에게는 여전히 접속 오류가 발생했다.
- CS 대응: 공지사항을 작성하여 띄우고, 빗발치는 전화 문의에 대응 가이드를 전달했다.
결국 상황이 완전히 종료되고 모니터링 모드로 전환한 것은 사건 발생 2시간이 지난 뒤였다.
회고 및 교훈
Keep (좋았던 점)
- 빠른 판단: 바로 사무실 복귀를 선택
- 디버깅 전략: 트래픽이 적은 서버를 타겟팅하여 로그 분석 시간을 단축
Problem (아쉬웠던 점)
- Work-Life Balance의 실종: 휴가 중에도 언제 터질지 모르는 폭탄을 안고 사는 듯한 긴장감
- 모니터링 사각지대: TLS 버전 이슈 같은 인프라/프로토콜 레벨의 문제는 사전에 감지하기 어려웠다.
Try (시도할 점)
- 프로토콜 버전 호환성 체크 로직 추가 및 인프라 점검 자동화.
- 장애 발생 시 휴가자 대응 인력은 기대할 수 없어 반차 휴가를 요구.
연차를 희망하였지만 거절당했다.
에필로그
모든 상황이 정리되니 배가 고파왔다. 시계를 보니 저녁 8시가 넘어가고 있었다.
날이 날이라 그런지 외국인이 많은 팀은 회식중이라하고, 사무실에는 나를 위로해주기 위해 남아있던 동료 한 분만 계셨다.
우마카세 한탄을 하니 돼지고기 집으로 데려다줬다.
청담동 최고급 우마카세 소고기가 지글지글 굽는 삼겹살로 바뀌는 순간이었다. 그래도 문제 해결 후 먹는 삼겹살에 소주 한 잔은 개인주의가 심한 이 회사에서 만큼은 특별하게 느껴졌다.
'실무 경험 > 실무 개발 & 협업' 카테고리의 다른 글
| 휴먼에러를 방지하는 방법 1 - git add -p(git add partial (or patch) (0) | 2025.04.24 |
|---|---|
| [Block Chain] - Integer overflow 그리고 underflow (0) | 2025.04.21 |
| 2023 - Bulk Mailler 실종 사건 (0) | 2024.02.29 |
| [문서화] - API 문서 도입 + 작성하기 (0) | 2024.02.16 |
| 2022 - TLS 1.0, TLS 1.1 지원 중단으로 인한 TLS 버전 업그레이드 회고 (0) | 2024.02.10 |