假设我有3台机器。称他们为A,B,C。我打开了mongo复制。所以假设A是主要的。 B和C是次要的。
但是现在我想对数据库进行分片。但我相信所有的写作仍然是A,因为A是主要的。真的吗 ?有人可以解释分片的必要性以及它如何提高写入吞吐量吗?
我知道mongos会找到合适的碎片。但是写入必须在主要部分完成。其他机器B,C将随之而来。我错过了什么。
我也不明白这句话:“每个碎片都是副本集”。除非它也是主要的,否则该分片是不完整的。
答案 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无论如何都不必写入主节点,它可以自由地写入您的查询允许的分片群集的任何部分。