【发布时间】:2020-03-09 13:01:28
【问题描述】:
我已经为 MongoDB 配置了 Sharding。我的设置如下所示:
- 3 个配置服务器
- 2 个 Shard 服务器(Shard1 和 Shard2),每个都有 3 个 ReplicaSet 节点
- 1 个 mongos 实例
我当前的集合具有主分片 Shard 1。我的所有数据现在都存储在 Shard 1 上。我是否正确,一旦我的 Shard 1 变满,数据就会存储在 Shard 2 上?
我现在正在测试故障转移方案,当我的 Shard 1 服务器关闭时,数据应该转到 Shard 2 但它没有发生?它应该会自动重新连接到 Shard 1 对吧?
【问题讨论】:
-
听起来你分片错误。除非您选择了错误的分片键,否则两个分片应始终具有大致相同的数据量。错误的分片键,例如不断增加的时间戳,将首先填充分片 1,据我所知,除非达到分片键的特定值,否则永远不会填充分片 2,这可能永远不会发生。将在随机生成的密钥上进行正确的分片,例如用户 ID。这样一来,如果有 1000 个用户,大约 500 个用户最终会在 Shard 1 上,其余的在 Shard 2 上。
-
分片不适用于故障转移。这就是复制品的用途。分片用于扩展。
-
好的,我选择了一些不断增加的 ID 作为分片键,看起来只有一个分片获取所有数据。因此,如果我选择其他分片键,例如 someID + randomString,它的行为应该会有所不同,对吧?
-
如果
someID连续增加“00001”、“00002”并且this+randromString 会产生“00001-scnkg”、“00002-qeiov”,那么您仍然会遇到问题。如果您使用someID的散列,您将获得相当均匀的分片平衡。阅读docs.mongodb.com/manual/core/sharding-shard-key/… 和docs.mongodb.com/manual/sharding/#sharding-strategy -
阅读文档似乎 MongoDB 正在自动散列密钥。看起来你遇到的事情不应该发生。多么奇怪。除非你使用远程分片?
标签: mongodb replication sharding