2016-06-09 34 views
2

我有一个activemq安装与主/从故障转移。 主和从同步使用租赁数据库更衣室 主机和从机在2台不同的机器上运行,数据库位于第三台机器上。activemq master不放弃网络故障

故障转移和客户端重新连接在主代理强制关闭时正常工作。由于其故障转移设置,从属设备正常接管并且客户端重新连接。

如果我只在主代理上模拟网络中断,问题就会出现。这是通过使用iptables下降规则来执行到主数据库上的数据包来完成的。

主人现在意识到,它无法再连接到数据库。从机启动,因为它的网络连接仍然存在。 从日志看来,客户端仍然尝试重新连接到没有响应的主服务器

为了我的理解,主服务器应该通知客户端,不再有任何连接。客户端应该故障转移并重新连接到从站。 但是这没有发生。

如果我通过重新启用到主数据库的网络连接重新建立数据库连接,客户端会重新连接到从站。主人然后放弃主人。

  • 我已经在lease-database-locker上设置了queryTimeout。
  • 我为传输连接器设置了updateClusterClients = true。
  • 我已经在数据库连接上设置了一个10秒的validationQueryTimeout。
  • 我已经设置了数据库连接

有没有办法强制主告知客户在这种特殊情况下故障转移一个testOnBorrow?

回答

0

听起来像你的客户端没有在其URI的奴隶地址,所以它不知道在哪里重新连接。主代理不通知客户端从属设备的位置,因为它不知道从设备或从设备可能位于网络上,即使这样做依赖于条件会不可靠这是否导致主要经纪人首先下降?

您需要为故障转移URI中的主服务器和从服务器提供连接信息给客户端。

+0

我很抱歉,但这不是解决办法。如果代理同时访问数据库,则故障转移正在工作。故障转移网址在所有客户端都是正确的。如果主服务器不再有数据库连接,则会出现问题,如果恢复连接,它立即生效。我想我可能有一个连接到ioExceptionHandling的问题。 –

+0

由于你的问题并没有提供足够的细节,所以完整的解决方案将很难 –

2

经过一番挖掘,我找到了诀窍。 由于缺少ioExceptionHandler配置,代理不通知客户端。

的文档可以在这里找到 http://activemq.apache.org/configurable-ioexception-handling.html

我需要指定 <bean id="ioExceptionHandler" class="org.apache.activemq.util.LeaseLockerIOExceptionHandler"> <property name="stopStartConnectors"><value>true</value></property> <property name="resumeCheckSleepPeriod"><value>5000</value></property> </bean>

,并告诉经纪人使用的处理器

<broker xmlns="http://activemq.apache.org/schema/core" .... 
     ioExceptionHandler="#ioExceptionHandler" > 

为了产生网络中断错误我还必须在租约查询上设置一个queryTimeout

<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds-db01-st" lockKeepAlivePeriod="3000"> 
     <locker> 
      <lease-database-locker lockAcquireSleepInterval="10000" queryTimeout="8" /> 
     </locker> 

如果由于网络中断而导致查询时间过长,这将生成一个sql异常。

我没有用一个iptables规则丢弃的包到数据库测试网络:
/sbin/iptables -A OUTPUT -p tcp --destination-port 13306 -j DROP