ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Infra] 무중단 서비스를 위한 Health Check
    프로젝트/뉴스타 2024. 6. 14. 08:32

    무중단 서비스를 위한 Health Check 왜 궁금했을까❓

    뉴스타 프로젝트는 CI/CD 과정에서 서비스가 중단되는 문제점이 존재했다. 이를 해결하고자 블루-그린 배포 전략을 도입하기로 했고 새로운 서버의 상태를 체크하는 Health Checking 과정이 필요했다. 단순히 서버에 ping을 쏴서 확인하는 방법도 있었지만 지원하는 라이브러리와 프로젝트 상황에 맞게 API를 만들어보려고 한다.

     

     

    1. Health Check 란?

    서버가 정상적으로 작동하고 있는 지를 체크하고자 하는 것

    1.1 Health Check 방법

    1. Docker 명령어
      • Docker에서 Health Check를 위한 명령어가 존재한다.
      • HEALTHCHECK 명령어를 사용해서 컨테이너의 상태를 파악할 수 있다.
      • interval, timeout, retries를 통해 간격, 타임아웃, 타임아웃 횟수를 지정할 수 있다.
    2. API 응답
      • Health Check를 위한 API를 만들어 정상적으로 응답이 오는지 확인하는 방법이다.
      • Health Check 기준을 개발자가 원하는 방법을 사용할 수 있다.

     

    2. 프로젝트 적용

    Docker Container가 정상이지만 서버가 올라가는 짧은 시간에 사용자 요청을 처리할 수 없는 상황이 있다는 것을 알았다. 그래서 API를 제작하여 정상적인 응답이 오는 것을 기준으로 Health Check를 만들었다.

    2.1. Spring Boot

    build.grade

    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    • Spring Boot는 여러 가지 서버 정보를 모니터링하기 쉽게 제공하는 라이브러리가 존재한다.
    • spring-boot-starter-actuator를 의존성으로 추가하면 기본적으로 헬스 체크 엔드포인트가 활성화된다.
     

    Endpoints :: Spring Boot

    If you add a @Bean annotated with @Endpoint, any methods annotated with @ReadOperation, @WriteOperation, or @DeleteOperation are automatically exposed over JMX and, in a web application, over HTTP as well. Endpoints can be exposed over HTTP by using Jersey

    docs.spring.io

    application.yaml

    management:
      endpoints:
        web:
          exposure:
            include: health
    • actuator에서 제공하는 모든 서비스를 포함하게 되면 서버에 치명적인 보안 위협이 될 수 있다. 따라서, yaml 파일에 노출시킬 서비스만 작성을 해서 서비스를 활성화시킨다.
    • 자세한 정보를 보기 원한다면 위 링크를 통해서 확인할 수 있다.
    • https://[도메인]/api/actuator/health로 요청하게 되면 아래와 같은 응답을 받을 수 있었다.
    {
    	"status": "UP"
    }

     

    2.2. FastAPI

    # 서버 상태 체크
    @router.get("/health")
    def health_check():
        return { "status" : "UP" }
    • FastAPI의 경우 Health Check API를 직접 만들었는데 위와 같이 json 형식을 반환하는 형식이였다.
    • 하지만, 뉴스타 서비스가 재시작할 때마다 추천 모델이 하나 만들어져야 하는데 서버가 올라올 뒤에 해당 모델이 만들어졌다.
    • 모델을 만드는데 3~4분 정도가 소요되는데 모델이 없으면 사용자에게 뉴스 추천이 안되는 문제점이 있었다.
    # 서버 상태 체크
    @router.get("/health")
    def health_check():
      if os.path.isfile("news.doc2vec"):
        return { "status" : "UP" }
      else:
        return { "status" : "DOWN" }
    • 서버 UP과 모델 생성 사이에 3분 ~ 4분이 격차가 생겨서 서비스가 올바르게 작동하지 않는 문제점을 해결하기 위해 모델을 체크했다.
    • 모델이 생성이 되었다면 정상적인 서비스가 가능하다는 것이고 아니면 DOWN 상태인 것이다. 이처럼 Health Check를 커스텀하여 위와 같은 문제점을 해결할 수 있었다.
Designed by Tistory.