运行具有 1 个主副本和 2 个副副本的副本集,我想知道为什么 READ 也在主副本上完成。主要的不应该主要做 WRITE 而次要的可以分担 READ 负载吗?!
我正在为 mongodb 使用 PHP 驱动程序并发送副本集的详细信息。PHP 从辅助节点运行,在脚本中,初始连接转到辅助节点本身,即那里的本地主机。
php 文档说,驱动程序一旦连接到副本集的任何成员,就会自行找到主要和次要的,无论是主要的还是次要的。
检查负载和日志后,我发现目前我可怜的主服务器必须处理所有的读取,而从服务器很无聊。
我不确定您阅读了哪些文档,如果我在这里重复任何内容,我深表歉意。
为了将读取分发到辅助节点,大多数驱动程序允许您为当前会话设置一个 readPreference 值。客户端在每个连接的基础上设置读取首选项。使用 slaveOk,驱动程序应该总是向辅助设备发送查询,如果它们可用的话。
将读取分配给辅助节点需要使用 ReplicaSetConnection 和 ReadPreference.SECONDARY。
有关详细信息和此链接,请参阅“rs.slaveOk()” 。
在 mongo shell 中,要启用辅助读取,请发出以下命令:
它的 PHP 文档在这里,但我猜这可能是您所指的文档。
仅供参考,这是 MongoDB Google Group 上关于它的旧讨论。
如果您仍有问题,我建议您使用 MongoDB Google Group 并提供一些进一步的信息,例如您正在使用的 MongoDB 版本、PHP 驱动程序的版本、您的日志文件、rs.conf() 和rs.状态()。
仅供参考,您必须小心读取缩放,因为向辅助节点发送过多的读取通常会导致辅助节点落后于主要节点并变得陈旧,因此需要完全重新同步。