Планировщик Quartz с кластером percona db, выдающим ошибки взаимоблокировки

Привет. Мы пытаемся настроить кварцевый планировщик в кластерном режиме с многоузловым кластером percona (master-master galera). Tocmat запускается и работает, но часто видит нижеприведенное исключение в журнале.

Любые указатели?

Tomcat 7.0.54 Quartz - 2.1.7 Кластер Percona XtraDB 5.5

[ERROR] 11 6 02:26:00.059 午前 MyClusteredScheduler_QuartzSchedulerThread [org.quartz.core.ErrorLogger]
An error occurred while releasing trigger 'DEFAULT.SqlBackgroundServiceTrigger'

org.quartz.JobPersistenceException: Couldn't commit jdbc connection. Deadlock found when trying to get lock; try restarting transaction [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction]
        at org.quartz.impl.jdbcjobstore.JobStoreSupport.commitConnection(JobStoreSupport.java:3661)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3799)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3760)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport.releaseAcquiredTrigger(JobStoreSupport.java:2845)
        at org.quartz.core.QuartzSchedulerThread.releaseIfScheduleChangedSignificantly(QuartzSchedulerThread.java:465)
        at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:306)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)
        at com.mysql.jdbc.Util.getInstance(Util.java:372)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2531)
        at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1612)
        at com.mysql.jdbc.MultiHostMySQLConnection.commit(MultiHostMySQLConnection.java:111)
        at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.mysql.jdbc.LoadBalancingConnectionProxy.invokeMore(LoadBalancingConnectionProxy.java:458)
        at com.mysql.jdbc.MultiHostConnectionProxy.invoke(MultiHostConnectionProxy.java:394)
        at com.sun.proxy.$Proxy4.commit(Unknown Source)
        at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334)
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:211)
        at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.invoke(AttributeRestoringConnectionInvocationHandler.java:73)
        at com.sun.proxy.$Proxy30.commit(Unknown Source)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport.commitConnection(JobStoreSupport.java:3659)
        ... 5 more

Вот наша текущая конфигурация файлаquart.properties,

# Configure Main Scheduler Properties
org.quartz.scheduler.instanceName=MyClusteredScheduler
org.quartz.scheduler.instanceId=AUTO

# Configure ThreadPool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=60
org.quartz.threadPool.threadPriority=5

# Configure JobStore
org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000

# Configure Datasources
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.jndiURL=java:/comp/env/jdbc/quartzJOB

person Sandeep    schedule 10.06.2015    source источник


Ответы (2)


Стандартный обработчик блокировки кварца использует

SELECT ... FOR UPDATE

но это работает не так, как ожидалось, в кластере galera.

Используйте следующую конфигурацию кварца, чтобы использовать семафор строки обновления:

org.quartz.jobStore.lockHandler.class = org.quartz.impl.jdbcjobstore.UpdateLockRowSemaphore
person Herby    schedule 27.01.2017

Я ничего не знаю о Quartz, но когда PXC выдает ошибку взаимоблокировки, обычно это происходит из-за того, что вы начали транзакцию на узле 1 и узле 2, пытаясь изменить рядом или в одной и той же строке, узел 2 был зафиксирован первым, а затем узел 1. node1 вернул бы ошибку взаимоблокировки, указывающую на сбой локальной сертификации.

Загрузите этот набор инструментов и запустите его на каждом узле перед запуском кварца. Если вы видите числа в столбцах «bfa» или «lcf», то вы знаете, что это происходит.

https://github.com/jayjanssen/myq_gadgets

./myq_status wsrep

Запись в одну и ту же строку на нескольких узлах PXC невозможна, и обычно не рекомендуется выполнять одновременную запись в одну и ту же таблицу на нескольких узлах.

person utdrmac    schedule 21.08.2015