假设您将MongoDB的当前版本(3.2)作为包含3个节点的networking中的副本集运行:
mongo1.local mongo2.local mongoarbiter.local
现在这些节点应该可以通过公共互联网(通过FW限制)。 mongo1和mongo2将在防火墙上获得一个VIP和一些有效的A-Records:
mongo1.example.com mongo2.example.com
裁决者没有暴露。
现在,如果您通过连接string传递外部DNS名称,某些客户端实现工作正常(python)。 但其他人(Java)将无法连接,因为副本集只知道其内部名称。 客户端将parsingrs提供的节点列表,注意它连接的外部名称不在列表中,并且失败:
Monitor thread successfully connected to server with description ServerDescription{address=mongo1.example.com:27017, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 0, 14]}, minWireVersion=0, maxWireVersion=3, maxDocumentSize=16777216, roundTripTimeNanos=5305689, setName='mongo-rs', canonicalAddress=mongo1.local:27017, hosts=[mongo2.local:27017, mongo1.local:27017], passives=[], arbiters=[mongo3.local:27017], primary='mongo1.local:27017', tagSet=TagSet{[]}, electionId=5821da77ccc118202cd2b75d, setVersion=3}
除了搞乱客户机系统上的/ etc / hosts之外,有没有其他解决scheme?
顺便说一句:这与js客户端库的技巧,但看起来有点肮脏:
replSet.connectWithNoPrimary
官方的MongoDB驱动程序实现了一个服务器发现和监测(SDAM)规范,该规范在GitHub的mongodb/specifications存储库中提供 。 SDAM规范更详细地介绍了驾驶员的预期行为和理由。
目前的预期是, 客户端将总是使用副本集configuration中列出的主机名 ,而不是连接string中提供的种子列表。 这样做的主要动机是基于同意的副本集configuration(包括主机名和端口)启用自动故障转移和重新configuration。
除了搞乱客户机系统上的/ etc / hosts之外,有没有其他解决scheme?
如果您不需要故障转移,则可以连接到单个服务器而不是使用副本集连接。 独立/直接连接不应该实现任何服务器发现。
但是,如果要连接到除独立服务器以外的其他任何设备,则在摆脱主机名parsing以匹配副本集configuration或扩展networking外围(例如,使用VPN)之外,目前没有任何解决方法。
upvote / watch的相关functionbuild议是: SERVER-1889:支持客户端和复制stream量的不同networking/ nics 。 这可能允许从客户端连接中分离副本集的内部networking通信。
如果你设置了一个分片集群,那么你可以直接连接到mongos进程,让我们担心副本集合中节点的内部/外部主机名称。
如果您将复制组作为分片群集的一部分,则所有客户端连接都应通过mongos服务器。 mongos与副本集中的节点保持自己的连接(可以使用内部名称mongo1.local等)。 客户端只连接到mongos,并允许使用任何喜欢的名称 – 它不必与内部使用的主机名相匹配。
因此,即使您不希望使用分片进行数据缩放,对于避免由外部主机名设置复本集的问题,您可能也会觉得有用吗?