ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Quartz2
    🌱 spring/🚛 spring batch 2022. 12. 22. 18:07

    DB 기반의 스케줄러


    Quartz는 메모리 기반 스케줄러뿐 아니라 DB 기반의 스케줄러도 지원한다.

    • DB 기반의 스케줄러는 스케줄러 정보를 메모리가 아닌 DB에 저장하기 때문에 다중 서버간 스케줄링이 가능하다!

    Quartz는 master-slave 형태로 서로간의 통신을 하지않고 단순히 DB 업데이트 정보를 기반으로 각각의 스케줄 인스턴스가 자기가 실행해야하는 Job을 실행한다.

     

    Cluster 환경에서 스케줄링이 가능해 Non-Cluster 환경에 비해 여러가지 장점이 존재한다.

    1. 고가용성 (HA, High Availability)
      • 한 서버가 셧다운 되도 다른 서버에 의해 Job이 실행된다.
    2. 확장성 (Scalability)
      • Quartz 설정된 서버를 구동하면 자동으로 DB에 스케줄 인스턴스로 등록된다.
      • 셧다운된 서버는 다른 서버에 의해서 DB에서 삭제된다.
    3. 로드밸런싱 (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

    댓글

Designed by Tistory.