我有一个activemq安装与主/从故障转移 . 使用租用数据库锁定器Master和Slave在2台不同的机器上运行并且数据库位于第三台机器上同步主机和从机 .
故障转移和客户端重新连接在强制关闭主代理时正常工作 . 从站正在接管并且客户端由于其故障转移设置而重新连接 .
如果我仅在主代理上模拟网络中断,则问题就开始了 . 这是通过对主数据库上的数据包使用iptables删除规则来完成的 .
主人现在意识到,它不能再连接到数据库了 . 从站启动,因为它的网络连接仍然存在 . 从日志中可以看出,客户端仍然尝试重新连接到无响应的主服务器
根据我的理解,主人应告知客户,不再有任何联系 . 客户端应该故障转移并重新连接到从属设备 . 但这不会发生 .
如果通过重新启用与主服务器的数据库的网络连接来重新 Build 数据库连接,则客户端会重新连接到从服务器 . 然后主人放弃了主人 .
-
我在lease-database-locker上设置了queryTimeout .
-
我为传输连接器设置了updateClusterClients = true .
-
我在db连接上设置了一个10秒的validationQueryTimeout .
-
我为db连接设置了testOnBorrow
在这种特殊情况下,有没有办法强制主服务器通知客户端故障转移?
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>
并告诉代理使用Handler
为了在网络中断时产生错误,我还必须在租约查询上设置 queryTimeout :
如果由于网络中断导致查询需要很长时间,则会产生sql异常 .
我通过使用iptables规则将包丢弃到数据库来测试网络:
/sbin/iptables -A OUTPUT -p tcp --destination-port 13306 -j DROP
听起来你的客户端在其URI中没有奴隶的地址,因此它不知道重新连接的位置 . 主代理不会通知客户端从站的位置,因为它不知道有一个从站或者该从站可能在网络上的哪个位置,即使这样做也不可靠,具体取决于条件这是导致主经纪人首先下降的原因 .
您需要在故障转移URI中为客户端提供主服务器和从服务器的连接信息 .