8

似乎MongoClientMongoReplicaSetClient都可以连接到 mongo 副本集。事实上,它们的文档页面几乎相同——相同的选项、相同的方法等——除了后者的构造函数需要我指定一个副本集。

在这两种情况下,我们都可以指定读取偏好。在这两种情况下,如果发生降级,我们必须处理 AutoReconnect 异常。

所以我的问题是:

  1. 为什么一个人会使用一个而不是另一个,因为一个人可以对两者执行完全相同的操作?

  2. 两者都可以执行二次读取,对吗?文档说 ReplicaSetClient 的优点是我们可以进行二次读取,但显然两者都支持它们。

  3. 文档说 ReplicaSetClient 具有“副本集健康监控”功能。这到底是什么意思呢?有没有我可以调用的新方法告诉我一个 replset 的健康状况,而我不能用 MongoClient 做这些?

  4. 理论上MongoReplicaSetClient将连接到 replset 的所有成员,而不仅仅是一个。这是错误的:您可以删除或省略连接字符串中的任何服务器,并且 MongoClient 和 MongoReplicaSetClient 仍然能够连接。我错过了什么吗?

4

1 回答 1

10

这是一个令人困惑的 API 选择,我们在 PyMongo 2.x 中感到遗憾。我们将在 2015 年 4 月将所有客户端类合并到 PyMongo 3 中的 MongoClient 中:

http://emptysqua.re/blog/good-idea-at-the-time-pymongo-mongoreplisetclient/

同时:

  1. 当您计划连接到整个副本集时,请使用 MongoReplicaSetClient。MongoClient 只连接到一个成员。
  2. 单个 MongoReplicaSetClient 可用于执行主要或次要读取,以及具有读取偏好的更复杂的决策,请参阅我关于该主题的博客文章。MongoClient 将连接到副本集的一个成员(主节点)并始终从中读取,除非您使用 MongoClient 直接连接到辅助节点,在这种情况下,它将始终从该辅助节点读取。
  3. MongoReplicaSetClient 使用后台线程监视集合的健康状况,该线程定期检查所有成员。客户端跟踪成员是否启动,跟踪他们的 ping 时间,并在添加成员时通知。这将减少您在不稳定的网络或副本集的配置更改时看到的异常数量,并允许客户端正确实现读取首选项。
  4. MongoReplicaSetClient 实际上连接到所有成员,而 MongoClient 只连接到一个成员。MongoReplicaSetClient 尝试连接到连接字符串中列出的每个成员;一旦它连接到一个成员,它就会要求该成员提供所有其他成员的列表。从这一点开始,它会忽略您的连接字符串并使用它从连接到的成员那里获得的列表。
于 2013-11-05T17:30:01.927 回答