Mongo与复制的混淆打开了

时间:2013-07-02 14:30:59

标签: mongodb replication sharding

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

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

我知道mongos会找到合适的碎片。但是写入必须在主要部分完成。其他机器B,C将随之而来。我错过了什么。

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

1 个答案:

答案 0 :(得分: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无论如何都不必写入主节点,它可以自由地写入您的查询允许的分片群集的任何部分。