울음참고 개발공부
728x90

 

 

 

Quartz 란 ? 
-자바(Java) 기반의 오픈 소스 스케줄러 라이브러리
-특정 작업(Job)을 정해진 시간(스케줄)에 맞춰 자동으로 실행해주는 도구
- DB 연동 및 클러스터링 기능 제공 

 

 

 

Quartz 에 대해서 공부하던 중, 클러스터링 기능을 제공한다는 것에 대한 이해가 되지 않았다. 

애초에 클러스터링 개념에 대해 잘 알지못하는 것도 있었다. 

 

 

📌 'Quartz 에서 클러스터링 기능을 제공한다'는 의미에 대해 알아보자 

 

 

Clustering 의 일반적인 개념

내가 기존에 클러스터링에 대해 알고 있던 개념은 다음과 같다( 정처기 공부할 때 배운내용임 )

 

  • 두 대이상의 서버를 하나의 서버처럼 운영하는 기술
  • 서비 이중화 및 공유 스토리지를 사용하여 서버의 고가용성을 제공함
  • 클러스터링 종류
    고가용성
    클러스터링
    • 하나의 서버에 장애가 발생하면 다른 노드(서버)가 받아 처리하여 서비스 중단을 방지하는 방식
    • 일반적으로 언급되는 클러스터링이 고가용성 클러스터링임
    병렬 처리
    클러스터링
    전체 처리율을 높이기 위해 하나의 작업을 여러 개의 서버에서 분산하여 처리하는 방식

 

 

Quartz  의 Clusterubg

 

Quartz 에서 클러스터링이란,

 

  • 여러 개의 Quartz 인스턴스(=여러 대의 서버)가 하나의 스케줄링 시스템을 공유하여 작업(Job)을 분배해서 실행할 수 있도록 하는 기능
  • 여러개의 Quartz 인스턴스가 같은 DB를 공유하여 Job을 중복실행하지 않도록 조정하는 기능
  • 한 서버가 다운되더라도 다른 서버에서 Job을 이어서 실행 가능 

 


 

 

+ 추가 1

 

개념적으로는 그렇구나 싶지만 여전히 완벽한 이해하진 못했다. 

 

>>>>>>  ' 여러 개의 서버' 에서 실행한다 ?? 

 

JVM 이 실행되면 Tomcat(Web Server)이 올라가면서 특정 포트(ex:8080)에서 요청을 받을 수 있게 된다.

그럼 하나의 서버가 되는건데  다음과 같은 의문점이 든다

 

 

[ 문제 ]

 

Q: '여러 개의 서버' 라는 것은 포트를 여러 개 띄운다는 것을 의미할까 ? 

A :

 

 

[ 정리

 

-> JVM은 하나의 애플리케이션만 실행할 수 있으므로, 여러 개의 서버를 실행하려면 JVM도 여러 개 실행해야한다. 

 

JVM 을 여러개 실행하려면 서버를 다른 물리 머신에 배포해야한다. 

 

예를 들어 나의 상황으로 가정하면 나는 GCP 인스턴스에 8080 서버하나만 띄워놓은 상태인데 같은 GCP 인스턴스에 8080,8081 을 배포하는건 의미가 없고 ,다른 GCP 인스턴스에 각각 배포해야 한다는 것이다. 

 

 

 


 

 

+ 추가 2

 

여기서 또 다시 든 의문점

 

>>>>>> ' 서버를 왜 굳이 여러 개 띄우는 거지????'

 

 

현재 내가 진행하는 프로젝트로 가정할 때, Job의 부하가 크지 않아 서버 한대만으로 충분해보인다.

 

 

📌 서버를 여러 개 띄워야하는 상황에 대해서 알아보자 

 

[ 서버 여러 개 띄우는 게 필요한 경우 vs 필요 없는 경우 ]

서버 여러 개 (Clustering 필요) 서버 한개 (Clustering 불필요)
서버 장애 발생 시에도 Job이 멈추면 안되는 경우 서버가 항상 정상적으로 동작하는 경우
Job 개수가 많아 실행 시간이 길어지는 경우 Job 개수가 적고 실행 시간이 짧은 경우
부하가 커져서 서버가 감당하기 어려운 경우 서버 1대가 충분히 감당 가능한 경우
서비스가 커지면서 서버 확장이 필요한 경우 서버 확장 계획이 없는 경우

 

 

서버 하나로만 배포왔기 때문에 여러 개의 서버가 필요할 수 있다는 생각은 못해봤는데 새롭게 깨달았음 

 

 


 

+ 추가 3)

 

그렇다면 clustering 이 필요한 경우 설정하는 방법은 ? 

 

spring boot 에서 clustering을 사용하는 경우에는 우선 라이브러리를 추가해주어야한다.

<!-- quartz 스케줄러 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-quartz</artifactId>
		</dependency>

 

 

이후 Quartz를 클러스터링 모드로 동작시키려면, Quartz의 기본 설정 파일(quartz.properties)을 만들고 클러스터링을 위한 설정을 추가해야한다.

 

그다음 application.properties 또는 application.yml 에서 Quartz 설정을 포함시킨다.

 

클러스터링이 활성화되면 Quartz는 다수의 서버에서 동일한 DB를 통해 Job 정보를 관리하고, 각 서버는 DB에 기록된 Job 상태를 기반으로 Job 실행 여부를 결정하는데, 이때 DB 락을 사용하여 두 서버에서 동일한 Job이 중복 실행되지 않도록 보장한다.

 

 

 

 

 


결론


✔ 서버를 여러 개 띄운다는 것은 여러 개의 JVM에서 같은 애플리케이션을 실행하는 것을 의미함.
✔ Quartz Clustering은 여러 JVM에서 실행되는 Quartz가 같은 DB를 공유하면서 Job을 관리하는 것을 의미함.
서버 A가 죽어도, 서버 B가 Job을 대신 실행할 수 있도록 클러스터링을 설정하는 것이 핵심

 

 

 

728x90
profile

울음참고 개발공부

@메각이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!