【发布时间】:2020-03-21 01:15:25
【问题描述】:
问题在于,即使我在连接字符串中只针对我的副本集的一个节点,mongo-go-driver 总是希望发现并连接其他节点。
我找到了一个解决方案here,基本上说我应该在连接字符串中添加connect 选项。
mongodb://host:27017/authDb?connect=direct
我的问题是:这种做法是好是坏,为什么 mongo 没有记录在案,这个选项还有其他可用值吗?
【问题讨论】:
问题在于,即使我在连接字符串中只针对我的副本集的一个节点,mongo-go-driver 总是希望发现并连接其他节点。
我找到了一个解决方案here,基本上说我应该在连接字符串中添加connect 选项。
mongodb://host:27017/authDb?connect=direct
我的问题是:这种做法是好是坏,为什么 mongo 没有记录在案,这个选项还有其他可用值吗?
【问题讨论】:
该选项仅适用于 Go 驱动程序。对于所有其他驱动程序,它无法识别,因此未将其记录为通用连接字符串选项。
Go 驱动程序的文档在 https://godoc.org/go.mongodb.org/mongo-driver/mongo#example-Connect--Direct
【讨论】:
directConnection 选项的支持。
这种做法是好是坏,为什么 mongo 没有记录在案,这个选项还有其他可用的值吗?
正如已接受的答案中所指出的,这已记录在驱动程序文档中。现在讨论问题的另一部分。
一般来说,在副本集上下文中,您希望连接到拓扑而不是直接连接到特定的副本集成员,但出于管理目的除外。复制旨在提供冗余,并且在故障转移的情况下不建议直接连接到一个成员,即主节点。
所有官方 MongoDB 驱动程序都遵循MongoDB Specifications。关于直接连接,要求当前是server-discovery-and-monitoring.rst#general-requirements:
直接连接:客户端必须能够连接到单个 任何类型的服务器。这包括查询隐藏的副本集成员, 并连接到未初始化的成员(请参阅 RSGhost)以运行 “replSetInitiate”。不必设置读取首选项 连接到辅助。当然,二级会拒绝所有 使用 PRIMARY 读取首选项完成的操作,因为 slaveOk 位未设置,但初始连接本身成功。驱动程序 可以允许直接连接到仲裁器(例如,运行 行政命令)。
它只指定它必须能够这样做,而不是如何。目前支持direct选项方法的不只是MongoDB Go驱动,还有.NET/C#和Ruby。
目前有一个open PR 用于规范统一行为。未来,所有驱动程序都将采用相同的方式建立直连。
【讨论】: