我在我的一台物理服务器上安装了mongodb副本集,一个主节点,一个从节点,一个仲裁节点,主节点host:124.222.211.100:27017,从节点:124.222.211.100:27017,仲裁节点:124.222.211.100:27019,我把项目的应用服务也部署到了这个一台的物理主机上,mongo连接地址写的 mongodb://localhost:27017,localhost:27018/aaaa?replicaSet=rs000,项目都能正常的运行,当访问的数据量大的时候,发现比较慢,经过排查,使用iftop发现了问题的所在,尽管我使用127.0.0.1去连接的主节点,但是所有的请求都会转发到外网ip,在通过外网ip访问到本机的mongo主节点,这是问什么?
若我的副本集的host都换成内网ip或者127.0.0.1的话,就不会出现这样的问题,这是为什么,为什么会通过外网ip访问出去呢??
以下为热心网友提供的参考意见
这个问题可能是由于MongoDB的复制集配置导致的。当你在MongoDB的复制集中配置了多个成员(包括主节点和从节点),并且这些成员都在同一台物理机上时,MongoDB会自动将这些成员的host设置为该物理机的外网IP。这是因为MongoDB需要知道如何在网络中定位这些成员。
当你在你的应用程序中使用mongodb://localhost:27017,localhost:27018/aaaa?replicaSet=rs000
这样的连接字符串连接到MongoDB时,MongoDB会将localhost解析为该物理机的外网IP,然后通过外网IP发送请求。这就是为什么你会看到所有的请求都会转发到外网IP的原因。
如果你想避免这种情况,你应该在你的应用程序中使用内网IP或者127.0.0.1来连接MongoDB。这样,MongoDB就会知道这些成员都在本地,不需要通过网络发送请求。
另外,你也可以考虑在你的MongoDB复制集配置中显式地指定每个成员的host。例如,你可以将主节点的host设置为127.0.0.1:27017,将从节点的host设置为127.0.0.1:27018,将仲裁节点的host设置为127.0.0.1:27019。这样,MongoDB就会知道这些成员都在本地,不需要通过网络发送请求。
以下为热心网友提供的参考意见
楼主你好,看了你的问题,这可能是由于你的操作系统网络配置引起的。当你使用localhost或127.0.0.1连接本地的MongoDB主节点时,正常情况下是不会经过外网访问的,而是直接在本机内部进行通信的。如果你的操作系统网络配置中存在某种问题,比如默认的路由设置不正确,或者存在防火墙规则等,可能会导致本地访问转发到外网IP地址。这样的情况下,你的请求会从本地转发到外网IP再返回本地,导致访问速度变慢。
为了解决这个问题,你可以检查操作系统的网络配置,确保默认的路由设置正确,没有其他网络配置冲突。
还有就是要确保操作系统的防火墙配置允许本地访问MongoDB的端口,可以尝试关闭防火墙进行测试。
以下为热心网友提供的参考意见
这种情况可能是由于网络配置或MongoDB的绑定IP设置引起的。当您将MongoDB副本集主节点的连接地址设置为外网IP时,即使通过”localhost”或”127.0.0.1″连接,请求也会被转发到外网IP。这可能是因为MongoDB默认监听所有可用的网络接口,包括内部和外部接口。
以下是一些可能导致此问题的原因和解决方案:
-
网络配置问题:请确保您的物理服务器正确配置了网络路由和防火墙规则,以便允许内部流量在同一台机器上进行通信,而不需要经过外部网络。
-
MongoDB绑定IP设置:查看MongoDB的配置文件(通常是mongod.conf)中是否设置了bind_ip选项。如果设置了bind_ip选项,并且指定了一个外网IP,则会限制MongoDB只能通过该IP进行连接。尝试将bind_ip设置为内网IP(如局域网IP)或使用通配符0.0.0.0来监听所有接口。
-
修改应用程序连接地址:将应用程序连接地址更改为使用内网IP或127.0.0.1,以确保请求直接在本机处理,而不需要转发到外网。