首页 文章

activemq master不放弃网络故障

提问于
浏览
3

我有一个activemq安装与主/从故障转移 . 使用租用数据库锁定器Master和Slave在2台不同的机器上运行并且数据库位于第三台机器上同步主机和从机 .

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

如果我仅在主代理上模拟网络中断,则问题就开始了 . 这是通过对主数据库上的数据包使用iptables删除规则来完成的 .

主人现在意识到,它不能再连接到数据库了 . 从站启动,因为它的网络连接仍然存在 . 从日志中可以看出,客户端仍然尝试重新连接到无响应的主服务器

根据我的理解,主人应告知客户,不再有任何联系 . 客户端应该故障转移并重新连接到从属设备 . 但这不会发生 .

如果通过重新启用与主服务器的数据库的网络连接来重新 Build 数据库连接,则客户端会重新连接到从服务器 . 然后主人放弃了主人 .

  • 我在lease-database-locker上设置了queryTimeout .

  • 我为传输连接器设置了updateClusterClients = true .

  • 我在db连接上设置了一个10秒的validationQueryTimeout .

  • 我为db连接设置了testOnBorrow

在这种特殊情况下,有没有办法强制主服务器通知客户端故障转移?

2 回答

  • 0

    经过一番挖掘,我找到了诀窍 . 由于缺少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>

    并告诉代理使用Handler

    <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

  • 3

    听起来你的客户端在其URI中没有奴隶的地址,因此它不知道重新连接的位置 . 主代理不会通知客户端从站的位置,因为它不知道有一个从站或者该从站可能在网络上的哪个位置,即使这样做也不可靠,具体取决于条件这是导致主经纪人首先下降的原因 .

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

相关问题