MongoDB分區叢集執行個體提供各個mongos節點的串連地址,通過串連mongos節點,您可以串連至分區叢集執行個體的資料庫。需要注意的是,您需要使用正確的方法串連分區叢集執行個體來實現負載平衡及高可用。
背景資訊
MongoDB分區叢集(Sharded Cluster)通過將資料分散儲存到多個分區(Shard)中,以實現高可擴充性。實現分區叢集時,MongoDB引入 Config Server來儲存叢集的中繼資料,引入mongos作為應用訪問的入口,mongos從Config Server讀取路由資訊,並將請求路由到後端對應的Shard上。
使用者訪問mongos跟訪問單個mongod類似。
所有mongos是對等關係,使用者訪問分區叢集可通過任意一個或多個mongos 。
mongos本身是無狀態的,可任意擴充,叢集的服務能力為“Shard服務能力之和”與“mongos服務能力之和”的最小值。
訪問分區叢集時,最好將應用負載均勻地分散到多個mongos上。
Connection String URI串連說明
要正確串連分區叢集執行個體,您需要先瞭解下MongoDB的Connection String URI,所有官方的driver都支援以Connection String URI的方式來串連MongoDB資料庫。
Connection String URI樣本:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
參數說明:
mongodb://
:首碼,代表這是一個Connection String URI。username:password@
:登入資料庫的使用者和密碼資訊。hostX:portX
:多個mongos的地址清單。/database
:鑒權時,使用者帳號所屬的資料庫。?options
:指定額外的串連選項。
如何正確地串連分區叢集執行個體
ApsaraDB for MongoDB提供了Connection String URI串連方式。使用Connection String URI串連方式進行串連,可實現負載平衡及高可用。
擷取分區叢集執行個體的Connection String URI串連資訊,詳情請參見分區叢集執行個體串連說明。
應用程式中設定使用Connection String URI來串連執行個體,詳情請參見通過程式碼串連分區叢集執行個體。
通過Java來串連的範例程式碼如下,資料庫帳號為test,所屬資料庫為admin:
String user = "test"; String password = "MongoDB****"; String myURI = "mongodb://" + user + ":" + password + "@s-bp1c04c07823****.mongodb.rds.aliyuncs.com:3717,s-bp1500549e0b****.mongodb.rds.aliyuncs.com:3717/admin"; MongoClient mongoClient = new MongoClient(new MongoClientURI(myURI));
通過上述方式串連分區叢集時,用戶端會自動將請求分散到多個mongos上,以實現負載平衡。同時,當URI裡mongos數量在2個及以上時,當有mongos故障時,用戶端能自動進行切換,將請求都分散到狀態正常的mongos上。
當mongos數量很多時,您可以按應用將mongos進行分組。例如有2個應用 A、B,執行個體有4個mongos,可以讓應用A訪問mongos 1-2(URI裡只指定mongos 1-2的地址), 應用B來訪問mongos 3-4(URI 裡只指定mongos 3-4的地址)。根據這種方法來實現應用間的訪問隔離。
應用訪問的mongos彼此隔離,但後端Shard仍然是共用的。
常用串連參數
如何?讀寫分離
在Connection String URI的options裡添加
readPreference=secondaryPreferred
,設定讀請求為從節點優先。樣本:
資料庫帳號為test,所屬資料庫為admin。
mongodb://test:****@s-bp10fb1cf399****.mongodb.rds.aliyuncs.com:3717,s-bp10f49cdf5e****.mongodb.rds.aliyuncs.com:3717/admin?readPreference=secondaryPreferred
如何限制串連數
在Connection String URI的options裡添加
maxPoolSize=xx
,即可將單個用戶端串連池中的串連數限制在xx以內。將單個用戶端串連池中的串連數限制在100以內,資料庫帳號為test,所屬資料庫為admin,樣本:
mongodb://test:****@s-bp10fb1cf399****.mongodb.rds.aliyuncs.com:3717,s-bp10f49cdf5e****.mongodb.rds.aliyuncs.com:3717/admin?readPreference=secondaryPreferred&maxpoolsize=100
如何保證資料寫入到大多數節點後才返回
在Connection String URI的options裡添加
w=majority
,即可保證寫請求成功寫入大多數節點才向用戶端確認。樣本:
資料庫帳號為test,所屬資料庫為admin。
mongodb://test:****@s-bp10fb1cf399****.mongodb.rds.aliyuncs.com:3717,s-bp10f49cdf5e****.mongodb.rds.aliyuncs.com:3717/admin?readPreference=secondaryPreferred&maxpoolsize=100&w=majority