장애 대처법

  1. 일단 마음을 가라앉힌다
  2. 가능하다면 이미 내 모듈에다가 상태를 파악할 수 있는 수단을 만들어뒀기를 기도한다.
  3. 그 수단 (상태 확인용 API라던가..) 을 사용해서 우선 내 API 상태가 정상인지 확인한다.
    1. 그런 수단이 없다면 서버로 들어가서 로그를 먼저 본다.
    2. 로그에 딱히 이상한게 없다면 이번엔 문제 기능을 직접 호출해서 테스트해본다.
    3. 문제가 없다면 이번엔 외부의 다른 위치에서도 정상적으로 작동하는지 확인해본다. 다른 IDC, 한국이면 한국, 일본이면 일본 등 되도록 다양한 위치에서 확인한다.
  4. 이래도 저래도 내 문제가 아닌 것 같다면 내 모듈을 사용하는 쪽에다가 확인용 API 등을 보내서 curl 같은걸로 테스트 해달라고 한다.
  5. 그 쪽에서 확인 결과 정상 작동한다고 하면 이제 이건 내 문제가 아니고 그쪽 클라이언트 문제이므로 그렇게 말하면 된다.
  6. 그런데 이 때, 정상작동하지 않으면 이건 네트워크, 인프라의 문제일 가능성이 있으므로 조사할 필요가 있다.
    1. ACL, 라우팅, L4 등 다양한 가능성이 있으므로 하나하나 찾아봐야한다.

사례 정리

1. Feedback API 호출 실패

상황

내 Rest API 사용하는 클라이언트가 어느 시점부터 Connection 오류가 뜬다고 연락이 옴. 확인해보니 로컬, 다른 한국쪽 서버, 다른 일본쪽 서버에서 시도해봤을 때 모두 정상적으로 호출됨. 사용자의 해당 서버에서 curl로 시도했을 때도 문제없이 동작.

원인

알고보니 L4서버와 내 Rest API 서버간 tcp connection은 timeout이 30분인데 내 서버에 별도 알림 없이 그냥 connection을 끊어버림. 보통은 이런 경우 새로 connection을 맺어서 사용하기 때문에 문제가 발생하지 않는데, 해당 클라이언트에서는 내 API를 호출할 때 connection을 pooling 해두고, 또 그 클라이언트의 timeout 세팅이 30분보다 길었기 때문에 문제가 발생함. 이 때 클라이언트 - L4 사이의 connection은 살아있는 것으로 간주되어 계속 그 connection을 사용하려고 시도함. 그러나 API 호출이 30분 이상 없어서 L4에서는 내 서버로 connection을 끊어버린 상황. 그러므로 당연히 정상 동작하지 않음.

해결책

  1. 클라이언트 서버의 커널 tcp connection timeout 설정을 30분 미만으로 수정. 이렇게 하면 30분 이상 요청이 없을 때 클라이언트가 connection을 정리하므로 재발 방지
  2. 클라이언트에서 api를 호출할 때 connection 오류가 뜨면 새로운 connection을 맺어서 retry하도록 로직 추가.

딱히 내가 뭘 어떻게 할 수 있는 부분은 없었음.

results matching ""

    No results matching ""