web-dev-qa-db-ja.com

JBossがデータソースを使用してMySQLスレーブをフェイルオーバーしない

マスター/スレーブ構成を使用して、高可用性MySQLクラスターをセットアップしようとしています。最初のノードがダウンした場合、スレーブをマスター(たとえば、読み取り専用ではなく書き込み可能)にしたい(この質問のように https://stackoverflow.com/questions/9409111/database-fail-over- in-jboss-data-sources

したがって、私はConnector/Jドライバーでデータソースを使用しています:

<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>

私はこれについて多くの記事をここで読みましたが、これで十分かどうかはまだわかりません(確かに、それが十分ではないと確信しています;))。

私の構成をテストするために、最初のインスタンスを停止するだけです:

service mysql stop

Ibatisを使用している私のアプリケーション(Alfresco、Activitiに依存)が障害を検出するとすぐに、接続が失われた/拒否されたというメッセージが大量に表示されます。つまり、フェイルオーバーは機能しません。

    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 ** 

等々 ...

私のアプリケーションサーバーユーザー([email protected])がデータベースに付与されていなかったため、以前は問題がありました。しかし、それは今のところ解決されています。

ここに私のMySQL設定ファイル(私が何かを忘れた場合):

マスター(10.1.2.13)[mysqld]ユーザー= s-mysqlポート= 3306 basedir =/app/mysql/current 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

スレーブ(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

スレーブ特権

SHOW GRANTS for 'alfresco'@'10.1.2.11';
+-----------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                               |
+-----------------------------------------------------------------------------------------------------------------+
| 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                                    |
+-----------------------------------------------------------------------------------------------------------------+

この問題を解決するために誰かが私にヒントを与えることができますか?

3
Jean-Rémy Revy

確かに、私は1つのパラメータを「忘れた」ようです

<autoReconnect>true</autoReconnect>

ドキュメントごとに言うように、私は用心深く忘れて言った: https://community.jboss.org/wiki/SetUpAMysqlDatasource

自動再接続

警告:管理されたトランザクションを使用している場合は、自動再接続を有効にしないでください

自動再接続では、データベースのトランザクション状態は保持されません。

Auto-commit = trueを常に使用している場合は問題ありません。

アクティベートできるかどうか確信が持てなかったのですが…。

[〜#〜] edit [〜#〜]SPLITスレッド、最初の質問は(自動)回答。入手したら、Alfresco、自動コミット、マネージドトランザクションに関する情報を追加します。

読み書きモードの問題: https://stackoverflow.com/questions/10945261/jboss-alfresco-cannot-write-on-slave-after-failover

2
Jean-Rémy Revy