JBOSS scheitert nicht über MySQL Slave mit DataSource
-
22-10-2019 - |
Frage
Ich versuche, einen hohen verfügbaren MySQL -Cluster mit einer Master- / Slave -Konfiguration einzurichten. Ich möchte, dass der Sklave Meister wird (zB nicht schreibgeschützt, aber schriftlich), wenn der erste Knoten herunterkommt (wie in dieser Frage: https://stackoverflow.com/questions/9409111/database-fail-over-jboss-data-sources)
Ich verwende also eine Datenquelle mit Connector/J -Treibern:
<datasources>
<local-tx-datasource>
<jndi-name>alfresco-datasource</jndi-name>
<connection-url>jdbc:mysql://10.1.2.13,10.1.2.14:3306/alfresco</connection-url>
<driver-class>org.gjt.mm.mysql.Driver</driver-class>
<user-name>alfresco</user-name>
<password>alfresco</password>
<exception-sorter-class-name>
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</exception-sorter-class-name>
<connection-property name="readOnly">false</connection-property>
<failOverReadOnly>false</failOverReadOnly>
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
Ich habe viele, viele Beiträge hier gelesen, die sich darüber befassen, aber ich bin mir noch nicht sicher, ob dies ausreicht (in der Tat bin ich sicher, dass es nicht so ist;)).
Um meine Konfiguration zu testen, stoppe ich einfach die erste Instanz:
service mysql stop
Sobald meine Bewerbung (Alfresco, die sich auf Activiti stützt), die Ibatis verwendet, erkennen, dass es einen Fehler gibt, überflutet mich die Nachricht, dass die Verbindung verloren geht / abgelehnt ist.
GRAVE: Error while closing command context
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
### The error may exist in org/activiti/db/mapping/entity/Job.xml
### The error may involve org.activiti.engine.impl.persistence.entity.JobEntity.selectNextJobsToExecute_mysql
### The error occurred while executing a query
### SQL: select * from ACT_RU_JOB where (RETRIES_ > 0) and (DUEDATE_ is null or DUEDATE_ <= ?) and (LOCK_OWNER_ is null or LOCK_EXP_TIME_ <= ?)
### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:77)
at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:191)
at org.activiti.engine.impl.persistence.entity.JobManager.findNextJobsToExecute(JobManager.java:97)
at org.activiti.engine.impl.cmd.AcquireJobsCmd.execute(AcquireJobsCmd.java:49)
at org.activiti.engine.impl.cmd.AcquireJobsCmd.execute(AcquireJobsCmd.java:32)
at org.activiti.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:42)
at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:42)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:40)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33)
at org.activiti.engine.impl.jobexecutor.JobAcquisitionThread.run(JobAcquisitionThread.java:63)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
[...]
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2552)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3002)
... 45 more
09:54:00,270 WARN [LocalManagedConnectionFactory] Destroying connection that is not valid, due to the following exception: com.mysql.jdbc.JDBC4LoadBalancedMySQLConnection@33dd0edd
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 31 875 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
[...]
09:54:00,355 WARN [JBossManagedConnectionPool] Destroying connection that could not be successfully matched: org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener@34775a91[state=DESTROYED mc=org.jboss.resource.adapter.jdbc.local.LocalManagedConnection@244f22a3 handles=0 lastUse=1339055604851 permit=false trackByTx=false mcp=org.jboss.resource.connectionmanager.JBossManagedConnectionPool$OnePool@3d01c1a context=org.jboss.resource.connectionmanager.InternalManagedConnectionPool@53e4f0ea xaResource=org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@476b0df4 txSync=null]
09:54:01,702 ERROR [STDERR] Thu Jun 07 09:54:01 CEST 2012 WARN: Connection to primary host failed
EXCEPTION STACK TRACE:
** BEGIN NESTED EXCEPTION **
Usw ...
Ich hatte zuvor ein Problem, da mein App -Server -Benutzer (alfresco@10.1.2.11) in der Datenbank nicht gewährt wurde. Aber es ist vorerst entschlossen.
Hier meine MySQL -Konfigurationsdateien (falls ich etwas vergessen habe):
Master (10.1.2.13) [mysqld] user = s-mysql port = 3306-basiertiR =/app/mysql/aktuell datadir =/app/data/mysql log-eRror =/app/log/mysql/master log =/app/ log/mysql/query.log
#clustering
server_id =1
log-bin =/app/log/mysql/log-bin/log-bin.master
innodb_flush_log_at_trx_commit=1
sync_binlog =1
skip-slave-start
expire_logs_days=10
binlog-do-db =alfresco
Sklave (10.1.2.14)
[mysqld]
user = s-mysql
port = 3306
basedir =/app/mysql/current
datadir =/app/data/mysql
log-error =/app/log/mysql/slave
log =/app/log/mysql/query.log
# Clustering
server_id =2
log-bin =/app/log/mysql/log-bin/log-bin.slave
expire_logs_days=10
skip-slave-start
relay-log-index =/app/log/mysql/log-relay/relay-log.slave.index
relay-log =/app/log/mysql/log-relay/relay-log.slave
binlog-do-db =alfresco
replicate-do-db =alfresco
Sklaven Privilegien
SHOW GRANTS for 'alfresco'@'10.1.2.11';
+-----------------------------------------------------------------------------------------------------------------+
| Grants for alfresco@10.1.2.11 |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'alfresco'@'10.1.2.11' IDENTIFIED BY PASSWORD '*F9F457310EF9364D42AABE6D8C24A21712C000B5' |
| GRANT ALL PRIVILEGES ON `alfresco`.* TO 'alfresco'@'10.1.2.11' WITH GRANT OPTION |
+-----------------------------------------------------------------------------------------------------------------+
Könnte mir jemand Hinweise geben, um dieses Problem zu lösen?
Lösung
In der Tat scheint es, dass ich einen Parameter "vergessen" habe
<autoReconnect>true</autoReconnect>
Ich sagte mit Vorsichtsmaßnahme vergessen, denn wie der pro Doc sagt: https://community.jboss.org/wiki/setupamysqldatasource
Automatische Verbindung wieder herstellen
WARNUNG: Aktivieren Sie die automatische Verbindung nicht, wenn Sie verwaltete Transaktionen verwenden
Die automatische Wiederverbindung bewahrt den Transaktionszustand in der Datenbank nicht.
Es ist in Ordnung, wenn Sie immer Auto-commit = true verwenden.
Ich war mir nicht sicher, ob ich es aktivieren konnte ... und ich frage immer noch.
BEARBEITENSplit Thread, weil meine erste Frage (automatisch) beantwortet wird. Ich werde einige Informationen über Alfresco, Auto Commit und verwaltete Transaktion hinzufügen, wenn ich einige bekomme.
Problem mit dem Schreiben von Schreiben: https://stackoverflow.com/questions/10945261/jboss-alfresco-cannot-write-on-lave-after-failover