2015-04-06 56 views
0

我正在爲遍佈不同國家和城市的地理分佈式應用程序設計模式。有相關的集合,如 -MongoDB爲相同數據庫中的相關集合分片

商店(傳播不同國家和城市) 15天交易的商店(劃入歷史店) 等

是否可以保證商店和交易的商店是共處一個碎片? 目前在交易集合中,假設我僅存儲商店的唯一_id作爲參考。

假設我使用諸如{region,country,city,shop_id}之類的關鍵字對Shop集合進行分段。 我是否必須爲交易表存儲相同的列/屬性 - 即區域,國家,城市,shop_id而不是shop_id,然後選擇像{{region,country,city,shop_id,tx_id}}這樣的分片鍵來確保它與Shop集合放在同一個分片中?換句話說,如果'child'集合具有與'parent'集合的記錄邏輯相關的記錄,那麼我們應用於'parent'集合的整個分片關鍵字必須是分片關鍵字的一部分的'孩子',以確保他們共處一個碎片?

感謝和問候, Archanaa熊貓

+0

我在運行,atm,並會很高興地回答你的問題。同時,您可能希望谷歌「基於mongodb標記的分片」 – 2015-04-07 09:06:49

回答

0

這是我該怎麼做的。雖然每個國家都有一個或多個碎片有效的使用案例,但通常您希望根據地區進行地理分佈。通常的 - EMEA,APAC和NCSA - 應該足夠了,我將在我的例子中使用它。作爲一個方面說明:您可能希望將EMEA分爲EME(歐洲數據中心)和A(我與Sout非洲的數據中心有良好的經驗),因爲從非洲到非洲的連接有時並非最佳。至於碎片,我會假設名爲shard0(EMEA),shard1(APAC)和shard3(NCSA)的三個碎片。

正如您發現的那樣,將單個分片上的每個區域的數據(這不會非常具有可伸縮性)並不重要,但是對於具有相同標籤的分片而言並不重要。我強烈建議使用相同標籤的所有碎片,並將其前端託管在同一個數據中心中:內部流量通常是免費的,內部帶寬通常要高得多(或至少可以升級到更高)外部帶寬。

  1. 定義您的區域和應該保存這些區域的數據的碎片。
  2. 設置您的配置服務器。對於元數據可用性原因,我會爲每個區域設置一個配置服務器。因此,即使數據中心出現故障,您也可以使用其他兩臺設備的數據啓動另一臺配置服務器。
  3. 設置你的碎片。由於速度似乎是你的問題:使用固態硬盤。它們速度非常快,以至於它們很容易爲您節省多個碎片,因爲旋轉磁盤通常成爲限制因素。

  4. 標籤的碎片:

    sh.addShardTag("shard0", "EMEA") 
    sh.addShardTag("shard1", "APAC") 
    sh.addShardTag("shard2", "NCSA") 
    
  5. 添加標籤範圍。如果你有每個商店的區域,則不需要按國家進行。只需通過區域標誌:

    sh.addTagRange("commerce.shops",{"region":"EMEA"},{"region":"EMEA"},"EMEA") 
    sh.addTagRange("commerce.shops",{"region":"APAC"},{"region":"APAC"},"APAC") 
    sh.addTagRange("commerce.shops",{"region":"NCSA"}, {"region":"NCSA"},"NCSA") 
    

    我爲什麼會不分配國家代碼的原因是,你必須每個國家代碼的分配標籤。既然你已經有了這個地區,爲什麼不用它來讓你的生活更輕鬆?

  6. 作爲分片鍵,我會使用區域的複合鍵和任何認爲合適的東西。請注意,不應該使用ObjectId作爲分片鍵的其他組件,因爲它是單調增加的,如果每個區域有多個分片,會導致問題。假設你的ShopId是分片鍵的另一部分,它是一個ObjectId,有一個解決方法:使用a hashed shard key

    sh.shardCollection("commerce.shops",{"region":1,"shopId":"hashed"}) 
    

    這樣,所有文檔將被分發到負責各個區域的碎片,同時仍允許塊分佈在它們中間。

hth。

+0

非常感謝您的詳細解答。你給了我很多見解。 – 2015-04-13 17:14:56

0

這是我從另一個論壇上發現https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/mongodb-user/1cwyfqt6UTo

快速彙總 -

  • 更重要的是,相關的集合在同一區域,而不是在同一臺服務器上。
  • 爲了實現這一目標,你必須選擇碎片鍵與至少部分相同的屬性(如國家)
  • 要對國家的標籤感知分片指定碎片範圍,我們可以設置範圍,像這樣兩個集合 - sh.addTagRange (「commerce.shops」,{「country」:「IN」},{「country」:「IN」},「APAC」) sh.addTagRange(「commerce.shops」,{「country」:「SG」 },{「country」:「SG」},「APAC」),併爲該區域中的特定分片分配標籤,如「APAC」。
相關問題