0

假设我有 3 台机器。称他们为 A、B、C。我打开了 mongo 复制。所以假设A是主要的。B 和 C 是次要的。

但现在我想对数据库进行分片。但我相信所有的写入仍然是 A,因为 A 是主要的。真的吗 ?有人可以解释分片的需求以及它如何增加写入吞吐量吗?

我知道 mongos 会找到正确的分片。但是必须在主节点上完成写入。其余机器 B、C 将跟随。我是不是错过了什么。

我也不明白这句话:“每个分片都是一个副本集”。除非它也是主分片,否则分片是不完整的。

4

1 回答 1

1

分片与复制完全不同。

我现在将尝试解释你的困惑,而不会让你更加困惑。

当考虑分片时,副本集是分片信息的复制范围。

因此,这意味着集群中的每个分片实际上都是一个副本集,它本身包含一个范围(可以保存不同的范围块,但这是另一个主题),并在该自包含副本集的成员之间复制自身。

想象一下,一个分片将是它自己的副本集的主分片,它有自己的一组成员,什么不是。这就是每个分片都是一个副本集的意思。

因此,每个分片将有自己的自包含主节点,但同时,如果副本集持有的范围与客户端发送的分片键目标匹配,则每个分片的每个副本集的每个主节点都可以从 mongos 接收写入.

我希望这是有道理的。

编辑

这篇文章可能会有所帮助:http ://www.kchodorow.com/blog/2010/08/09/sharding-and-replica-sets-illustrated/

这适用于这里吗?假设我想从 2 个 mongod 实例中确认写入。那可能吗 ?我仍然难以理解。你能用一个例子解释一下吗?

好的,让我们举个例子。您有 3 个分片,实际上是 3 个副本集,称为 rs1 和 rs2 和 rs3,每个由 3 个节点(1 个主节点和 2 个辅助节点)组成。如果您希望副本集的 2 个成员确认写入,那么您可以像往常一样执行此操作:

db.users.insert({username:'sammaye'},{w:2})

分片键在哪里username

发送此查询将mongos寻找实际上是副本集的正确分片(节点),连接到该副本集,然后正常执行插入。

例如, rs2 实际上包含所有以字母开头的用户名范围m-s。mongos 将使用其内部的 rs2 映射(在连接到副本集时获得)以及您的写入/读取关注点来判断要读取和写入的成员。

标签也同样适用。

如果 mongos 找到一个不是“主要”的分片(如在复制中),写入仍然在辅助节点中执行吗?

您在这里仍然感到困惑,没有像复制中那样的“主”服务器,分片数据库有一个种子(有时称为主)服务器,但这完全是另一回事。无论如何,mongos 不必写入主节点,它可以自由写入查询允许的分片集群的任何部分。

于 2013-07-02T15:00:56.003 回答