2012-07-20 50 views
0

我知道,如果我使用一列服務器地址(使用this function)與ReadPreference.SECONDARY創建一個到Java的MongoDB連接到副本集,客戶端將在副本集之間平衡讀取,優先選擇節點具有較短的往返時間(例如相同的colo)。Java MongoDB客戶端和MongoS Sharding

但是,當我爲ReadPreference.SECONDARY的Mongo服務器創建一個MongoDB客戶端時,即使訪問是交叉colo並且MongoS存在於同一個colo中,所有讀取/寫入也會轉到列表中的第一個服務器。例如,如果我有三個MongoS服務器 - SF1,SF2和NYC1(按該順序) - 我的客戶端只與SF1交談,不管他們是在SF還是NYC。

有什麼我不得不配置或不同的方式來設置與MongoS服務器交談時的客戶端?我錯過了什麼?

+0

是不是'ReadPreference.nearest()'選項擊中最近的節點? – 2013-05-09 13:16:33

回答

2

這是驅動程序中的無意行爲。驅動程序代碼未檢測到您傳遞了mongos服務器列表,並將它們視爲副本集。 ReadPreference.SECONDARY會在沒有檢測到輔助節點的情況下將查詢發送給主節點,這就是發生了什麼事情:它檢測到的第一個「主節點」是列表中的第一個mongos服務器。沒有一個mongos服務器識別爲次要的,所以它們被忽略。

因此,目前跨多個mongos服務器負載平衡的唯一方法是爲每個服務器創建一個Mongo實例,並處理查詢分配給應用程序代碼中的每一個。

還要注意的是,Java驅動程序的下一個版本將包含一個修補程序https://jira.mongodb.org/browse/JAVA-381,這增加了支持mongos故障(雖然沒有加載尚未平衡)