Mongo副本集在防火墙之后

分享于 

4分钟阅读

互联网

 

问题:

假设你运行的是当前版本( 3.2 ) 作为网络中的副本集,该副本集由 3个节点组成:


mongo1.local


mongo2.local


mongoarbiter.local



现在这些节点应该通过 public 互联网( 通过FW限制) 提供。 在防火墙和一些有效的记录中,mongo1和mongo2将获得 VIP:


mongo1.example.com


mongo2.example.com



未公开仲裁程序。

如果你通过连接字符串传递外部DNS名称,那么一些客户端实现就可以正常工作了。 但是其他( Java ) 将无法连接,因为副本集只知道它的内部名称。 客户端将解析rs提供的节点列表,注意它已经连接到的externel NAME 不在列表中,并且失败:


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 之外,还有什么解决方法?

以下是js客户机库的技巧,但看起来有点脏:


replSet.connectWithNoPrimary




回答 1:

Official驱动程序实现了一个服务器发现和监视( SDAM ) 插件规范,它可以在mongodb/specifications 存储库(。 SDAM规范更详细地介绍了驱动程序的预期行为和原理。

当前期望是客户端总是使用副本集配置插件中的主机名列表,而不是连接字符串中的种子列表提供程序。 实现这里目的的主要动机是基于协议集配置( 包括主机名和端口) 启用自动故障转移和重构。

除了在客户机系统上使用/etc/hosts 之外,还有什么解决方法?

如果不需要故障转移,你可以连接到单个服务器,而不是使用副本集连接。 独立/直接连接不应实现任何服务器发现。

但是,如果你连接到独立服务器之外,目前除了将主机的主机名解析为 MATCH,或者扩展你的网络外围( 例如其他服务器) 外,没有任何解决办法。 使用 VPN )。

有关 upvote/watch的相关功能建议是: :支持不同的网络/网卡,用于客户端&复制业务。 这可以允许从客户端连接中分离副本集的内部网络通信。


回答 2:

如果你设置了切分集群,就可以直接连接到的mongos进程,并考虑复制集中节点的内部/外部主机名称。

如果你将replicaset部分设置为分片集群,那么所有客户机连接都应该通过一个 mongos服务器服务器。 mongos维护自己与副本集中节点的连接;客户端只连接到 mongos,而不需要使用它喜欢的任何 NAME ;它不需要在内部使用它所使用的主机名。

因这里,即使不希望使用分片进行数据缩放,也可以能有助于避免由外部主机名寻址副本集。



rep  SET  repl  mongo  防火墙