MongoDB 区域分片限制 - 标记范围

n.p*_*nov 5 database sharding mongodb

Mongo DB通过将每个分片与区域相关联并根据分片键值应用区域块范围来支持分区分片(如此处所述)。sh.addShardTag(<shard name>, "ZONENAME")sh.addTagRange()

问题是:

  1. 有任何限制sh.addTagRange()吗?
  2. 大量这样的范围是否会影响性能?
  3. 例如可以有 60000 个标签范围,还是设计成几十个?

    在文档和社区论坛中找不到答案

提供有关用例的更多上下文:

例如,系统中有 10K 个帐户。有分片inventory集合。每个项目都与inventoryClass(80K 类型)相关联。每个帐户都会创建大量不同类型的库存商品 (SKU)。分片集群中有 3 个区域。分片键是:{accountId: 1, inventoryClass: 1}。目标:为特定帐户列表(手动为帐户定义家庭区域)进行区域分配。例如帐户

[1, 294, 906847 ...] -> zone "A", 
[7879079, 852 ...] -> zone "B",
[3457, 45...] -> zone "C" 
Run Code Online (Sandbox Code Playgroud)

库存项目文档本身不包含区域映射的显式值(仅隐式关系accountId-> 区域映射)。这意味着每个accontId数据必须通过添加相应的标签范围与sh.addShardTag()例如

sh.addTagRange(
  "inventory",
  { "accountId" : 1, "inventoryClass" : MinKey },
  { "accountId" : 1, "inventoryClass" : MaxKey },
  "A")
....
sh.addTagRange(
  "inventory",
  { "accountId" : 294, "inventoryClass" : MinKey },
  { "accountId" : 294, "inventoryClass" : MaxKey },
  "A")
Run Code Online (Sandbox Code Playgroud)

这样每个 1 个帐户就有 1 个标签范围。它导致标签范围==帐户计数

小智 0

我认为拥有如此多的标签范围将导致配置服务器和 Mongos 实例的负载增加。相反,根据文档 中的示例zone,您可以在文档中包含字段(accountsinventory),并将其作为前缀包含在分片键中。当然,这会导致重复,并且当“主区域”发生变化时,您可能需要处理文档迁移,但也许事实并非如此。此外,应用程序代码修改文档字段比修改标签范围更易于管理。