在分片群集中,您可以基于shard key创建分片数据区域。您可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在平衡的集群中,MongoDB 仅将区域覆盖的块迁移到与该区域关联的碎片。
小费
在版本4.0.3中更改:通过在分片一个空的或不存在的集合之前定义区域和区域范围,分片收集操作将为定义的区域范围以及所有其他覆盖整个区域范围的块创建块。分片键值,并根据区域范围执行初始块分配。块的这种初始创建和分配允许更快地设置分区分片。在初始分配之后,平衡器将管理后续的块分配。
有关示例,请参见为空集合或不存在的集合预定义区域和区域范围。
以下是一些按地理区域细分数据的用例示例:
下图说明了分片群集,该分片群集使用基于地理的区域来管理和满足数据分段要求。
金融聊天应用程序记录消息,跟踪原始用户的国家。应用程序将日志存储chat
在messages
集合下的数据库中。聊天包含必须按国家/地区细分的信息,以使该国家/地区的本地服务器为该国家/地区的用户提供读写请求。可以将一组国家/地区分配给同一区域,以便共享资源。
该应用程序当前在美国,英国和德国拥有用户。该
country
字段表示基于其ISO 3166-1 Alpha-2
两字符国家/地区代码的用户所在的国家
/地区。
以下文档代表三个聊天消息的部分视图:
该messages
集合使用复合索引的碎片关键。{ country : 1, userid : 1 }
country
每个文档中的字段都允许为每个不同的国家/地区值创建区域。
此应用程序每个数据中心需要一个区域。
EU
-欧洲数据中心部署在该数据中心上的碎片已分配给该EU
区域。
对于使用EU
数据中心进行本地读写的每个国家/地区,请使用以下内容为区域创建区域范围EU
:
{ "country" : <country>, "userid" : MinKey }
{ "country" : <country>, "userid" : MaxKey }
NA
-北美数据中心部署在该数据中心上的碎片已分配给该NA
区域。
对于使用NA
数据中心进行本地读写的每个国家/地区,请使用以下内容为区域创建区域范围NA
:
{ "country" : <country>, "userid" : MinKey }
{ "country" : <country>, "userid" : MaxKey }
对于区域,如果插入或更新的文档与配置的区域匹配,则只能将其写入该区域内部的分片中。
MongoDB可以将与配置的区域不匹配的文档写入集群中的任何分片。
注意
上述行为要求群集处于稳定状态,且没有块违反配置的区域。有关更多信息,请参见平衡器的以下部分。
所述平衡器 迁移组块到相应的碎片尊重任何配置的区域。在迁移之前,碎片可能包含违反已配置区域的块。平衡完成后,分片应仅包含范围不违反其指定区域的块。
添加或删除区域或区域范围可能导致块迁移。根据数据集的大小以及区域或区域范围影响的块数,这些迁移可能会影响群集性能。考虑在特定的计划窗口内运行平衡器。有关如何设置调度窗口的教程,请参阅调度平衡窗口。
对于使用基于角色的访问控制运行的分片群集,至少要clusterManager
以具有admin
数据库角色的用户身份进行身份验证。
您必须连接到mongos
以创建区域和区域范围。您不能直接连接到创建区域或区域范围的
碎片。
为了减少对性能的影响,可以在集合上禁用平衡器,以确保在配置新区域时不进行任何迁移。
使用sh.disableBalancing()
(指定集合的名称空间)停止平衡器。
使用sh.isBalancerRunning()
检查,如果平衡器进程当前正在运行。等到当前的所有平衡操作完成后再继续。
对于其中的分片键值,定义一个分片键范围,并使用
方法将其关联到区域。此方法要求:country : US
NA
sh.addTagRange()
对于其中的分片键值,定义一个分片键范围,并使用
方法将其关联到区域。此方法要求:country : UK
EU
sh.addTagRange()
对于其中的分片键值,定义一个分片键范围,并使用
方法将其关联到区域。此方法要求:country : DE
EU
sh.addTagRange()
该MinKey
和MaxKey
值是为比较保留的特殊价值。MinKey
总是比所有其他可能的值都低,而MaxKey
总是比其他所有可能的值都高。配置的范围可以捕获每个用户的每个用户device
。
双方并分配给区域。这会将任何文档与或作为EU数据中心的值
相关联。country : UK
country : DE
EU
UK
DE
country
如果在之前的步骤中禁用了平衡器,请在此过程完成后重新启用平衡器以重新平衡群集。
使用sh.enableBalancing()
(指定集合的名称空间)启动平衡器。
使用sh.isBalancerRunning()
检查,如果平衡器进程当前正在运行。
下次平衡器运行时,它将在必要时 拆分块,并 在尊重已配置区域的情况下跨碎片迁移块。
平衡完成后,NA
区域中的碎片 只能包含带有的文档,而区域中的碎片只能包含带有或的文档。country : NA
EU
country : UK
country : DE
与用于值A文档country
以外NA
,UK
或
DE
可驻留在集群中的任何碎片。
您可以通过运行确认块分布sh.status()
。
该应用程序需要以下更新:
country : UK
UK
EU
country : MX
NA
执行以下过程以更新区域范围。
为了减少对性能的影响,可以在集合上禁用平衡器,以确保在配置新区域或删除旧区域时不进行任何迁移。
使用sh.disableBalancing()
(指定集合的名称空间)停止平衡器
使用sh.isBalancerRunning()
检查,如果平衡器进程当前正在运行。等到当前的所有平衡操作完成后再继续。
对于其中的分片键值,定义一个分片键范围,并使用
方法将其关联到区域。此方法要求:country : UK
UK
sh.addTagRange()
对于其中的分片键值,定义一个分片键范围,并使用
方法将其关联到区域。此方法要求:country : MX
NA
sh.addTagRange()
该MinKey
和MaxKey
值是为比较保留的特殊值。MinKey
总是比所有其他可能的值都低,而MaxKey
总是比其他所有可能的值都高。这样可确保两个范围捕获的整个可能值空间creation_date
。
如果在之前的步骤中禁用了平衡器,请在此过程完成后重新启用平衡器以重新平衡群集。
使用sh.enableBalancing()
(指定集合的名称空间)启动平衡器
使用sh.isBalancerRunning()
检查,如果平衡器进程当前正在运行。
下次平衡器运行时,它将在必要时 拆分块,并 在尊重已配置区域的情况下跨碎片迁移块。
在进行平衡之前,EU
区域中的碎片仅包含或中的文档。带有的文档可以存储在分片群集中的任何分片上。country : DE
country : UK
country :
MX
平衡后,EU
区域中的碎片仅应在包含文档,而区域中的碎片仅应在包含文档。此外,区域中的分片应仅包含或中的文档。country : DE
UK
country : UK
NA
country : US
country : MX
与用于值A文档country
以外NA
,MX
,UK
,或DE
可驻留在集群中的任何碎片。
您可以通过运行确认块分布sh.status()
。