23.06 / DB 서버 장애

문제 상황
이건 또 뭔 에러냐
6월의 어느 날, 슬랙이 요란하게 울렸다. 근데 난생 처음 보는 타입의 에러였다. 'Cannot Create Transaction 이라면 DB 쪽 에러인가??' 싶어서 서비스의 유일한 DB 공지사항 페이지를 들어가 보았다. 접속과 동시에 슬랙이 다시 전송되었다. DB 관련 에러가 확실해졌다.
불확실 덩어리
문제는 언제 터진 것인지, 원인이 무엇인지 파악조차 힘들었다.
유저들이 공지사항은 거의 안 봐서 슬랙 알람이 온 시점에 DB 서버가 장애가 났다고 장담할 수도 없었고, 복구를 위한 원인 파악도 매우 힘들었다. 어떤 요소들이 힘들었는지 재발 방지를 위해 행동한 점들을 사건의 시간 순서대로 기술해 보려고 한다.
진행 과정
최악의 선택, 끔찍한 결과

처음에는 당연히 내 서버 에러인 줄 알고 단순하게 접근했다. 마법의 재부팅을 믿었고, 그냥 API 서버의 도커 프로세스를 껐다가 키는 최악의 선택을 했다. 이게 왜 최악의 선택이었냐면, 사실 DB 서버 쪽 에러였고 그 외 기능들은 정상 작동 중이었을 것으로 추정된다. 그런데 데이터베이스 커넥션 자체가 안되는 상황에서 단순하게 껐다 키려니까 커넥션 에러로 서버 실행이 아예 불가능해졌다.
이제 단순히 DB 장애에서 모든 서버 관련 기능이 마비되는 장애로 확산되었다. 진짜 말 그대로 빈대 잡으려다 초가삼간 다 태우고 있었다. 문제는 데이터베이스 서버가 왜 접속이 안 되는지 원인 파악조차 못하고 있었다.
원인 파악이 왜 힘들었나?

DB 서버가 클라우드 타입(Paas, 헤로쿠와 유사)으로 한번 래핑되어 있는게 문제였다. 클라우드 타입은 관련 깃허브 레포지토리 혹은 간단한 설정을 통해 배포를 손쉽게 도와주는 서비스인데, 예전에 IP 주소를 찍어봤더니 구글 쪽 서버를 사용하는 듯 했다. 어쨌든, 데이터베이스에 대한 수요도 많지 않고 AWS 프리티어도 끝나가는 마당에 굳이 AWS RDS를 써야 하나 싶어서 사용했는데 문제는 아직 신생 서비스라 그런지 확인할 수 있는 정보가 굉장히 제한적이다.
왜 터졌는지 로그라도 보고 싶은데 외부에서는 확인할 방법을 마땅히 찾지 못 했고, 결국 서버에 접속해서 뭔가 작업을 해야 하는데 뭔 이유인지 접속이 되지를 않으니 환장할 노릇이었다.
심폐 소생 도전, 그리고 셀프 부활
이제 DB 서버가 문제인 것은 파악했다. 다른 기능이라도 빨리 재 가동 시켜야 해서, 데이터베이스 관련 기능은 그냥 다 열심히 주석을 치고 있었다. 근데 로컬에서 코딩 중 DB 관련 테스트 코드가 실행되었는데, Pass가 떴다. 오잉? 싶어서 터미널 접속을 시도했더니, 아무 일도 없었다는 듯이 멀쩡하다. 그래서 다시 EC2에 들어가서 도커 프로세스를 재 가동 했다. 정상적으로 부팅 되었다.
해결책
자금난
이런 대책 없는 에러를 겪고 나니 서버 이주의 필요성을 간절하게 느꼈다. 문제는 위에서 기술 했듯이, AWS RDS 쓰기에는 이제 진짜 프리 티어 종료가 코앞이라 도저히 손이 안 간다. 물론 얼마 안 나올 거 같긴 한데, 굳이 안 쓰는 건 나만의 서비스 철학이 있다.
맵샷에서 발생하는 지출은 오롯이 맵샷의 수익으로 땜빵이 가능해야 한다
광고비 잘 나올 때는 그래도 달마다 1,2만원 정도는 챙겨갔는데, 요즘 광고 단가가 처참해서 최대한 아껴야 한다.
경량 DB
그래서 결정한 방식은 H2 데이터베이스를 파일 형식으로 이용하는 것이다. 보통 테스트 용도로 많이 쓰는 DB고, 인 메모리 형식으로 많이 사용하는데 내 서비스에서는 이 정도면 충분하다고 생각했다. 한 가지 문제점은 단일 파일 형태로 관리하다 보니 외부에서 터미널로 접속해서 내용을 편집하는 것이 쉽지는 않아서, 공지사항 관련 CRUD 기능들을 서버에 추가하고 별도의 관리자 페이지를 통해 내용을 편집할 수 있게 했다.
결론
공짜 좋아하지 말자.
대머리는 둘째 치고 서비스 장애 시 내가 취해볼 수 있는 행동의 제약이 굉장히 커지는 것 같다. 예전에 Freenom 도메인 때도 그렇고, 오라클 서버 등등 '어차피 공짜로 잘 썼잖아? 뭘 그렇게 바래?' 식의 태도를 많이 봐서, 되도록이면 돈 주고 쓰자. 그래야 내가 주장할 권리도, 말에 담기는 힘도 세지는 것 같다.
Last updated