Статьи

Настройка кластеризации в кварцевых и обсидиановых планировщиках

Планирование заданий используется во многих программных проектах для обеспечения как внутренних заданий, так и сторонней интеграции. Кластеризация может значительно повысить надежность благодаря отказоустойчивости и распределению нагрузки. Я считаю, что кластеризация должна быть реализована для обеспечения надежности практически всех программных проектов, поэтому я решил рассказать, как это сделать в двух популярных планировщиках заданий Java с поддержкой кластеров. В этом посте будет рассказано, как настроить кластеризацию для кварца и обсидиана . Он объяснит, какая работа требуется для настройки каждого, и поможет вам увидеть некоторые распространенные ошибки. В этом руководстве предполагается, что у вас уже есть оба планировщика в базовой конфигурации.

И у Кварца, и у Обсидиана есть свои сильные стороны, и этот пост не будет обсуждать, что лучше, но он предоставит информацию, необходимую для кластеризации любого из них.

кварцевый

Кварц — это наиболее популярный вариант планирования заданий с открытым исходным кодом, который позволяет кластеризовать экземпляры планировщика через JDBCJobStore . Хотя кластеризацию с помощью Terracotta также можно выполнять без постоянного хранилища заданий, я рекомендую не использовать его для большинства проектов, поскольку история выполнения заданий очень полезна для текущих операций и устранения неполадок, а кластеризация базы данных работает адекватно во всех случаях, кроме крайних случаев.

Обсидиан

Obsidian — это коммерческий планировщик заданий, который предоставляет бесплатные отдельные экземпляры и одну лицензию на кластеризацию бесплатно в течение года. Он обеспечивает такой же тип кластеризации, как и Quartz, а также предоставляет полный пользовательский интерфейс, REST API, восстановление после простоя, любые другие расширенные параметры конфигурации.

Конфигурирующий обсидиан для кластеризации

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

Так что вот в чем дело: для кластеризации Obsidian просто запустите дополнительные экземпляры. Obsidian не имеет некластеризованного режима, и все экземпляры автоматически обрабатывают настройку алгоритма распределения нагрузки, когда новые члены присоединяются к кластеру (или выпадают). Ваши системные часы должны быть примерно синхронизированы, но если они отличаются на несколько секунд, это не проблема, поскольку Обсидиан изящно справляется с этим. Тем не менее, вы можете синхронизировать время вашего сервера при желании.

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

Нет необходимости развертывать различные файлы свойств или что-то подобное. Например, если вы используете сервис Amazon EC2, вы можете использовать один и тот же образ для нескольких узлов в кластере, и все будет работать правильно. Каждый элемент кластера автоматически назначает себе уникальное имя экземпляра на основе своего локального имени хоста и уникальный суффикс, если это необходимо.

Однако мы рекомендуем назначить каждому члену кластера явное имя, которое поможет устранить неполадки, если на конкретном хосте есть проблемы. Для этого просто установите системное свойство Java schedulerDesignationна имя хоста по вашему выбору. Например, если запускать экземпляр с помощью автономного планировщика с использованием java напрямую, просто добавьте значение -DschedulerDesignation=myHostNameв конец команды.

Это оно! Кластеризация Obsidian буквально так же проста, как копирование установки и запуск ее на другом сервере или виртуальной машине. В качестве бонуса, в отличие от других планировщиков, в Obsidian вы можете настроить запуск задания только на определенном хосте, даже с включенной кластеризацией.

Таким образом, следующие шаги:

  1. Возьмите копию вашей установки Obsidian (WAR, автономный пакет или встроенный пакет приложений).
  2. Начни это! На этом этапе вы можете предоставить то, что schedulerDesignationвы хотите использовать.

Конфигурирующий кварц для кластеризации

Что касается Кварца, мы рассмотрим только настройку кластеризации баз данных, поскольку считаем, что это правильный выбор для большинства проектов.

Прежде чем начать, обратите внимание: если у вас запущена некластерная версия Quartz, вы должны выключить ее перед запуском любых включенных в кластер экземпляров.

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

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

Кварц настраивается через quartz.propertiesфайл. Вот пример файла, который описывает минимальные минимальные свойства, которые вам нужно будет настроить для кластеризации. Если вы хотите увидеть полную информацию о какой-либо части конфигурации, см. Ссылку на конфигурацию Quartz . Обратите внимание, что файл свойств должен быть одинаковым на всех хостах, за исключением одного, org.quartz.scheduler.instanceIdкоторый используется для идентификации разных хостов.

# Basic Quartz configuration to provide an adequate pool of threads for execution

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25

# Datasource for JDBCJobStore
org.quartz.dataSource.myDS.driver =com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/scheduler
org.quartz.dataSource.myDS.user = myUser
org.quartz.dataSource.myDS.password = myPassword

# JDBCJobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = myDS

# Turn on clustering
org.quartz.jobStore.isClustered = true

org.quartz.scheduler.instanceName = ClusteredScheduler
# If instanceIf is set to AUTO, if will auto-generate an id automatically.
# I recommend giving explicit names to each clustered host for easy identification.
org.quartz.scheduler.instanceId = Host1

Примечание о настройках JDBC: по какой-либо причине вам необходимо настроить как класс драйвера JDBC, так и класс «делегата драйвера» в хранилище заданий. Для них должно быть установлено соответствующее значение для вашей платформы базы данных.

Как я уже говорил, это минимальные свойства, которые вы должны будете настроить, чтобы запустить кластеризацию. Одна большая проблема с этой конфигурацией состоит в том, instanceIdчто идентифицирующие хосты находятся в том же файле свойств, что и все другие свойства, которые должны оставаться неизменными. Синхронизация разных версий может быть проблематичной и не требуется для Obsidian. Вы можете использовать настройку «AUTO», чтобы избежать необходимости устанавливать явные идентификаторы экземпляров, но, как и в случае с Obsidian, мы рекомендуем указывать явные имена, поскольку это может помочь вам быстрее определить, где возникают проблемы, если заранее знать, какой хост какой.

Итак, основные шаги для включения кластеризации:

  1. Подготовьте свойства для каждого члена кластера. Убедитесь, что org.quartz.scheduler.instanceIdв файле свойств указаны только различия.
  2. Выключите все запущенные экземпляры, закрыв приложение, которое его запускает, или отключив только процесс Quartz (см. Здесь ).
  3. Запустите ваше приложение или запустите процесс Quartz (см. Здесь ).
  4. Убедитесь, что вы никогда не запустите некластеризованный экземпляр снова!

Вывод

Я надеюсь, что это поможет вам быстро начать работу с новым или существующим проектом. Кластеризация — это отличная функция в любом планировщике, и я чувствую, что она обеспечивает большую ценность, которую могут упускать команды разработчиков программного обеспечения и операций.