-
Quartz2🌱 spring/🚛 spring batch 2022. 12. 22. 18:07
DB 기반의 스케줄러
Quartz는 메모리 기반 스케줄러뿐 아니라 DB 기반의 스케줄러도 지원한다.
- DB 기반의 스케줄러는 스케줄러 정보를 메모리가 아닌 DB에 저장하기 때문에 다중 서버간 스케줄링이 가능하다!
Quartz는 master-slave 형태로 서로간의 통신을 하지않고 단순히 DB 업데이트 정보를 기반으로 각각의 스케줄 인스턴스가 자기가 실행해야하는 Job을 실행한다.
Cluster 환경에서 스케줄링이 가능해 Non-Cluster 환경에 비해 여러가지 장점이 존재한다.
- 고가용성 (HA, High Availability)
- 한 서버가 셧다운 되도 다른 서버에 의해 Job이 실행된다.
- 확장성 (Scalability)
- Quartz 설정된 서버를 구동하면 자동으로 DB에 스케줄 인스턴스로 등록된다.
- 셧다운된 서버는 다른 서버에 의해서 DB에서 삭제된다.
- 로드밸런싱 (Load balancing)
- Cluster 구성으로 여러 Job이 여러 서버에 분산되어 실행된다.
- random 알고리즘만 제공한다.
🔨 Quartz Cluster 스케줄러 구축
Quartz를 위한 DB 스키마 생성
DB 스키마는 Quartz의 소스코드에 포함되어 있다.
MySQL 사용
CREATE DATABASE spring_boot_quartz_cluster_practice; CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NAME VARCHAR(120) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE VARCHAR(1) NOT NULL, IS_NONCONCURRENT VARCHAR(1) NOT NULL, IS_UPDATE_DATA VARCHAR(1) NOT NULL, REQUESTS_RECOVERY VARCHAR(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) ); ....(생략)....
📍 Quartz 관련 설정
DataSource, Quartz 속성값 설정
application.yml
spring: profiles: quartz jpa: database: mysql show-sql: true open-in-view: false hibernate: ddl-auto: none properties: hibernate.dialect: org.hibernate.dialect.MySQL5Dialect datasource: hikari: jdbc-url: jdbc:mysql://localhost:3306/spring_boot_quartz_cluster_practice username: {name} password: {pwd} driver-class-name: com.mysql.cj.jdbc.Driver quartz: job-store-type: jdbc scheduler-name: MyScheduler jdbc: initialize-schema: always schema: classpath:quartz-create.sql overwrite-existing-jobs: true
quartz.properties
org.quartz.jobStore.isClustered = true
⚠️ Cluster 설정시 주의
서버 타임 동기화
- Quartz는 내부적인 로직안에서 시간으로 판단하는 부분이 많아 서버 타임 동기화가 필수다
Quartz 설정 튜닝
- Job Workload Type에 따라 Quartz 설정 튜닝이 필요
- Long Job - 장시간 실행되는 Job
- Short Job - 짧게 실행되는 Job
- short job 같은 경우에는 1초마다 실행되는 것을 보장해야 한다.
- 한 서버가 셧다운 될 경우 실행중인 Job이 misfire 되고 다른 서버가 바로 이어서 실행해야 하는 조건이 있다면 튜닝이 필수
#============================================================================ # Configure Main Scheduler Properties #============================================================================ org.quartz.scheduler.instanceName=admin-tmon-media org.quartz.scheduler.instanceId=AUTO org.quartz.scheduler.batchTriggerAcquisitionMaxCount=20 org.quartz.scheduler.idleWaitTime=1000 org.quartz.scheduler.skipUpdateCheck=true #============================================================================ # Configure ThreadPool #============================================================================ org.quartz.threadPool.threadCount=20 org.quartz.threadPool.threadNamePrefix=QuartzScheduler #============================================================================ # Configure JobStore #============================================================================ #org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate #org.quartz.jobStore.useProperties=true org.quartz.jobStore.misfireThreshold=1100 org.quartz.jobStore.tablePrefix=QRTZ\\_ org.quartz.jobStore.isClustered=true org.quartz.jobStore.clusterCheckinInterval=15000 org.quartz.jobStore.acquireTriggersWithinLock=true
📌 마무리
Quartz Cluster는 dataSource 속성과 Cluster 설정만 해주면 어렵지 않게 구성할 수 있다.
- Cluster 환경으로 DB를 사용, DB 접근시 lock을 걸고 정보를 업데이트한다.
참고자료
https://blog.advenoh.pe.kr/spring/Multi-WAS-환경을-위한-Cluster-환경의-Quartz-Job-Scheduler-구현/
https://github.com/quartz-scheduler/quartz/releases
https://kouzie.github.io/springboot/Spring-Boot-스프링-부트-Quartz/#db-tables
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/configuration/#configuration-reference
'🌱 spring > 🚛 spring batch' 카테고리의 다른 글
Quartz를 이용하여 softDelete한 내용을 실제로 delete 하기 (0) 2022.12.28 Quartz (1) (0) 2022.12.22 Spring Batch - ItemProcessor (0) 2022.12.16 Spring Batch - ItemWriter (0) 2022.12.16 SpringBatch - ItemReader (0) 2022.12.16