Grails Quartz Clustering — Планировщик по-прежнему работает независимо

Моя проблема в том, что когда я запускаю два экземпляра tomcat в кластерном режиме с планировщиком, который вызывается каждые 10 секунд

println "called: " + new Date()

тогда каждый экземпляр tomcat будет вызывать эту печать независимо. Если я установлю конфигурацию Quartz для обработки кластеризации, это не должно быть так.

Например, если кот А запустился в 8:00:00, а кот Б запустился в 8:00:05, то планировщик должен быть вызван в коте А в 8:00:10, а кот Б не звонить в 8:00:15. Но в моем случае планировщик сработал в коте А в 8:00:10 и в коте Б в 8:00:15, затем в коте А в 8:00:20 и в коте Б в 8:00:25 и так далее. . Похоже, мой планировщик работает независимо и не синхронно.

Это правильное поведение или я что-то упускаю?

Вот моя конфигурация

кварц.свойства

# http://stackoverflow.com/questions/7479438/grails-clustering-quartz-jobs-sample-code-and-config-desired
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = HartakuClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = quartzDataSource
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 5000
org.quartz.jobStore.useProperties = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25

# Detect the jvm shutdown and call shutdown on the scheduler
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

org.quartz.dataSource.quartzDataSource.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.quartzDataSource.URL = jdbc:mysql://localhost/latihanclust?useUnicode=yes&characterEncoding=UTF-8
org.quartz.dataSource.quartzDataSource.user = root
org.quartz.dataSource.quartzDataSource.password =
org.quartz.dataSource.quartzDataSource.maxConnections = 8

QuartzConfig.groovy

quartz {
    autoStartup = true
    jdbcStore = true
    waitForJobsToCompleteOnShutdown = true
    exposeSchedulerInRepository = false

    props {
        scheduler.skipUpdateCheck = true
    }
}

environments {
    test {
        quartz {
            autoStartup = false
        }
    }
}

TestingJob.groovy

class TestingJob {
    static triggers = {
        simple startDelay:10000, repeatInterval: 10000l // execute job once in 10 seconds
    }

    def execute() {            
        println "called: " + new Date()
    }
}

person tama    schedule 10.12.2014    source источник
comment
Включите также свой класс задания (вам не нужно включать содержимое execute()).   -  person Joshua Moore    schedule 10.12.2014
comment
Посмотрите документацию, обратите внимание на то, как вы настраиваете работу. Имя, одновременный доступ, группа и т. д. github.com/9ci/grails-quartz2 вы установите def concurrent = false и def durable = true на свою работу, это решит вашу проблему.   -  person Joshua Moore    schedule 10.12.2014
comment
Обратите внимание, что кластерный анализ (иначе: кластеризация) относится к технике интеллектуального анализа данных. Не для общей кластеризации серверов. Существуют более подходящие теги, такие как балансировка нагрузки, failover и т. д. Отмечайте теги более тщательно. Спасибо.   -  person Has QUIT--Anony-Mousse    schedule 10.12.2014


Ответы (1)


Почему вы выполняете кластеризацию с помощью планировщика Quartz? Чего вы хотите достичь?

На мой взгляд, кластеризация должна выполняться с 1 главным сервером и двумя или более экземплярами подчиненных серверов. Это легко настроить с помощью прокси-сервера Apache / Nginx. Главный сервер расположен спереди, а подчиненные экземпляры позади этого мастера. Главный сервер (например, Apache/Nginx) выполняет балансировку нагрузки или аварийное переключение между подчиненными экземплярами.

Итак, план такой: Пользователь получает доступ к веб-порту HTTP 80 --> Сервер Apache/Nginx ‹---> прокси перенаправляет несколько экземпляров Tomcat (10.1.14.20:8080, 10.1.14.21:8080, 10.1.14.22:8080, и т.д).

Сервер Apache/Nginx достаточно умен, чтобы обнаруживать экземпляры ведомых устройств. Если один подчиненный экземпляр не работает, передний веб-сервер (Apache/Nginx) продолжает использовать другие подчиненные экземпляры, которые все еще работают.

Ссылка: https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing

person Yoga Hanggara    schedule 10.12.2014