activemq主机在网络故障时不放弃

activemq主机在网络故障时不放弃,activemq,failover,master-slave,Activemq,Failover,Master Slave,我安装了带有主/从故障切换的activemq。 主服务器和从服务器使用租约数据库锁进行同步 主服务器和从服务器在两台不同的机器上运行,数据库位于第三台机器上 故障转移和客户端重新连接在主代理强制关闭时正常工作。从属服务器正在正确接管,客户端由于其故障切换设置而重新连接 如果我只在主代理上模拟网络中断,问题就开始了。这是通过使用iptables丢弃规则来完成的,该规则用于将数据包放到主机上的数据库中 主机现在意识到,它无法再连接到数据库。从机启动,因为它的网络连接仍处于活动状态。 从日志中可以看出

我安装了带有主/从故障切换的activemq。 主服务器和从服务器使用租约数据库锁进行同步 主服务器和从服务器在两台不同的机器上运行,数据库位于第三台机器上

故障转移和客户端重新连接在主代理强制关闭时正常工作。从属服务器正在正确接管,客户端由于其故障切换设置而重新连接

如果我只在主代理上模拟网络中断,问题就开始了。这是通过使用iptables丢弃规则来完成的,该规则用于将数据包放到主机上的数据库中

主机现在意识到,它无法再连接到数据库。从机启动,因为它的网络连接仍处于活动状态。 从日志中可以看出,客户端仍然试图重新连接到无响应的主机

据我所知,船长应该通知客户,已经没有联系了。客户端应进行故障切换并重新连接到从属服务器。 但这并没有发生

如果我通过重新将网络连接恢复到主机的db来重新建立db连接,则客户端会重新连接到从机。大师放弃了对大师的强化

  • 我已在租约数据库储物柜上设置了queryTimeout
  • 我已为传输连接器设置updateClusterClients=true
  • 我在db连接上设置了10秒的validationQueryTimeout
  • 我已经为db连接设置了testOnBorrow

在这种情况下,有没有办法强制主机通知客户端进行故障切换?

听起来您的客户端的URI中没有从机的地址,因此不知道重新连接到哪里。主代理不会通知客户端从属服务器的位置,因为它不知道网络上有从属服务器或从属服务器可能在哪里,即使它这样做了,也不可靠,这取决于导致主代理服务器首先下降的条件


您需要在故障转移URI中向客户机提供主设备和从设备的连接信息。

经过一些挖掘,我发现了诀窍。 由于缺少ioExceptionHandler配置,代理未通知客户端

文档可以在这里找到

我需要具体说明

真的
5000

并告诉代理使用该处理程序

<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-目标端口13306-j DROP

很抱歉,这不是解决方案。如果代理都可以访问数据库,则故障切换正在工作。故障转移url在所有客户端中都是正确的。如果主机不再有db连接,问题就会出现,如果我恢复连接,它会立即工作。我想我可能在ioExceptionHandling方面有问题。因为你的问题没有提供足够的细节,所以很难找到完整的解决方案