0

我正在为一个地理分布式应用程序设计架构,该应用程序将分布在不同的国家和城市。有相关的收藏,例如 -

店铺(遍布国家和城市) 店铺15天交易(其余去历史店铺)等。

是否可以确保商店和商店的交易在同一个分片中?目前在交易集合中,假设我只存储商店的唯一 _id 作为参考。

假设我使用 {region, country, city, shop_id} 之类的键对 Shop 集合进行分片。我是否必须为交易表存储相同的列/属性 - 即 region, country, city, shop_id 而不仅仅是 shop_id 然后选择一个分片键 - {region, country, city, shop_id, tx_id} 以确保它与 Shop 收藏放在同一个分片中?

换句话说,如果“子”集合的记录在逻辑上与“父”集合的记录相关,那么我们应用于“父”集合的整个分片键是否必须是“子”分片键的一部分' 以确保它们位于同一个分片上?

谢谢和问候, Archanaa 熊猫

4

2 回答 2

0

这是我将如何做到的。虽然每个国家/地区都有一个或多个分片的有效用例,但通常您希望根据地区进行地理分布。通常的——EMEA、APAC 和 NCSA——应该足够了,我将在我的例子中使用它。附带说明:您可能希望将 EMEA 拆分为 EME(欧洲数据中心)和 A(我在南非的数据中心有很好的经验),因为往返非洲的连接有时……不是最佳的。

至于分片,我假设三个分片分别命名为shard0(EMEA) 、shard1(APAC) 和shard3(NCSA)。

正如您所发现的,将每个区域的数据放在单个分片上并不是很重要(这不是非常可扩展的),而是在具有相同标签的分片上。我强烈建议将所有具有相同标签的分片及其前端托管在同一个数据中心:内部流量往往是免费的,内部带宽通常要高得多(或者至少可以升级到更高)外部带宽。

  1. 定义您的区域和应该保存这些区域数据的分片。
  2. 设置您的配置服务器。出于元数据可用性的原因,我会为每个区域设置一个配置服务器。因此,即使数据中心出现故障,您也可以使用其他两个数据中心的数据启动额外的配置服务器。
  3. 设置你的分片。由于速度对您来说似乎是个问题:使用 SSD。它们的速度如此之快,以至于它们可以轻松地为您节省多个分片,因为旋转磁盘通常会成为限制因素。

  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,有一种解决方法:使用散列分片键

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

    这样,所有文档都将分发到负责各自区域的分片,同时仍然允许在它们之间分配块。

hth。

于 2015-04-09T11:53:58.360 回答
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”之类的标签分配给其中的特定分片地区。
于 2015-04-09T10:43:58.263 回答