activemq master不放弃网络故障
我有一个activemq安装与主/从故障转移。 主和从同步使用租赁数据库更衣室 主机和从机在2台不同的机器上运行,数据库位于第三台机器上。activemq master不放弃网络故障
故障转移和客户端重新连接在主代理强制关闭时正常工作。由于其故障转移设置,从属设备正常接管并且客户端重新连接。
如果我只在主代理上模拟网络中断,问题就会出现。这是通过使用iptables下降规则来执行到主数据库上的数据包来完成的。
主人现在意识到,它无法再连接到数据库。从机启动,因为它的网络连接仍然存在。 从日志看来,客户端仍然尝试重新连接到没有响应的主服务器
为了我的理解,主服务器应该通知客户端,不再有任何连接。客户端应该故障转移并重新连接到从站。 但是这没有发生。
如果我通过重新启用到主数据库的网络连接重新建立数据库连接,客户端会重新连接到从站。主人然后放弃主人。
- 我已经在lease-database-locker上设置了queryTimeout。
- 我为传输连接器设置了updateClusterClients = true。
- 我已经在数据库连接上设置了一个10秒的validationQueryTimeout。
- 我已经设置了数据库连接
有没有办法强制主告知客户在这种特殊情况下故障转移一个testOnBorrow?
听起来像你的客户端没有在其URI的奴隶地址,所以它不知道在哪里重新连接。主代理不通知客户端从属设备的位置,因为它不知道从设备或从设备可能位于网络上,即使这样做依赖于条件会不可靠这是否导致主要经纪人首先下降?
您需要为故障转移URI中的主服务器和从服务器提供连接信息给客户端。
经过一番挖掘,我找到了诀窍。 由于缺少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
我很抱歉,但这不是解决办法。如果代理同时访问数据库,则故障转移正在工作。故障转移网址在所有客户端都是正确的。如果主服务器不再有数据库连接,则会出现问题,如果恢复连接,它立即生效。我想我可能有一个连接到ioExceptionHandling的问题。 –
由于你的问题并没有提供足够的细节,所以完整的解决方案将很难 –