2016-06-09 33 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