在分片群集中,您可以基于shard key创建分片数据区域。您可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在平衡的集群中,MongoDB 仅将区域覆盖的块迁移到与该区域关联的碎片。
小费
在版本4.0.3中更改:通过在分片一个空的或不存在的集合之前定义区域和区域范围,分片收集操作将为定义的区域范围以及所有其他覆盖整个区域范围的块创建块。分片键值,并根据区域范围执行初始块分配。块的这种初始创建和分配允许更快地设置分区分片。在初始分配之后,平衡器将管理后续的块分配。
有关示例,请参见为空集合或不存在的集合预定义区域和区域范围。
本教程向您展示如何使用Zones分割数据。
考虑以下可能需要按应用程序或客户细分数据的方案:
该图说明了一个分片群集,该群集使用区域根据应用程序或客户对数据进行分段。这允许将数据隔离到特定的分片。此外,每个分片都可以分配特定的硬件,以适合存储在该分片上的数据的性能要求。
应用程序跟踪用户的分数以及client
字段,将分数存储在集合gamify
下的数据库中users
。每个可能的值都client
需要有自己的区域,才能进行数据分段。它还允许管理员针对与a相关的每个分片优化硬件,以client
提高性能和成本。
以下文档代表了两个用户的部分视图:
该users
集合使用复合索引的碎片关键。{ client : 1, userid : 1 }
client
每个文档中的字段均允许为每个不同的客户值创建区域。
对于此应用程序,有两个客户端区域。
client : robot
client : fruitos
对于区域,如果插入或更新的文档与配置的区域匹配,则只能将其写入该区域内的分片。
MongoDB可以将与配置的区域不匹配的文档写入集群中的任何分片。
注意
上述行为要求群集处于稳定状态,且没有块违反配置的区域。有关更多信息,请参见平衡器的以下部分。
所述平衡器 迁移组块到相应的碎片尊重任何配置的区域。在迁移之前,碎片可能包含违反已配置区域的块。平衡完成后,分片应仅包含范围不违反其指定区域的块。
添加或删除区域或区域范围可能导致块迁移。根据数据集的大小以及区域或区域范围影响的块数,这些迁移可能会影响群集性能。考虑在特定的计划窗口内运行平衡器。有关如何设置调度窗口的教程,请参阅调度平衡窗口。
对于使用基于角色的访问控制运行的分片群集,至少要clusterManager
以具有admin
数据库角色的用户身份进行身份验证。
您必须连接到mongos
与目标分片群集相关联的对象
才能继续。您不能直接连接到创建区域或区域范围的碎片。
必须在集合上禁用平衡器,以确保在配置新区域时不进行任何迁移。
使用sh.disableBalancing()
(指定集合的名称空间)停止平衡器。
使用sh.isBalancerRunning()
检查,如果平衡器进程当前正在运行。等到当前的所有平衡操作完成后再继续。
添加shard0000
到robot
区域。
添加shard0001
到robot
区域。
添加shard0002
到fruitos
区域。
添加shard0003
到fruitos
区域。
运行sh.status()
以查看为分片群集配置的区域。
定义robot
客户端的范围,并robot
使用sh.addTagRange()
方法将其关联到区域。
此方法要求:
定义fruitos
客户端的范围,并fruitos
使用sh.addTagRange()
方法将其关联到
区域。
此方法要求:
该MinKey
和MaxKey
值是为比较保留的特殊值。MinKey
总是比所有其他可能的值都低,而MaxKey
总是比其他所有可能的值都高。配置的范围可以捕获每个用户的每个用户client
。
重新启用平衡器以重新平衡集群。
使用sh.enableBalancing()
(指定集合的名称空间)启动平衡器。
使用sh.isBalancerRunning()
检查,如果平衡器进程当前正在运行。
平衡器下一次运行时,它将 尊重已配置区域在整个碎片上拆分和 迁移块。
平衡完成后,robot
区域中的碎片仅包含带有的文档,而区域中的碎片仅包含带有的文档。client : robot
fruitos
client : fruitos
您可以通过运行确认块分布sh.status()
。