我很难理解文档: https://docs.mongodb.com/manual/core/zone-sharding/
文档指出:“区域不能共享范围,也不能具有重叠范围。”
但是,在示例中:“碎片Alpha和Beta具有A区域。碎片Beta也具有B区域”
据我了解,A区和B区共享(或重叠)碎片Alpha。为什么它与提到的规则不冲突?
答案 0 :(得分:2)
“重叠范围”是指分片键。例如。在给定的示例中,区域A覆盖键[1,10),区域B覆盖键[10,20)。重叠的一个例子是覆盖键[5,20)的B区。
没有要求,分片仅包含属于一个区域的块。该文档说(重点是我的):
您可以将每个区域与群集中的一个或多个分片关联。
这种关联是可选的。
答案 1 :(得分:1)
是的,文档有点混乱。
我会试着用一个例子来解释。
第一阶段
假设您正在管理一所学校。你有几个不同学科的学生。您已使用 5 个分片进行分片设置。最初数据会平均分配给他们。
但假设学生不在同一个学习设施中。但地理位置位于地球的不同部分。现在目前的分片并没有为所有人提供最佳体验。因此,我们可能希望在他们的研究中心附近为他们托管数据。
第二阶段
因此,我们在学习中心附近提出了另一个 mongodb 实例。并将区域分配给这些实例。您也可以将多个区域分配给同一个分片。
尚未进行重新平衡,我们刚刚为分片分配了区域。
第三阶段
在这一步中,我们将把 package main
import (
"fmt"
"strings"
)
func LastRuneIndex(s, substr string) (int, error) {
byteIndex := strings.LastIndex(s, substr)
if byteIndex < 0 {
return byteIndex, nil
}
reader := strings.NewReader(s)
count := 0
for byteIndex > 0 {
_, bytes, err := reader.ReadRune()
if err != nil {
return 0, err
}
byteIndex = byteIndex - bytes
count += 1
}
return count, nil
}
func main() {
s := "foo 日本 foo!"
count, err := LastRuneIndex(s, "foo")
fmt.Println(count, err)
// outputs:
// 7 <nil>
}
(表示所有数学文档)分配给 Maths min-max keys
(对于其他科目也是如此)。一旦我们启用重新平衡,第 1 步将移至第 3 步。数据将按照您的要求进行分配。
现在重温文档中的内容
<块引用>您可以将每个区域与集群中的一个或多个分片相关联。`
示例:ZONE_Maths、ZONE_Physics 分布在 1 个以上的分片上。
<块引用>一个分片可以关联任意数量的区域。
示例:Stard4 具有多个区域的数据。
<块引用>在平衡集群中,MongoDB 仅将区域覆盖的块迁移到与区域关联的分片
平衡完成后,集群将达到您定义的状态。
<块引用>区域不能共享范围,也不能有重叠范围。
区域必须是相互排斥的。否则 Mongo 将无法决定将数据放在哪里。
注意 stage1 的分片 1 与 stage3 的分片 1 没有任何关系。一旦我们理解了这一点,事情就会变得更加清晰。
参考这个doc 一旦你看到我的解释,我希望它能让你明白。